C2DM Broadcast Receiver

Tuve una aplicación C2DM de trabajo. Utilicé el mismo nombre de paquete al crear una nueva aplicación C2DM.

Funciona excepto ahora el BroadcastReceiver no se llama cuando la aplicación no se está ejecutando. Es decir, todo funciona si ejecuto la aplicación y le envío mensajes C2DM. Pero después de que una fuerza dejó el BroadcastReceiver ya no se llama.

He mirado muchos ejemplos y comparado todo en mi viejo manifiesto con el nuevo. Prestar especial atención a los nombres de paquetes utilizados en las categorías, Servicios de Intención, etc.

Pregunta: ¿Existe un error común de codificación / configuración de C2DM que provoca que el BroadcastReceiver no se llame después de que se cierre la aplicación de una aplicación?

Consigo este gato del registro cuando envío un mensaje de C2DM después de la fuerza abandonada de mi uso:

01-11 00: 54: 43.580: WARN / GTalkService (286): devolución de llamada de intención de difusión [DataMsgMgr]: result = CANCELED forIntent {act = com.google.android.c2dm.intent.RECEIVE cat = [com.aawwpcd.pcd3] (Tiene extras)}

Consigo uno de ésos para cada mensaje de C2DM que envíe al dispositivo después de la fuerza que cierra la aplicación.

Parece que la intención está llegando, pero no se pasa a mi BroadcastReceiver.

Editar:

Aquí están los bits relavant del manifiesto y BroadcastReceiver:

BroadcastReciever

package com.aawwpcd.pcd3.c2dm; import ... public class C2DMBroadcastReceiver extends BroadcastReceiver { @Override public IBinder peekService(Context myContext, Intent service) { return super.peekService(myContext, service); } public C2DMBroadcastReceiver() { super(); } @Override public void onReceive(Context context, Intent intent) { ... } } 

Manifiesto

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.aawwpcd.pcd3" android:versionCode="250" android:versionName="ICSPCD3"> <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="14"/> <permission android:name="com.aawwpcd.pcd3.permission.C2D_MESSAGE" android:protectionLevel="signature"/> <uses-permission android:name="com.aawwpcd.pcd3.permission.C2D_MESSAGE"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <application android:name=".PCD3Application" android:label="@string/app_name" android:icon="@drawable/pcdlauncher" android:theme="@android:style/Theme.Holo"> <activity android:name=".honeycombpcd3.FullScheduleActivity" android:label="@string/app_namefull" > <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <!-- Only C2DM servers can send messages for the app. If permission is not set - any other app can generate it --> <receiver android:name=".c2dm.C2DMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <!-- Receive the actual message --> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <category android:name="com.aawwpcd.pcd3"/> </intent-filter> <!-- Receive the registration id --> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.aawwpcd.pcd3"/> </intent-filter> </receiver> </application> </manifest> 

Edit: ¿Podría ser algo nuevo en 3.x? Como se mencionó anteriormente mis problemas comenzaron con esta nueva aplicación – escrita para 3.x. Lo que quiero es que el C2DM llame a BroadcastReceiver incluso cuando la aplicación no se está ejecutando. No estoy viendo eso. ¿Podría ser un cambio 3.x? Funcionó de esta manera antes en los teléfonos 2.3.x y no puedo encontrar nada que estoy haciendo diferente. Será una molestia para escribir el código de prueba para demostrar esto, pero eso es lo siguiente, supongo.

Edit: Parece relacionado con Force Quit. No tengo ningún problema cuando vuelvo a instalar el .apk y luego enviar al dispositivo un mensaje de c2dm; El receptor de la difusión lo recoge. En este caso, la aplicación ya no se estaba ejecutando cuando el C2DM entró, pero todo funcionó como se esperaba. El único problema que tengo es después de dejar salir una aplicación. Los mensajes C2DM después de que no son recogidos por el BroadcastReceiver.

Echa un vistazo a https://stackoverflow.com/a/7108611

Y en las notas de la versión de Android 3.1 http://developer.android.com/about/versions/android-3.1.html#launchcontrols

A partir de 3.1, las aplicaciones de Force stopped no son reiniciadas por C2DM de forma predeterminada. Hay una nueva bandera para solicitar un reinicio después de cerrar la fuerza.

¿Ha estado monitoreando el logcat después de "dejar de fumar" su receptor unas cuantas veces? Es probable que vea un mensaje de "mal proceso" que implica que su receptor se ha estrellado demasiadas veces y Android ya no lo enviará intentos. Reiniciar el teléfono / reinstalar la aplicación corrige este problema como lo implicó en su edición.

Simplemente agregue debajo de la bandera a su intención pendiente que está creando para generar notificación push.

Intent.addFlags (Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

Debería funcionar después de esto.

Si su teléfono tiene un Administrador de permisos. Active los permisos de inicio automático de su aplicación. Google cómo hacerlo para su teléfono.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.