私は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>
何か助けていただけませんか?
一般に、 Android 8.0 + でのブロードキャストには、暗黙のIntent
(たとえば、アクション文字列のみを含むもの)を使用できません。
_<receiver>
_はエクスポートされません。これは、次の3つのうちの1つを示唆しています。
これをPendingIntent
などのNotification
と一緒に使用しています。その場合、_<intent-filter>
_を削除し、このレシーバーを指すIntent
の作成の一部として、明示的なPendingIntent
(new Intent(this, ConsultReceiver.class)
)を使用します。
これを、アプリ内の複数のアプリプロセス間のIPCの一部として使用しています。その場合は、明示的なIntent
も使用してください。
このレシーバーは、純粋にアプリ内の1つのプロセス内で使用しています。その場合は、_<receiver>
_を削除して、他のもの(LocalBroadcastManager
、イベントバス、RxJava、LiveData
など)を使用します。
アプリがAPIレベル26以上をターゲットにしている場合、マニフェストを使用して、暗黙のブロードキャスト(アプリを特にターゲットにしないブロードキャスト)のレシーバーを宣言することはできません。ただし、その制限から除外されているいくつかの暗黙のブロードキャストは除きます。ほとんどの場合、代わりにスケジュールされたジョブを使用できます。
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()
}
}
setPackage を使用して、Intent
をパッケージに制限します。