質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

3171閲覧

LOCKED_BOOT_COMPLETEDインテントのReceiverをマニフェストで登録できるAndroidのAPIレベル

MonaUser

総合スコア12

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/04/29 06:06

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
どうやらAndroidManifestの書き方ではなく、エミュレーターでのIntentの送出の仕方が良くなかったようです。

だめなパターン
am broadcast -a android.intent.action.LOCKED_BOOT_COMPLETED

OKパターン
am broadcast -a android.intent.action.LOCKED_BOOT_COMPLETED -n パッケージ名/.コンポーネント名

要するに"-n"オプションが必要だった、と。
実機でも動作するかはわかりませんがとりあえず解決ということで。
ちなみに検証したバージョンは以下のとおりです。

Android 11(APIレベル 30)

投稿2021/04/30 16:17

MonaUser

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問