Android BOOT_COMPLETED no se recibe cuando se cierra la aplicación

Soy consciente de que esta pregunta se ha hecho mucho en el sitio, sin embargo, parece que no puedo encontrar una solución. Mi receptor BOOT_COMPLETED no se llama cuando la aplicación no se está ejecutando.

Manifiesto:

                 

StartUpBootReceiver:

 public class StartUpBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d("startuptest", "StartUpBootReceiver " + intent.getAction()); if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED"); } } } 

Si la aplicación se está ejecutando y simulo una llamada con

 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED 

El evento se recibe correctamente, sin embargo, si la aplicación se cierra, el evento no se recibe, ni se recibe al inicio.

He instalado la aplicación y luego la lancé un par de veces para asegurarme de que esté registrada. Estoy bastante perdido en esto, así que cualquier consejo sería muy apreciado.

Editar: Puedo ver en los registros que todas las demás aplicaciones cerradas (Youtube, FileObserver, etc.) reciben el evento boot_completed, pero no el mío.

    Inicié mi aplicación cuando BOOT_COMPLETED, así que sé que está funcionando. Agrego Log.d no se mostrará. Yo agrego Toast it show. Pequeñas diferencias en Manifest.xml

           

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

    Android detuvo el estado

    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 BroadcastReceviers ( 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 ).

    Este es un movimiento anti-malware de Google. 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.

    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/

    Cada respuesta aquí agrega una pequeña información, así que aquí está el resumen de todo:

    Para asegurarse de que recibirá el BOOT_COMPLETED, asegúrese de hacer lo siguiente:

    1. Agregue su receptor para manifestar (no olvide las banderas ):

             
    2. Agregar permiso:

    3. Después de instalar su aplicación, debe almorzar al menos una vez, manualmente por el usuario, para recibir el evento de inicio de Boot ( más detalles ).

    estaba luchando con el mismo problema, la razón es que está usando Log.d para rastrear su aplicación en logcat, desafortunadamente cuando reinicia su teléfono la aplicación está recibiendo el BOOT_Complete pero no puede verlo porque no está registrando en logcat.

    intente hacer un Toast con algo de texto en lugar de Log.d para asegurarse de que BOOT_COMPLETED se reciba o no.

    espero que esto ayude.

    Aquí está una versión de C # si ustedes lo quieren. Mis pruebas muestran que funciona bastante bien y la puesta en marcha es bastante rápida. Aunque tenga en cuenta que agregarlo tanto en C # como en AndroidManifest.xml lo rompe (al menos para mí).

    También agregué algunos ejemplos agradables y útiles que ojalá hubiera averiguado de alguien en lugar de aprenderlo al leer los documentales y demás.

     [BroadcastReceiver(Enabled = true, Exported = true, DirectBootAware = true, Name = "com.nevaran.startup.StartUpBootReceiver")] [IntentFilter(new string[] { Intent.ActionBootCompleted , Intent.ActionLockedBootCompleted , Intent.ActionMyPackageReplaced , Intent.ActionUserInitialize , "android.intent.action.QUICKBOOT_POWERON" , "com.htc.intent.action.QUICKBOOT_POWERON" })] public class BootReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { if( intent.Action.Equals(Intent.ActionBootCompleted) || intent.Action.Equals(Intent.ActionLockedBootCompleted) || intent.Action.Equals(Intent.ActionUserInitialize) || intent.Action.Equals("android.intent.action.QUICKBOOT_POWERON") || intent.Action.Equals("com.htc.intent.action.QUICKBOOT_POWERON") ) { //run code here only if its started by the chosen actions } //some code that doesnt care about which action is triggered by } } 

    Si desea saber la razón real detrás de por qué BOOT_COMPLETE no funciona o no está recibiendo. Sugeriré que vayas al sitio de desarrollo OFICIAL de Android. Ellos han explicado con la solución exacta.

    Desarrollador de Android: BOOT_COMPLETE

    Básicamente necesitas Android: enabled = “true” android: exported = “true” flags en manifestar para recibir la transmisión.