Risposte:
Innanzitutto, hai bisogno dell'autorizzazione nel tuo AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Inoltre, nel tuo AndroidManifest.xml
, definisci il tuo servizio e ascolta l' azione 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>
Quindi è necessario definire il destinatario che otterrà l' azione BOOT_COMPLETED e avvierà il servizio.
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);
}
}
}
E ora il servizio dovrebbe essere in esecuzione all'avvio del telefono.
Intent.ACTION_BOOT_COMPLETED
invece di codificare la stringa nel ricevitore. Inoltre, dovrebbe utilizzare il nuovo Intent(context, MySystemService.class)
costruttore durante la creazione dell'intento.
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
in public class
linea. Qualche idea?
Ecco come avviare un'attività in esecuzione dopo il riavvio del dispositivo Android:
Inserisci questo codice nel tuo AndroidManifest.xml
file, all'interno <application>
dell'elemento ( non all'interno <activity>
dell'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>
Quindi creare una nuova classe yourActivityRunOnStartup
(corrispondente a quella android:name
specificata per l' <receiver>
elemento nel manifest):
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 chiamata i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
è importante perché l'attività viene avviata da un contesto esterno all'attività. Senza questo, l'attività non inizierà.
Inoltre, i valori android:enabled
, android:exported
e android:permission
nel <receiver>
tag non sembrano obbligatorie. L'app riceve l'evento senza questi valori. Vedi l'esempio qui .
Application
? Forse dentro onCreate()
?
onReceive()
di unBroadcastReceiver
Ascolta ACTION_BOOT_COMPLETE e fai quello che ti serve da lì. C'è uno snippet di codice qui.
Aggiornare:
Il link originale sulla risposta è inattivo, quindi in base ai commenti, qui è un codice collegato, perché nessuno perderebbe mai il codice quando i collegamenti sono inattivi.
In AndroidManifest.xml (parte dell'applicazione):
<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);
}
}
Inoltre, puoi utilizzare un'app come AutoStart se non vuoi modificare il codice, per avviare un'applicazione Android all'avvio: AutoStart - No root
La soluzione di Sean inizialmente non ha funzionato per me (Android 4.2.2). Ho dovuto aggiungere un'attività fittizia allo stesso progetto Android ed eseguire l'attività manualmente sul dispositivo almeno una volta. Quindi la soluzione di Sean ha iniziato a funzionare e BroadcastReceiver è stato avvisato dopo i successivi riavvii.
Vorrei aggiungere un punto a questa domanda che ho dovuto affrontare per un paio di giorni. Ho provato tutte le risposte ma quelle non funzionavano per me. Se si utilizza Android versione 5.1, modificare queste impostazioni.
Se si utilizza Android versione 5.1, è necessario deselezionare (Limita l'avvio) dalle impostazioni dell'app.
impostazioni> app> l'app> Limita l'avvio (deseleziona)
Un altro approccio è utilizzare android.intent.action.USER_PRESENT
invece di android.intent.action.BOOT_COMPLETED
evitare rallentamenti durante il processo di avvio. Ma questo è solo true
se l'utente ha abilitato la schermata di blocco, altrimenti questo intento non viene mai trasmesso.
Blog di riferimento - Il problema con l'intento ACTION_USER_PRESENT di Android