Ricevitore come class interna in Android

Nel mio codice c’è una class interna che estende BroadcastReceiver .

E ho aggiunto la seguente riga a AndroidManifest.xml :

  

Ma sto ricevendo il seguente errore:

imansible istanziare il ricevente org.example.test.OuterClass $ InnerClass

Come posso risolvere questo problema?

Una class interna (non statica) non può essere istanziata da Android tramite AndroidManifest.xml ( documentazione per sviluppatori Android su BroadcastReceiver ):

Puoi registrare dynamicmente un’istanza di questa class con Context.registerReceiver () o pubblicare staticamente un’implementazione tramite il tag nel tuo AndroidManifest.xml.

Quindi puoi registrare dynamicmente il ricevitore. Nella mia applicazione volevo fare lo stesso per usare il Cloud to Device Messaging (C2DM) di Google e il mio originale AndroidManifest.xml conteneva:

             

Ho rimosso quella sezione del ricevitore e registrato dynamicmente il ricevitore come segue:

 public class AndroidService extends IntentService { ... @Override public int onStartCommand(Intent intent, int flags, int startId) { IntentFilter filter = new IntentFilter(); filter.addAction("com.google.android.c2dm.intent.RECEIVE"); filter.addAction("com.google.android.c2dm.intent.REGISTRATION"); filter.addCategory("com.example.myapp"); this.registerReceiver(new MyC2dmReceiver(), filter, "com.google.android.c2dm.permission.SEND", null); return super.onStartCommand(intent,flags,startId); } public class MyC2dmReceiver extends BroadcastReceiver { ... } } 

La notazione $ non denota una class interna, ma una class nidificata statica. Quindi ci sono in teoria 2 modi per risolvere questo particolare problema:

  1. Indichiamolo come una vera class interiore, vale a dire OuterClass.InnerClass (non sono sicuro se Android lo mangerà, dal momento che l’istanziazione di una class interna è molto più complessa della semplice Class#newInstance() .

  2. Dichiarare invece la class come class nidificata statica, ovvero aggiungere static alla class InnerClass {} . In questo modo l’ OuterClass$InnerClass deve essere in grado di creare una nuova istanza fuori di esso.

Se ciò non risolve il problema, apparentemente Android semplicemente non lo mangia in quel modo. L’avrei appena estratto nella sua class autonoma allora.

Guarda anche:

  • Esercitazione su Java – Classi nidificate
  • Rispondi con un esempio di codice come creare un’istanza di una class nidificata interna o statica utilizzando la reflection (come dovrebbe fare Android “sotto le copertine”)

Potrebbe essere che manca solo un punto e una citazione di chiusura? Piace

  

Questo è ciò che ha funzionato per me:

 public class OuterClass { public static class InnerStaticClass extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { final Location location = (Location) intent.getExtras().get(LocationClient.KEY_LOCATION_CHANGED); } } } 

AndroidManifest.xml:

   

non hai bisogno di usare $ … Se ricevi un avvertimento per una class che non è in realtà una class interiore, è perché stai usando caratteri maiuscoli nel nome del tuo pacchetto , che non è convenzionale.

Ho provato anche a cambiare solo la prima lettera del nome del pacchetto in minuscolo, l’avviso e l’errore sono scomparsi.

Ho appena incontrato lo stesso problema.

Ho un servizio per comunicare con molte attività, e ho anche un ricevitore nel mio servizio come class interiore. quando il destinatario riceve un messaggio, deve chiamare il metodo di servizio. quindi continua così:

1. Codice di servizio:

 public class XXService extends Service{ // I want the inner receiver call the methd of XXService, // so I have to write this constructor like this. private XXService instance; public XXService(){instance = this;} public XXService getInstance(){ return instance; } public void sayHello(){ } public static class XXReceiver extends BroadcastReceiver{ onReceive(......){ XXService.getInstance.sayHello(); } } } 

2. Registrare il ricevitore in manifest.xml: