android - sendbroadcast - BroadcastReceiver no recibe BOOT_COMPLETED
jobintentservice example (10)
He buscado por aquí problemas similares, pero por alguna razón mi BroadcastReceiver nunca termina recibiendo el intento android.intent.action.BOOT_COMPLETED.
Aquí está mi (relativo) archivo Android.Manifest:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
<receiver android:name=".BootReceiver"
android:enabled="true"
android:exported="true"
android:label="BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
Y aquí está el Receptor real.
public class BootReceiver extends BroadcastReceiver {
private static final String TAG="BootReceiver";
@Override public void onReceive(Context context,Intent intent){
try{
context.startService(new Intent(context,ConnectivityListener.class));
Log.i(TAG,"Starting Service ConnectivityListener");
}catch(Exception e){
Log.e(TAG,e.toString());
}
}
}
¡Gracias! Cualquier ayuda es muy apreciada
Este parece ser el hilo de vanguardia para este problema, así que quería agregar una solución para mis colegas de C #. Me sacudí el cerebro tratando de descubrir qué estaba haciendo mal después de probar todo aquí, fue en vano. Finalmente me doy cuenta de lo que estaba mal, y difiere un poco de los consejos aquí para el desarrollo de C # Mono. Básicamente, se reduce a algo que acabo de aprender por las malas. Con C # ¡NO MODIFIQUE AndroidManifest.xml manualmente!
Consulta esta guía para referencia: Xamarin: Trabajando con AndroidManifest.xml
Más directamente para este problema, aquí es cómo se hace esto.
En primer lugar, en las propiedades de su proyecto, en la pestaña Manifiesto, hay una lista de casillas para elegir los permisos que desea proporcionar, uno de los cuales es RECEIVE_BOOT_COMPLETED. Verifique eso para proporcionar estos permisos.
En segundo lugar, debe colocar las etiquetas adecuadas en su clase BroacastReceiver.
[BroadcastReceiver]
[IntentFilter(new String[]{ Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)]
public class MyBootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
// Do your boot work here, set alarms, show toasts, whatever
}
}
La parte final de [IntentFilter ()] que trata con la prioridad no es necesaria, solo permite que otras cosas de mayor prioridad se hagan primero al arrancar, y es una buena práctica si su aplicación no es una cuestión de alta prioridad.
Como verá en el artículo vinculado, el uso de estas etiquetas en el código hará que el archivo AndroidManifest.xml se cree en el momento de la compilación, con todo como debería. Lo que encontré fue que al modificar manualmente el manifiesto para incluir la etiqueta del receptor, el sistema provocaba que buscara la clase un nivel demasiado profundo, lanzando así una excepción ClassNotFound. Intentaba crear una instancia de [Namespace]. [Namespace]. [BroadcastReceiver] que estaba mal. Y lo estaba haciendo debido a las ediciones manuales del manifiesto.
De todos modos, espero que esto ayude.
Además, otro consejo rápido con la herramienta adb. Si desea obtener una versión más fácil de leer del registro, intente esto:
C: / Android / platform-tools / adb logcat >> C: / log.txt
Esto arrojará el logcat a un archivo de texto que puede abrir y leer un poco más fácilmente que en la ventana del símbolo del sistema. Hace un poco más fácil cortar y pegar las cosas.
Estoy publicando esto con la esperanza de que sea útil para alguien que ha intentado todo pero que todavía no puede ejecutarlo en el arranque después de la instalación o que antes funcionaba y ya no funciona.
Asumiendo que has agregado el permiso:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Y registró su receptor:
<receiver android:name="com.example.startuptest.StartUpBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Y codificó su BroadcastReceiver
:
public class StartUpBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
...
}
}
}
Comenzando con Android 3.1, todas las aplicaciones, una vez instaladas, se colocan en un estado " detenido " (este es el mismo estado en el que termina la aplicación después de que el usuario fuerce la aplicación desde la aplicación Configuración).
Mientras está en estado "detenido", la aplicación no se ejecutará por ningún motivo , excepto mediante el inicio manual de una actividad. (Significa que no se ACTION_PACKAGE_INSTALLED
BroadcastRecevier
( ACTION_PACKAGE_INSTALLED
, ACTION_PACKAGE_INSTALLED
, etc.), independientemente del evento para el que se hayan registrado, hasta que el usuario ejecute la aplicación manualmente .
Esta es una decisión de diseño de Google para evitar las aplicaciones de malware. Google ha defendido que los usuarios deberían iniciar una actividad desde el iniciador primero, antes de que esa aplicación pueda hacer mucho. Evitar que BOOT_COMPLETED
se entregue hasta que se inicie la actividad es una consecuencia lógica de ese argumento.
Una vez que un usuario ejecuta alguna actividad en su aplicación una vez, recibirá la transmisión BOOT_COMPLETED después de todas las futuras botas.
Más detalles sobre esto:
http://developer.android.com/about/versions/android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed-regression.html
http://devmaze.wordpress.com/2011/12/05/activating-applications/
Otras respuestas aquí ya explicaron cómo implementar perfectamente el Broadcast Receiver para que funcione, sin embargo, todavía tuve problemas para recibir el BOOT_COMPLETED Intent hasta que me di cuenta de que la aplicación realmente funcionaba cuando comencé desde el teléfono / emulador presionando el ícono de la aplicación. Cada vez que inicio mi aplicación con los comandos de depuración / ejecución de Android Studio, no se entregará la intención BOOT_COMPLETED, a menos que la aplicación esté abierta y en ejecución.
Espero que esto pueda ayudar a alguien que, como yo, estuvo luchando durante horas con este problema. Además, si alguien tiene una explicación para este comportamiento, estaría encantado de saber más al respecto.
Perteneciente a algunos dispositivos que ejecutan Android Kitkat 4.4.4_r2 / r1.
Parece que hay un error en Android que hace que android.intent.action.BOOT_COMPLETED no se emita.
Ver:
FALLO DE ARRANQUE que hace que el Administrador de paquetes esté listo
En la mayoría de los casos, esta no es la respuesta a sus problemas (más probablemente debido a permisos, etc.), pero si está ejecutando Kitkat, entonces puede echar un vistazo y ver si este parece ser el caso para usted.
Tuve este problema y android.intent.action.BOOT_COMPLETED simplemente no se emitirá algunas de las veces que se inició.
Puede emular todas las acciones de transmisión conectándose a través de adb al dispositivo y abrir un shell de dispositivo.
Aquí vamos:
- abrir consola / terminal y navegar hacia / plataforma-herramientas
- escriba
adb shell
o en linux / mac./adb shell
- en el shell tipo
am broadcast -a android.intent.action.BOOT_COMPLETED
o cualquier acción que quieras disparar
Hay un montón de buenos comandos que vienen con adb o el shell adb. Solo inténtalo
Saludos Flo
editar: oh demonios, quería esta respuesta como una respuesta sobre "tenía que encender / apagar el teléfono cada vez". lo siento chicos
Resulta que el receptor no estaba en la etiqueta del manifiesto. ¡Ups! ¡Gracias por su ayuda chicos! La peor parte de probar esto es tener que apagar y encender el teléfono continuamente. :PAG
Si su aplicación está instalada en un almacenamiento externo (tarjeta SD) , nunca recibirá la acción Boot Complete. Por lo tanto, debe especificar android:installLocation="internalOnly"
en la manifest tag
.
Su elemento <uses-permission>
debe ser un elemento secundario inmediato del elemento <manifest>
, y su listado de código anterior sugiere que no lo es.
Aquí hay un proyecto de muestra que demuestra el uso de BOOT_COMPLETED
.
Tuve el mismo problema Fue resuelto después de cambiar el nombre del receptor de manifiesto a un camino completo a mi clase: com.bla.bla.bla.Receiver
al agregar <category android:name="android.intent.category.HOME" />
esto en mi archivo de manifiesto resuelve mi problema y funciona.
<receiver android:name=".BroadCastRecieverClass">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>