web-dev-qa-db-ja.com

マニフェストに登録されているブロードキャストレシーバーがAndroid Oreoで呼び出されない

私はAndroid Oreoで呼び出されない次のreceiverを登録しましたが、より低いバージョンのデバイスで動作します。

<receiver
     Android:name=".common.receiver.ConsultReceiver"
     Android:exported="false">
       <intent-filter>
            <action Android:name="APP_STARTED" />
            <action Android:name="APP_STARTED_FROM_ORGANIC" />
       </intent-filter>
</receiver>  

何か助けていただけませんか?

8
Ragini

一般に、 Android 8.0 + でのブロードキャストには、暗黙のIntent(たとえば、アクション文字列のみを含むもの)を使用できません。

_<receiver>_はエクスポートされません。これは、次の3つのうちの1つを示唆しています。

  1. これをPendingIntentなどのNotificationと一緒に使用しています。その場合、_<intent-filter>_を削除し、このレシーバーを指すIntentの作成の一部として、明示的なPendingIntentnew Intent(this, ConsultReceiver.class))を使用します。

  2. これを、アプリ内の複数のアプリプロセス間のIPCの一部として使用しています。その場合は、明示的なIntentも使用してください。

  3. このレシーバーは、純粋にアプリ内の1つのプロセス内で使用しています。その場合は、_<receiver>_を削除して、他のもの(LocalBroadcastManager、イベントバス、RxJava、LiveDataなど)を使用します。

9
CommonsWare

アプリがAPIレベル26以上をターゲットにしている場合、マニフェストを使用して、暗黙のブロードキャスト(アプリを特にターゲットにしないブロードキャスト)のレシーバーを宣言することはできません。ただし、その制限から除外されているいくつかの暗黙のブロードキャストは除きます。ほとんどの場合、代わりにスケジュールされたジョブを使用できます。

3
Nirmal Prajapat

Android 8.0以降では、次のコードを使用して、アプリがインストールまたはアンインストールされたことを確認します。

class MainActivity : AppCompatActivity() {

    private val receiver = YourBroadcastReceiverClass()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val filter = IntentFilter();
        filter.addAction(Intent.ACTION_PACKAGE_ADDED)
        filter.addAction(Intent.ACTION_PACKAGE_REMOVED)
        filter.addDataScheme("package")

        registerReceiver(receiver, filter)
    }

    override fun onDestory() {
        unregisterReceiver(receiver)
        super.onDestroy()
    }
}
3
Bugs Happen

setPackage を使用して、Intentをパッケージに制限します。

3
artkoenig