Androidで、スマートフォン起動と共に立ち上がるアプリを開発しようとしています。
表題の通り「android.intent.action.LOCKED_BOOT_COMPLETED」インテントを受け起動できるよう、以下の通りAndroidManifestを設定しReceiver登録しようとしましたが、Receiverからログ出力されません。
いろいろ試しましたが(以下)、私の中で「Android APIのレベルのせいでは?」という結論に至りました。
試したAPIレベル
API 24(Android 7):OK
API 27(Android 8.1)~30(Android 11):NG
ただ、どのレベルまでしかマニフェストでReceiver登録できない、という根拠が見つかりませんでした。
それどころかむしろ、以下のドキュメントの例を見るとマニフェストでReceiver登録しています。
ブロードキャストの概要(Googleのドキュメント)
(例のインテントは"BOOT_COMPLETED"でちょっと違いますが…同じようなものです)
また、以下より暗黙的なブロードキャストの例外に当該インテントが含まれていることを確認しました。
暗黙的なブロードキャストの例外(Googleのドキュメント)
[引用]
Android 8.0(API レベル 26)のバックグラウンド実行制限の一環として、API レベル 26 以降を対象とするアプリは、暗黙的ブロードキャストについてマニフェストでブロードキャスト レシーバを登録できなくなりました。しかし、現在、いくつかのブロードキャストはこれらの制限から除外されています。次のブロードキャストについては、対象とする API レベルに関係なく、引き続きアプリによるリスナーの登録が可能です。
なので上記実験結果も「実は他のやり方をすればいけるのでは?」と疑心暗鬼です。。
どなたか、このレベル以降はLOCKED_BOOT_COMPLETEDの暗黙的インテントはマニフェストでReceiver登録できない、という根拠をご存じの方いらっしゃいませんでしょうか。
また、マニフェストでReceiver登録できる方法をご存知でしたら教えてください。
ちなみにregisterReceiverで登録すればインテントを受けられることは確認しています。
(もしかして上記引用の最後の一文はこのことを指しているのか…?)
AndroidManifest
1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.test"> 4 5 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 6 7 <application 8 android:allowBackup="true" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/Theme.ForegroundServiceTest"> 14 <activity android:name=".MainActivity"> 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 <category android:name="android.intent.category.LAUNCHER" /> 18 </intent-filter> 19 </activity> 20 <receiver 21 android:name=".MyBroadcastReceiver" 22 android:directBootAware="true"> 23 <intent-filter> 24 <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED"/> 25 </intent-filter> 26 </receiver> 27 </application> 28</manifest>
MyBroadcastReceiver
1class MyBroadcastReceiver : BroadcastReceiver() { 2 override fun onReceive(context: Context?, intent: Intent?) { 3 Log.d("TAG", "Receiver get Intent") 4 when (intent?.action) { 5 Intent.ACTION_LOCKED_BOOT_COMPLETED -> { 6 Log.d("TAG", "Receiver get ACTION_LOCKED_BOOT_COMPLETED Intent") 7 } 8 } 9 } 10}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。