2012-04-25 17 views
5

Puedo registrar mi aplicación de Android con C2DM con éxito utilizando un <receiver> en mi manifiesto. Sin embargo, si borro el <receiver> del manifiesto y registro mi receptor usando el método registerReceiver del contexto, recibo una respuesta de error SERVICE_NOT_AVAILABLE. He reproducido este comportamiento en el emulador y en un dispositivo real.Registro dinámico de receptor C2DM utilizando registerReceiver

¿Es posible registrar dinámicamente un receptor C2DM?

Este es el fragmento del manifiesto He eliminado:

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

Y aquí está el código:

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"); 
     } 
    } 
} 

Respuesta

2

Cuando el sistema envía una transmisión, iniciará las aplicaciones para manejar la intención si tienen un filtro de intención coincidente declarado en el manifiesto. Debido a la naturaleza de C2DM, no es útil tener un Broadcast Receiver instalado dinámicamente porque es posible que su aplicación no se esté ejecutando cuando se recibe un mensaje C2DM. Si no se está ejecutando, no se iniciará para un receptor instalado dinámicamente.

3

Puede registrar el receptor C2DMReceiver en el archivo de manifiesto, y el despacho de la intención de bienes BroadcastReceiver para manejarlo.

+0

Gracias. Esto es lo que hice, pero estoy aceptando la otra respuesta porque estaba pidiendo más un razonamiento que una solución alternativa. – hectorct

+0

@hectorct Tengo un [problema] muy similar [http://stackoverflow.com/questions/25233039/google-gcm-client-not-sending-messages-after-unregistering-registering-the-broad). Si registro el BroadcastReceiver dinámicamente, mi aplicación ya no está enviando mensajes. Al volver al modo de demostración, está funcionando. Tal vez has descubierto a tiempo. –

0

Podría tener sentido para recibir el c2dm/GCM REGISTRADO intención en un BroadcastReceiver dinámica registrada en una actividad, pero al igual que el autor original que he encontrado que esto no es de trabajo (a excepción de GCM sobre el JB). Hay alguna razón para esto ? No puedo encontrar esta limitación en los documentos en ningún lado.

Cuestiones relacionadas