2012-04-25 12 views
5

Posso registrare la mia app Android con C2DM utilizzando correttamente un <receiver> nel mio manifest. Tuttavia, se elimini lo <receiver> dal manifest e registro il mio ricevitore usando il metodo registerReceiver del contesto, ricevo una risposta all'errore SERVICE_NOT_AVAILABLE. Ho riprodotto questo comportamento nell'emulatore e in un dispositivo reale.Registro dinamico del ricevitore C2DM utilizzando registerReceiver

È possibile registrare dinamicamente un ricevitore C2DM?

Questo è il frammento del manifesto ho cancellato:

<receiver android:name=".service.C2DM.C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND"> 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <category android:name="mytestapp" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
     <category android:name="mytestapp" /> 
    </intent-filter> 
</receiver> 

Ed ecco il codice:

public class C2DMReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String registration = intent.getStringExtra("registration_id"); 
     if (intent.getStringExtra("error") != null) { 
      //TODO: Registration failed, should try again later. 
      Log.e("MyTestAppC2DM", "C2DM Error = " + intent.getStringExtra("error")); 
     } else if (intent.getStringExtra("unregistered") != null) { 
      Log.d("MyTestAppC2DM", "C2DM Unregistered"); 
     } else if (registration != null) { 
      Log.d("MyTestAppC2DM","C2DM registration_id = " + registration); 
     } else { 
      Log.w("MyTestAppC2DM", "C2DM No registration_id"); 
     } 
    } 

    public static void register(Context context){ 
     /* BEGIN OF DYNAMIC REGISTER */ 
     C2DMReceiver c2dmReceiver = new C2DMReceiver(); 

     IntentFilter receiveIntentFilter = new IntentFilter(); 
     receiveIntentFilter.addAction("com.google.android.c2dm.intent.RECEIVE"); 
     receiveIntentFilter.addCategory("mytestapp"); 
     context.registerReceiver(c2dmReceiver, receiveIntentFilter, "com.google.android.c2dm.permission.SEND", null); 

     IntentFilter registrationIntentFilter = new IntentFilter(); 
     registrationIntentFilter.addAction("com.google.android.c2dm.intent.REGISTRATION"); 
     registrationIntentFilter.addCategory("mytestapp"); 
     context.registerReceiver(c2dmReceiver, registrationIntentFilter, "com.google.android.c2dm.permission.SEND", null); 

     /*END OF DYNAMIC REGISTER*/ 

     Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
     registrationIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, new Intent(), 0)); 
     registrationIntent.putExtra("sender", "[email protected]"); 
     ComponentName service = context.startService(registrationIntent); 
     if(service!=null){ 
      Log.d("MyTestAppC2DM","C2DM Registration sent"); 
     }else{ 
      Log.d("MyTestAppC2DM","C2DM Service not found"); 
     } 
    } 
} 

risposta

2

Quando una trasmissione viene inviata dal sistema, avvierà le applicazioni per gestire l'intento se hanno dichiarato un filtro di intenti corrispondente nel manifest. A causa della natura di C2DM, non è utile avere un ricevitore Broadcast installato dinamicamente perché l'applicazione potrebbe non essere in esecuzione quando viene ricevuto un messaggio C2DM. Se non è in esecuzione, non verrà avviato per un ricevitore installato in modo dinamico.

3

È possibile registrare il ricevitore C2DMReceiver nel file manifesto, e la spedizione l'intento di vera BroadcastReceiver per gestirlo.

+0

Grazie. Questo è quello che ho fatto, ma sto accettando l'altra risposta perché stavo chiedendo più per un ragionamento che una soluzione alternativa. – hectorct

+0

@hectorct Ho un problema molto simile [http://stackoverflow.com/questions/25233039/google-gcm-client-not-sending-messages-after-unregistering-registering-the-broad). Se registro dinamicamente BroadcastReceiver, la mia app non invia più messaggi. Mentre ritorna alla modalità manifest, sta funzionando. Forse hai capito in tempo. –

0

Potrebbe avere senso per ricevere il c2dm/GCM REGISTRATO intenti in una BroadcastReceiver registrati dinamicamente in un'attività, ma come l'autore originale che ho trovato che questo non è di lavoro (tranne che per GCM su JB). C'è una ragione per questo? Non riesco a trovare questa limitazione nei documenti ovunque.

Problemi correlati