title: Dynamic register of C2DM receiver using registerReceiver
body: <p>I can register my android app with C2DM successfully using a <code>&lt;receiver&gt;</code> in my manifest. However, if I delete the <code>&lt;receiver&gt;</code> from the manifest and register my receiver using the method registerReceiver of the context, I receive a <code>SERVICE_NOT_AVAILABLE</code> error response. I have reproduced this behaviour in the emulator and in a real device.</p>
  
  <p>Is dynamically registering a C2DM receiver possible?</p>
  
  <p>This is the fragment of the manifest I deleted:</p>
  
  <pre><code>&lt;receiver android:name=".service.C2DM.C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND"&gt;
    &lt;intent-filter&gt;
        &lt;action android:name="com.google.android.c2dm.intent.RECEIVE" /&gt;
        &lt;category android:name="mytestapp" /&gt;
    &lt;/intent-filter&gt;
    &lt;intent-filter&gt;
        &lt;action android:name="com.google.android.c2dm.intent.REGISTRATION" /&gt;
        &lt;category android:name="mytestapp" /&gt;
    &lt;/intent-filter&gt;
  &lt;/receiver&gt;
  </code></pre>
  
  <p>And here is the code:</p>
  
  <pre><code>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", "mysender@gmail.com");
          ComponentName service = context.startService(registrationIntent);
          if(service!=null){
              Log.d("MyTestAppC2DM","C2DM Registration sent");
          }else{
              Log.d("MyTestAppC2DM","C2DM Service not found");
          }   
      }
  }
  </code></pre>