BroadcastReceiver no recibe ARRANQUE COMPLETADO


He buscado por aquí problemas similares, pero por alguna razón mi BroadcastReceiver nunca termina recibiendo el android.intención.acto.Intent BOOT_COMPLETED.

Aquí está mi Androide (pariente).Archivo de manifiesto:

<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

Author: apmeyers1987, 2011-02-19

9 answers

Puede emular todas las acciones de difusión conectándose a través de adb al dispositivo y abrir un shell de dispositivo.

Aquí vamos:

  • abrir consola / terminal y navegar a / platform-tools
  • escriba adb shell o en linux/mac ./adb shell
  • en el shell escriba am broadcast -a android.intent.action.BOOT_COMPLETED o cualquier acción que desee disparar

Hay un montón de buenos comandos que vienen con adb o el shell adb. Solo inténtalo

Saludos Flo

Editar: oh maldita sea, quería esta respuesta como una respuesta on the "had to turn phone on / off every time". lo siento chicos

 160
Author: eftokay83,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-24 10:16:29

Estoy publicando esto con la esperanza de que sea útil para alguien que ha intentado todo pero aún no puede ejecutarlo en el arranque después de la instalación o solía funcionar antes y ya no funciona.

Así que asumiendo que has añadido 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 codificado 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, al momento de la instalación, se colocan en un estado " detenido".(Esta es la el mismo estado en el que termina la aplicación después de que la fuerza del usuario detenga la aplicación desde la aplicación Configuración.)

Android estado detenido

Mientras esté en estado "detenido", la aplicación no se ejecutará por ningún motivo, excepto mediante el lanzamiento manual de una actividad. (Significado no BroadcastRecevier(ACTION_PACKAGE_INSTALLED, BOOT_COMPLETED etc. se invocará, independientemente del evento para el que se haya registrado, hasta que el usuario ejecute la aplicación manualmente.)

Esta es una decisión de diseño de Google para prevenir las aplicaciones de malware. Google ha defendido que los usuarios deben lanzar una actividad desde el lanzador primero, antes de que la aplicación puede 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 cualquier actividad en su aplicación una vez, recibirá la transmisión BOOT_COMPLETED después de todos los boots futuros.

Más detalles acerca de this:
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/

 134
Author: Caner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-18 08:29:31

Si su aplicación está instalada en un almacenamiento externo (tarjeta SD), nunca recibirá la acción Boot Complete. Así que tienes que especificar android:installLocation="internalOnly" en el manifest tag.

 53
Author: Sundeep1501,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-30 14:15:13

Resulta que el receptor no estaba en la etiqueta del manifiesto. Whoops! Gracias por su ayuda chicos! La peor parte de probar esto es tener que seguir apagando y encendiendo el teléfono. : P

 11
Author: apmeyers1987,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-04 11:53:28

Su elemento <uses-permission> necesita ser un hijo inmediato del elemento <manifest>, y su lista de código anterior sugiere que no lo es.

Aquí hay un proyecto de ejemplo que demuestra el uso de BOOT_COMPLETED.

 10
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-19 16:21:42

Este parece ser el hilo principal para este problema, por lo que quería agregar una solución para mis colegas de C#. Me devané el cerebro tratando de averiguar qué estaba haciendo mal después de probar todo aquí, 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 de la manera difícil. Con C# NO MODIFICAR AndroidManifest.xml manualmente!

Ver esta guía para referencia: Xamarin: Trabajando con AndroidManifest.xml

Más directamente para este problema, aquí es cómo se hace esto.

Primero, en las propiedades de su proyecto, bajo la pestaña Manifiesto, hay una lista de casillas de verificación para elegir los permisos que desea proporcionar, uno de los cuales es RECEIVE_BOOT_COMPLETED. Compruebe que para proporcionar estos permisos.

En segundo lugar, debe poner 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 ()] tratar con la prioridad no es necesario, solo permite que otras cosas de mayor prioridad se hagan primero en el arranque, y es una buena práctica si su aplicación no es una cosa de alta prioridad.

Como verás en el artículo vinculado, el uso de estas etiquetas en tu código causará el AndroidManifest.archivo xml que se creará en el momento de la compilación, con todo como debería ser. Lo que encontré fue que al modificar el manifiesto manualmente para incluir la etiqueta de receptor, el sistema estaba haciendo que buscara la clase uno nivel demasiado profundo, lanzando así una excepción ClassNotFound. Estaba tratando de crear una instancia de [Espacio de nombres].[Espacio de nombres].[BroadcastReceiver] que estaba mal. Y estaba haciendo eso debido a las ediciones manuales del manifiesto.

De todos modos, espero que esto ayude.

También, otro consejo rápido con la herramienta adb. Si desea obtener una versión más fácil de leer del registro, pruebe esto:

C:\Android\platform-tools\adb logcat >> C:\log.txt

Esto volcará el logcat a un archivo de texto que puede abra y lea un poco más fácil que en la ventana del símbolo del sistema. Hace cortar y pegar las cosas un poco más fácil también.

 4
Author: Wanabrutbeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-29 16:15:32

Perteneciente a algunos dispositivos que ejecutan Android Kitkat 4.4.4_r2/r1.

Parece haber un error en Android que hace android.intención.acto.BOOT_COMPLETED no se emite.

Véase:
ERROR DE ARRANQUE que hace que el Servicio del 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 los permisos, etc.), pero si está ejecutando Kitkat, puede echar un vistazo y ver si este parece ser el caso para usted.

I tenía este problema y android.intención.acto.BOOT_COMPLETED simplemente no se emitiría algunas de las veces que se había iniciado!

 1
Author: JohnyTex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-05 13:17:51

Al agregar <category android:name="android.intent.category.HOME" /> esto a mi archivo de manifiesto resolver 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>
 0
Author: Ayaz khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-27 12:40:46

Otras respuestas aquí ya cubrieron cómo implementar perfectamente el Receptor de transmisión para que funcione, sin embargo, todavía tenía problemas para recibir la Intent BOOT_COMPLETED hasta que me di cuenta de que la aplicación estaba funcionando cuando se inició desde el teléfono/emulador presionando el icono de la aplicación. Cada vez que inicie mi aplicación con los comandos debug/run de Android Studio, la Intent BOOT_COMPLETED no se entregará, a menos que la aplicación se abra y se ejecute.

Espero que esto pueda ayudar a alguien que, como yo, estuve luchando durante horas con este problema. Además, si alguien tiene una explicación para este comportamiento, me encantaría saber más al respecto.

 0
Author: c0rtexx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-11 15:39:42