こんにちは!
一般的なアプリでは使われないと思いますが、業務端末などでデバイスを再起動した後にホーム画面を開いたときに特定の業務アプリケーションが起動する設定について紹介します。
環境
- Android Ver 9 Pie
- kotlin 1.15.0
※ Android Kotlin経験1ヶ月のペーペーのため、間違いがあれば優しくご指摘お願い致します。
実装内容
デバイスが起動されたことをアプリで検知するためには、2つのファイルの作成・変更が必要になります。
- BroadcastReceiverクラスを継承したクラスの作成
- AndroidManifestにパーミッションとreceiverの登録
まずは1のクラスを作成します。
// StartupReceiver.kt
class StartupReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
Intent(context, MainActivity::class.java).apply {
this.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(this)
}
}
}
解説するとIntentを受け取って、MainActivityを起動するだけのクラスを作成しました。
次に2のAndroidManifestにパーミンションなどを追記します。
// AndroidManifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".StartupReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
uses-permission
でアプリに権限を追加します。
公式の説明を翻訳すると、システムの起動終了後にブロードキャストされて、ACTION_BOOT_COMPLETEDをアプリが受信できるようにすると書かれています。
なので、アプリがシステム起動のアクションを受信できるようになるようです。
receiver
には先程定義したStartupReceiverクラスを指定して、どのアクションが行われたらStartupReceiverにintentを渡すかを定義しています。
今回ですとactionにaction.BOOT_COMPLETED
を指定して、システム起動アクションが行われたらと言うふうに実装しています。
ここまで行うとデバイスを再起動して、ホーム画面に遷移するとStartupReceiverクラスの定義したアプリが自動起動するかと思います。
最後に
以上でAndroidでデバイスの起動後にアプリを強制起動する方法についてです。
BroadcastReceiverとuser-permission, receiverを使うことでsleep解除やロック画面解除時などのアクションをアプリで受信することができるかもしれないです。
ちなみに暗黙的ブロードキャストと明示的ブロードキャストの2種類があり、今回の方法は前者に当たるかと思います。(詳しくは調べていないので違っていたらすみません。)
暗黙的ブロードキャストはデバイスの電池寿命やパフォーマンスに影響するため、Android8から規制がかかっているようですが、例外も存在します。
ここに書くと長くなりそうなので、また機会があれば別でまとめようかと思います。