BOOT_COMPLETED no funciona con Android
broadcastreceiver bootcompleted (5)
El problema es con el dispositivo. algunos dispositivos solo permiten que las aplicaciones internas reciban esta acción (ejemplo: Android 5.1).
puede agregar esto a su filtro de intención para evitar
action android:name="android.intent.action.USER_PRESENT"
Esto se activa después de que el usuario desbloquea el dispositivo.
En primer lugar, sé que se han formulado cientos de este tipo de preguntas, pero las he estado comprobando todas durante un tiempo y todavía no he podido encontrar ninguna solución.
He visto esta respuesta, dijo que BOOT_COMPLETED no se envía a la aplicación a menos que el usuario lance primero tu aplicación, después de la versión 3.1 de Android. Pero aún veo que algunas aplicaciones lo están haciendo, debe haber una forma. Realmente necesito manejarlo, de lo contrario también estoy en contra de hacer algo sin la interacción del usuario.
Así que aquí está mi AndroidManifest:
<manifest ... >
<!-- to be activated service on boot is completed -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application ... >
<!-- to receive data when boot completed -->
<receiver
android:name="myPackage.BootReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
Gracias por adelantado.
Editar: No hay mucho que ver en mi receptor de radiodifusión, pero a quien se requiere aquí es:
package myPackage
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Utils.LogI("BootReceiver", "BootReceiver received!");
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
// Do my stuff
}
}
}
Esta es una pregunta antigua y básica, pero muchos desarrolladores de Android todavía están confundidos acerca de este problema, porque NO TIENEN TIEMPO PARA LEER LOS DOCUMENTOS CUIDADOSAMENTE
Vi a alguien compartir algunos enlaces y dijo que: "Esto no funcionará más" , es totalmente erróneo e incomprendido .
Acerca de esta preocupación: "He visto esta respuesta, dijo que BOOT_COMPLETED no se envía a la aplicación a menos que el usuario lance primero su aplicación, después de Android versión 3.1" , lea estas líneas (de los documentos oficiales: https://developer.android.com/about/versions/android-3.1.html#launchcontrols ) para comprender correctamente:
Tenga en cuenta que el estado detenido de una aplicación no es el mismo que el estado detenido de una Actividad . El sistema administra esos dos estados detenidos por separado.
Las aplicaciones están detenidas cuando se instalan por primera vez pero aún no se han iniciado y cuando el usuario las detiene manualmente (en Administrar aplicaciones ). (Significan forzar detener una aplicación)
Eso significa que un usuario debe iniciar la aplicación al menos una vez después de la instalación para activar la aplicación, luego la aplicación puede recibir transmisiones implícitas del sistema operativo como es normal. ( ¡Solo una vez lanzando una vez! )
"¿ Alguna aplicación que se instala y nunca abre solo una vez ?" Sí, es spam y estafa, esta técnica ayuda al usuario a evitar eso.
ADEMÁS, HASTA AHORA (Android Oreo 8.0) , cuando Android limita el registro de emisiones implícitas en Manifest ( https://developer.android.com/about/versions/oreo/background.html#broadcasts ), varias transmisiones aún están actualmente exentas de estos limitaciones ¡Y BOOT_COMPLETED es el primero que mencionan! ( https://developer.android.com/guide/components/broadcast-exceptions.html )
Por cierto, esta es la mejor solución que encontré para esta pregunta:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".BootReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<!--For HTC devices-->
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
Finalmente, lea el documento cuidadosamente y Piense dos veces el código una vez: 3!
Esto de abajo funcionó para mí
AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application>
<receiver android:name=".BootCompletedReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<service android:name="NotifyingDailyService" >
</service>
BootCompletedReceiver.class
public class BootCompletedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
// TODO Auto-generated method stub
Log.w("boot_broadcast_poc", "starting service...");
context.startService(new Intent(context, NotifyingDailyService.class));
}
}
Service.class
public class NotifyingDailyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent pIntent, int flags, int startId) {
// TODO Auto-generated method stub
Toast.makeText(this, "NotifyingDailyService", Toast.LENGTH_LONG).show();
Log.i("com.example.bootbroadcastpoc","NotifyingDailyService");
return super.onStartCommand(pIntent, flags, startId);
}
}
algunas tabletas nuevas y dispositivos Android tienen una aplicación de seguridad por defecto. algunas veces estas aplicaciones bloquean su modo de inicio automático. un ejemplo de esta aplicación segura es MyAsus manager. para que pueda agregar "permitir el inicio automático" a sus aplicaciones
Y para dispositivos Htc agrega com.htc.intent.action.QUICKBOOT_POWERON
<receiver android:enabled="true" android:name=".receivers.BootUpReceiver">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>