Odpowiedzi:
Po pierwsze potrzebujesz pozwolenia w AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Również w swoim AndroidManifest.xml
zdefiniuj usługę i nasłuchuj akcji 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>
Następnie musisz zdefiniować odbiornik, który otrzyma akcję BOOT_COMPLETED i uruchomi usługę.
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);
}
}
}
A teraz usługa powinna być uruchomiona, gdy telefon się uruchomi.
Intent.ACTION_BOOT_COMPLETED
zamiast zakodować ciąg w odbiorniku. Ponadto, należy użyć nowego Intent(context, MySystemService.class)
konstruktora podczas tworzenia zamiaru.
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
na public class
linię. Jakieś pomysły?
W ten sposób na podjęcie działalności zaczynają biec po restarcie urządzenia android:
Wstaw ten kod do AndroidManifest.xml
pliku, w <application>
elemencie ( nie w <activity>
elemencie):
<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>
Następnie utwórz nową klasę yourActivityRunOnStartup
(pasującą do android:name
podanej dla <receiver>
elementu w manifeście):
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);
}
}
}
Uwaga: Wywołanie i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
jest ważne, ponieważ działanie jest uruchamiane z kontekstu poza działaniem. Bez tego działanie nie rozpocznie się.
Ponadto, wartości android:enabled
, android:exported
a android:permission
w <receiver>
tagu nie wydają obowiązkowe. Aplikacja odbiera zdarzenie bez tych wartości. Zobacz przykład tutaj .
Application
? Może w środku onCreate()
?
onReceive()
oBroadcastReceiver
Słuchaj ACTION_BOOT_COMPLETE i rób odtąd wszystko, czego potrzebujesz. Jest tutaj fragment kodu .
Aktualizacja:
Oryginalny link przy odpowiedzi jest wyłączony, więc w oparciu o komentarze, tutaj jest kod połączony, ponieważ nikt nigdy nie przeoczyłby kodu, gdy linki są wyłączone.
W AndroidManifest.xml (część aplikacji):
<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);
}
}
Dodatkowo możesz użyć aplikacji takiej jak AutoStart, jeśli nie chcesz modyfikować kodu, aby uruchomić aplikację na Androida podczas uruchamiania: AutoStart - Bez roota
Rozwiązanie Seana początkowo nie działało dla mnie (Android 4.2.2). Musiałem dodać fikcyjną aktywność do tego samego projektu na Androida i przynajmniej raz uruchomić ją ręcznie na urządzeniu. Następnie rozwiązanie Seana zaczęło działać, a BroadcastReceiver został powiadomiony o kolejnych uruchomieniach.
Chciałbym dodać jeden punkt w tym pytaniu, z którym miałem do czynienia przez kilka dni. Próbowałem wszystkich odpowiedzi, ale te nie działały dla mnie. Jeśli używasz Androida w wersji 5.1, zmień te ustawienia.
Jeśli używasz Androida w wersji 5.1, musisz odznaczyć (Ogranicz, aby uruchomić) w ustawieniach aplikacji.
ustawienia> aplikacja> Twoja aplikacja> Ogranicz, aby uruchomić (usuń zaznaczenie)
Innym podejściem jest użycie android.intent.action.USER_PRESENT
zamiast android.intent.action.BOOT_COMPLETED
unikania spowolnień podczas procesu uruchamiania. Ale dzieje się tak tylko true
wtedy, gdy użytkownik włączył ekran blokady - w przeciwnym razie ten zamiar nigdy nie zostanie nadany.
Blog referencyjny - Problem z intencją ACTION_USER_PRESENT w Androidzie