una studio receive_boot_completed que iniciar ejecuta completed como automaticamente arrancar app aplicacion android broadcastreceiver android-service

studio - Tratando de iniciar un servicio de arranque en Android



iniciar app automaticamente android studio (16)

He estado intentando iniciar un servicio cuando un dispositivo se inicia en Android, pero no puedo hacerlo funcionar. He visto varios enlaces en línea pero ninguno de los códigos funciona. ¿Estoy olvidando algo?

AndroidManifest.xml

<receiver android:name=".StartServiceAtBootReceiver" android:enabled="true" android:exported="false" android:label="StartServiceAtBootReceiver" > <intent-filter> <action android:name="android.intent.action._BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:name="com.test.RunService" android:enabled="true" />

Receptor de radiodifusión

public void onReceive(Context context, Intent intent) { if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { Intent serviceLauncher = new Intent(context, RunService.class); context.startService(serviceLauncher); Log.v("TEST", "Service loaded at start"); } }


Antes de montar el almacenamiento externo, BOOT_COMPLETE es enviado. Si su aplicación está instalada en un almacenamiento externo, no recibirá el mensaje de difusión de BOOT_COMPLETE. Para evitar esto puedes instalar tu aplicación en almacenamiento interno. puede hacer esto simplemente agregando esta línea en menifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" ... >

Algunos dispositivos HTC pueden habilitar una función de "inicio rápido" que es más como una hibernación profunda y no un reinicio real y, por lo tanto, no debería dar la intención de BOOT_COMPLETE. Para recuperar esto, puede agregar este filtro de intención dentro de su receptor:

<intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter>


Cómo iniciar el servicio en el arranque del dispositivo (aplicación de ejecución automática, etc.)

Para la primera: desde la versión Android 3.1+ no recibe BOOT_COMPLETE si el usuario nunca inició su aplicación al menos una vez o la aplicación "forzar el cierre". Esto se hizo para evitar que el malware registre automáticamente el servicio. Este agujero de seguridad se cerró en las nuevas versiones de Android.

Solución:

Crear aplicación con actividad. Cuando el usuario lo ejecuta una vez, la aplicación puede recibir un mensaje de difusión BOOT_COMPLETE.

Para el segundo: BOOT_COMPLETE se envía antes de que se monte el almacenamiento externo. Si la aplicación está instalada en un almacenamiento externo, no recibirá el mensaje de difusión BOOT_COMPLETE.

En este caso hay dos soluciones:

  1. Instala tu aplicación en el almacenamiento interno
  2. Instala otra pequeña aplicación en almacenamiento interno. Esta aplicación recibe BOOT_COMPLETE y ejecuta la segunda aplicación en almacenamiento externo.

Si su aplicación ya está instalada en el almacenamiento interno, el código a continuación puede ayudarlo a comprender cómo iniciar el servicio al iniciar el dispositivo.

En Manifest.xml

Permiso:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Registre su receptor BOOT_COMPLETED:

<receiver android:name="org.yourapp.OnBoot"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>

Registre su servicio:

<service android:name="org.yourapp.YourCoolService" />

En el receptor OnBoot.java:

public class OnBoot extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Create Intent Intent serviceIntent = new Intent(context, YourCoolService.class); // Start service context.startService(serviceIntent); } }

Para HTC, quizás también necesite agregar Manifieste este código si el dispositivo no detecta RECEIVE_BOOT_COMPLETED:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

El receptor ahora se ve así:

<receiver android:name="org.yourapp.OnBoot"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver>

¿Cómo probar BOOT_COMPLETED sin reiniciar el emulador o el dispositivo real? Es fácil. Prueba esto:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

¿Cómo obtener la identificación del dispositivo? Obtenga la lista de dispositivos conectados con ID''s:

adb devices

adb en ADT por defecto se puede encontrar en:

adt-installation-dir/sdk/platform-tools

¡Disfrutar! )


Como comentó @Damian, todas las respuestas en este hilo lo están haciendo mal. Si lo hace de forma manual, se corre el riesgo de que su Servicio se detenga en el medio debido a que el dispositivo se va a dormir. Es necesario obtener un bloqueo de estela primero. Afortunadamente, la biblioteca de soporte nos da una clase para hacer esto:

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // This is the Intent to deliver to our service. Intent service = new Intent(context, SimpleWakefulService.class); // Start the service, keeping the device awake while it is launching. Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); startWakefulService(context, service); } }

luego, en su Servicio, asegúrese de liberar el bloqueo de activación:

