Respuestas:
Primero, necesita el permiso en su AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Además, en su AndroidManifest.xml
, defina su servicio y escuche la acción BOOT_COMPLETED :
<service android:name=".MyService" android:label="My Service">
<intent-filter>
<action android:name="com.myapp.MyService" />
</intent-filter>
</service>
<receiver
android:name=".receiver.StartMyServiceAtBootReceiver"
android:label="StartMyServiceAtBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Luego debe definir el receptor que obtendrá la acción BOOT_COMPLETED e iniciará su servicio.
public class StartMyServiceAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent serviceIntent = new Intent(context, MyService.class);
context.startService(serviceIntent);
}
}
}
Y ahora su servicio debería estar ejecutándose cuando se inicia el teléfono.
Intent.ACTION_BOOT_COMPLETED
lugar de codificar la cadena en su receptor. Además, debe usar el nuevo Intent(context, MySystemService.class)
constructor al crear la intención.
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
en la public class
línea. ¿Algunas ideas?
Así es como hacer que una actividad comience a ejecutarse después de reiniciar el dispositivo Android:
Inserte este código en su AndroidManifest.xml
archivo, dentro del <application>
elemento ( no dentro del <activity>
elemento):
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:enabled="true"
android:exported="true"
android:name="yourpackage.yourActivityRunOnStartup"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Luego cree una nueva clase yourActivityRunOnStartup
(que coincida con la android:name
especificada para el <receiver>
elemento en el manifiesto):
package yourpackage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class yourActivityRunOnStartup extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
}
Nota: La llamada i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
es importante porque la actividad se inicia desde un contexto externo a la actividad. Sin esto, la actividad no comenzará.
Además, los valores android:enabled
, android:exported
y android:permission
en la <receiver>
etiqueta no parecen obligatoria. La aplicación recibe el evento sin estos valores. Vea el ejemplo aquí .
Application
? Tal vez dentro onCreate()
?
onReceive()
de unBroadcastReceiver
Escuche ACTION_BOOT_COMPLETE y haga lo que necesite desde allí. Hay un fragmento de código aquí.
Actualizar:
El enlace original en la respuesta está inactivo, por lo que, según los comentarios, aquí está el código vinculado, porque nadie extrañará el código cuando los enlaces estén inactivos.
En AndroidManifest.xml (parte de la aplicación):
<receiver android:enabled="true" android:name=".BootUpReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
public class BootUpReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class); //MyActivity can be anything which you want to start on bootup...
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
Además, puede usar una aplicación como AutoStart si no desea modificar el código, para iniciar una aplicación de Android al inicio: AutoStart - Sin root
La solución de Sean no funcionó para mí inicialmente (Android 4.2.2). Tuve que agregar una actividad ficticia al mismo proyecto de Android y ejecutar la actividad manualmente en el dispositivo al menos una vez. Luego, la solución de Sean comenzó a funcionar y el BroadcastReceiver fue notificado después de reinicios posteriores.
Me gustaría agregar un punto en esta pregunta que tuve que enfrentar por un par de días. Intenté todas las respuestas pero no me funcionaban. Si está utilizando la versión 5.1 de Android, cambie esta configuración.
Si está utilizando la versión 5.1 de Android, entonces debe desactivar (Restringir para iniciar) desde la configuración de la aplicación.
configuración> aplicación> su aplicación> Restringir para iniciar (desmarcar)
Otro enfoque es usar en android.intent.action.USER_PRESENT
lugar de android.intent.action.BOOT_COMPLETED
evitar ralentizaciones durante el proceso de arranque. Pero esto es solotrue
si el usuario ha habilitado la pantalla de bloqueo; de lo contrario, esta intención nunca se transmite.
Blog de referencia: el problema con la intención ACTION_USER_PRESENT de Android