Je sais que le BroadcastReceiver
ne peut pas être utilisé s'il est défini comme classe interne d'Activity. Mais je me demande pourquoi ? Est-ce parce que le système devrait instancier une grosse classe Activity
pour avoir simplement instancié une instance de récepteur ?
Réponse
Trop de publicités?... parce que le système devrait instancier un grand objet Activity pour avoir simplement instancié une instance de récepteur ?
Oui, comme toute autre classe interne non statique. Elle doit obtenir une instance de la classe externe de quelque part (par exemple, en l'instanciant ou par un autre mécanisme) avant de pouvoir créer une instance de la classe interne (non statique).
Les récepteurs de diffusion globale qui sont invoqués à partir d'intentions dans le fichier manifeste et qui seraient instanciés automatiquement par le système n'ont pas d'instance externe à utiliser pour créer une instance de la classe interne non statique du récepteur de diffusion. Ceci est indépendant de la classe externe, qu'elle soit Activity ou non.
Toutefois, si vous utilisez un récepteur dans le cadre d'une activité, vous pouvez instancier manuellement un récepteur de diffusion dans l'activité (pendant l'un des rappels de l'activité, vous disposez d'une instance de la classe externe pour travailler : this
), puis l'enregistrer ou le désenregistrer comme il convient :
public class MyActivity extends Activity {
private BroadcastReceiver myBroadcastReceiver =
new BroadcastReceiver() {
@Override
public void onReceive(...) {
...
}
});
...
public void onResume() {
super.onResume();
....
registerReceiver(myBroadcastReceiver, intentFilter);
}
public void onPause() {
super.onPause();
...
unregisterReceiver(myBroadcastReceiver);
}
...
}