LoginSignup
1
1

More than 3 years have passed since last update.

アプリのコンポーネント(サービス, ブロードキャスト レシーバ)について

Last updated at Posted at 2019-12-04

概要

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)
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1