Help us understand the problem. What is going on with this article?

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

概要

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)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away