web-dev-qa-db-fra.com

Récepteur de diffusion sur Android Oreo

J'ai une classe de récepteur de changement de réseau et elle s'étend du récepteur de diffusion, mais je ne suis pas sûr que cela fonctionne dans Android Oreo, Oreo prend-il en charge le récepteur de diffusion, et s'il ne le prend pas en charge , quelle est l'autre façon de procéder

6
Eder Padilla

Il n'est pas pris en charge dans Oreo en tant que balise manifeste, vous devez l'enregistrer dans un service/activité avec context.registerReceiver (). Ou vous utilisez le WorkManager pour planifier quelque chose pour des conditions réseau spécifiques.

3
user9906968

Oreo prend en charge les récepteurs de diffusion mais avec certaines restrictions sur la diffusion implicite qui sont déclarées dans le manifeste.

Diffusion implicite vs explicite:

Selon la documentation , une diffusion implicite est une diffusion qui ne cible pas spécifiquement cette application. Par exemple, ACTION_PACKAGE_REPLACED est une diffusion implicite, car elle est envoyée à tous les écouteurs enregistrés, pour leur faire savoir qu'un paquet sur l'appareil a été remplacé.

Cependant, ACTION_MY_PACKAGE_REPLACED N'est pas une diffusion implicite, car il est envoyé uniquement à l'application dont le package a été remplacé, quel que soit le nombre d'autres applications qui ont enregistré des écouteurs pour cette diffusion.

Ainsi, tous les récepteurs de diffusion que nous avons définis statiquement dans notre manifeste d'application et qui écoutent des diffusions implicites ne recevront plus ces diffusions.

La raison de ce changement est que les diffusions implicites déclencheraient auparavant tout composant qui les écoutait dans le manifeste - cela pourrait avoir un effet négatif sur les performances des applications et des appareils en raison du grand nombre d'applications enregistrées pour recevoir des diffusions spécifiques, toutes déclenchées au niveau du en même temps.

Mais il existe une liste d'exceptions en ce qui concerne les diffusions implicites - cela signifie qu'il y en a encore pour lesquelles vous pouvez vous inscrire pour recevoir des diffusions. Ils sont tous énumérés ci-dessous:

enter image description here

Donc, si la diffusion pour laquelle vous avez enregistré des récepteurs figure sur cette liste, elle fonctionnera toujours comme précédemment. Cependant, si la diffusion que vous vous êtes inscrit pour recevoir ne figure pas sur cette liste, vous devez utiliser une solution alternative comme:

  • Créez le récepteur lors de l'exécution en appelant Context.registerReceiver(), au lieu de déclarer le récepteur dans le manifeste.
  • Utilisez un travail planifié pour vérifier la condition qui aurait déclenché la diffusion implicite.

Pour plus d'informations

13
Rahul Sahni