@Override protected void onHandleIntent(Intent intent) { // At this point SimpleWakefulReceiver is still holding a wake lock // for us. We can do whatever we need to here and then tell it that // it can release the wakelock. ... Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime()); SimpleWakefulReceiver.completeWakefulIntent(intent); }

No te olvides de agregar el permiso WAKE_LOCK a tu mainfest:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" />


Como información adicional: BOOT_COMPLETE se envía a las aplicaciones antes de que se monte el almacenamiento externo. Entonces, si la aplicación está instalada en un almacenamiento externo, no recibirá el mensaje de difusión BOOT_COMPLETE.

Más detalles here en la sección Broadcast Receivers escuchando "boot completed"



Creo que tu manifiesto necesita agregar:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />


De hecho, me metí en este problema no hace mucho, y es realmente muy fácil de arreglar, realmente no hace nada mal si configura el permiso "android.intent.action.BOOT_COMPLETED" y el filtro de intención.

Tenga en cuenta que si utiliza Android 4.X, debe ejecutar el servicio de escucha de difusión antes de iniciar el servicio durante el inicio, es decir, primero debe agregar una actividad, una vez que se ejecute su receptor de difusión, su aplicación debería funcionar como esperaba. sin embargo, en Android 4.X, no he encontrado una forma de iniciar el servicio sin arranque, creo que Google lo hizo por razones de seguridad.


Después de probar todas las respuestas y los trucos mencionados, finalmente descubro por qué el código no funciona en mi teléfono. Algunos teléfonos con Android como "Huawei Honor 3C Android 4.2.2 " tienen un menú Statup Manager en su configuración y su aplicación debe verificarse en la lista. :)


Esto es lo que hice

1. Hice la clase Receiver

public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //whatever you want to do on boot Intent serviceIntent = new Intent(context, YourService.class); context.startService(serviceIntent); } }

2.en el manifiesto

<manifest...> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application...> <receiver android:name=".BootReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> ...

3.y después de TODO LO QUE NECESITA "configurar" el receptor en su MainActivity, puede estar dentro del onCreate

... final ComponentName onBootReceiver = new ComponentName(getApplication().getPackageName(), BootReceiver.class.getName()); if(getPackageManager().getComponentEnabledSetting(onBootReceiver) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) getPackageManager().setComponentEnabledSetting(onBootReceiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP); ...

El último partido que he aprendido de ApiDemos.


Junto con

<action android:name="android.intent.action.BOOT_COMPLETED" />

tambien uso,

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

Los dispositivos HTC no parecen atrapar a BOOT_COMPLETED


Las otras respuestas se ven bien, pero pensé que resumiría todo en una respuesta completa.

Necesita lo siguiente en su archivo AndroidManifest.xml :

  1. En su elemento <manifest> :

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

  2. En su elemento <application> (asegúrese de usar un nombre de clase [o relativo] totalmente calificado para su BroadcastReceiver ):

    <receiver android:name="com.example.MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>

    (no necesita los atributos de android:enabled , exported , etc., los valores predeterminados de Android son correctos)

    En MyBroadcastReceiver.java :

    package com.example; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent startServiceIntent = new Intent(context, MyService.class); context.startService(startServiceIntent); } }

De la pregunta original:

  • no está claro si el elemento <receiver> estaba en el elemento <application>
  • no está claro si se especificó el nombre de clase correcto (o relativo) para BroadcastReceiver
  • había un error tipográfico en el <intent-filter>

Me acabo de enterar que podría ser debido a la opción de Fast Boot en Settings > Power

Cuando tengo esta opción desactivada, mi aplicación recibe esta transmisión pero no de otra manera.

Por cierto, tengo Android 2.3.3 en HTC Incredible S

Espero eso ayude.


Me enfrenté a este problema si dejo el constructor vacío en la clase receptora. Después de quitar el constructor vacío, los Methos recibidos comenzaron a funcionar bien.


Si está utilizando Android Studio y le gusta mucho completar automáticamente, debo informarle que estoy usando Android Studio v 1.1.0 y utilicé la finalización automática para el siguiente permiso

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Y Android Studio Auto completó RECEIVE_BOOT_COMPLETED todo en minúsculas, como receive_boot_completed y seguí sacándome el pelo porque ya había marcado mi lista de verificación para saber qué hacer para comenzar el servicio en el arranque. Acabo de confirmar de nuevo

Android Studio SÍ completa automáticamente este permiso en minúsculas.


Tengo una etiqueta adicional <category> , no sé si eso hace alguna diferencia.

<receiver android:name="BootIntentReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver>

¿Ha intentado omitir la cláusula if "android.intent.action.BOOT_COMPLETED".equals(intent.getAction() , ya que el receptor probablemente solo reciba esa intención de todos modos?


tenga en cuenta que al comienzo de la pregunta, hay un error tipográfico:

<action android:name="android.intent.action._BOOT_COMPLETED"/>

en lugar de :

<action android:name="android.intent.action.BOOT_COMPLETED"/>

una pequeña "_" y todo este problema :)