#概要
androidの開発を始めた頃につまずいた箇所をAdevent Calenderを機に振りかえりたいと思い記事にしました。
サービス
サービスの概要
サービスはバックグラウンドで動作するクラスで、バックグラウンドでのデータダウンロードや音楽の再生などに使われます。
過去のアプリではバックグラウンドで歩数を取得しごにょごにょするなんてこともサービスでしてました。
サービスには以下の3種類があります。
- フォアグラウンドサービス
- バックグラウンドサービス
- バインドされたサービス
例:サービス起動中に通知を表示する
AndroidManifest.xml
<manifest>
...
// 追加
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<application
...
>
...
// 追加
<service android:name=".service.ForegroundService" />
</application>
</manifest>
ForegroundService.kt
class ForegroundService : Service() {
// `bindService`で呼び出した場合呼ばれる
override fun onBind(intent: Intent?): IBinder? {
return null
}
// サービスで実行する処理
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
/* 通知の作成など ... */
// `startForeground`をサービス起動から5秒以内に呼び出さないといけない
startForeground(notificationId, builder.build())
return START_NOT_STICKY
}
}
MainActivity.kt
// 起動
val intent = Intent(this, ForegroundService::class.java)
if (Build.VERSION.SDK_INT >= 26) {
startForegroundService(intent)
} else {
startService(intent)
}
MainActivity.kt
// 停止
val intent = Intent(this, ForegroundService::class.java)
stopService(intent)
ブロードキャストレシーバ
システムイベントの受信や位置情報の変更や機内モードへの変更を検知したりできます。
例: 機内モードのon/offを検知
AndroidManifest.xml
<manifest>
...
<application
...
>
...
// 追加
<receiver android:name=".AirplaneModeChangedReceiver">
<intent-filter>
<action android:name="android.intent.action.AIRPLANE_MODE" />
</intent-filter>
</receiver>
</application>
</manifest>
AirplaneModeChangedReceiver.kt
class AirplaneModeChangedReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (Intent.ACTION_AIRPLANE_MODE_CHANGED == intent?.action) {
val toast = Toast.makeText(context, "AirplaneMode", Toast.LENGTH_SHORT)
toast.show()
}
}
}
MainActivity.kt
// 登録
val receiver = AirplaneModeChangedReceiver()
val filter = IntentFilter().apply {
addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED)
}
registerReceiver(receiver, filter)