Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@ovama-koffee

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

More than 1 year has passed since last update.

概要

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
Help us understand the problem. What is going on with this article?
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
ovama-koffee
関西風エンジニア すぅきぃ〜❤️ ネイティブ・フロント・サーバーレス Kotlin/TypeScript/Go/Firebase/DivOps/Serverless
arsagapartners
最高品質を最速で。 業務未経験でも最速最高の成長を!

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?