web-dev-qa-db-fra.com

Le récepteur de diffusion enregistré dans le manifeste n'est pas appelé Android Oreo

Je me suis inscrit après receiver qui n'est pas appelé Android Oreo mais fonctionne sur les appareils de version inférieure.

<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>  

Toute aide serait appréciée?

8
Ragini

En général, vous ne pouvez pas utiliser un Intent implicite (par exemple, un avec juste une chaîne d'action) pour une diffusion sur Android 8.0 + .

Votre <receiver> N'est pas exporté. Cela suggère une des trois choses suivantes:

  1. Vous l'utilisez avec un PendingIntent, comme pour un Notification. Si c'est le cas, supprimez le <intent-filter> Et utilisez un Intent (new Intent(this, ConsultReceiver.class)) explicite dans le cadre de la création de votre PendingIntent qui pointe vers ce récepteur.

  2. Vous l'utilisez dans le cadre de certains IPC entre plusieurs processus d'application dans votre application. Dans ce cas, utilisez également un Intent explicite.

  3. Vous utilisez ce récepteur uniquement dans un processus au sein de votre application. Dans ce cas, supprimez le <receiver> Et utilisez autre chose (LocalBroadcastManager, un bus d'événements, RxJava, LiveData, etc.).

9
CommonsWare

Si votre application cible le niveau 26 ou supérieur de l'API, vous ne pouvez pas utiliser le manifeste pour déclarer un récepteur pour les diffusions implicites (diffusions qui ne ciblent pas spécifiquement votre application), à l'exception de quelques diffusions implicites exemptées de cette restriction. Dans la plupart des cas, vous pouvez utiliser des tâches planifiées à la place.

3
Nirmal Prajapat

Dans Android 8.0 et supérieur, utilisez le code suivant pour vérifier si une application est installée ou désinstallée.

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

Limitez le Intent à votre package avec setPackage .

3
artkoenig