Antworten:
Zunächst benötigen Sie die Erlaubnis in Ihrem AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Auch in Ihrem AndroidManifest.xml
definieren Sie da und hören für die BOOT_COMPLETED Aktion:
<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>
Dann müssen Sie den Empfänger definieren, der die Aktion BOOT_COMPLETED erhält, und Ihren Dienst starten.
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);
}
}
}
Und jetzt sollte Ihr Dienst ausgeführt werden, wenn das Telefon gestartet wird.
Intent.ACTION_BOOT_COMPLETED
die Zeichenfolge in Ihrem Receiver zu verwenden, anstatt sie fest zu codieren. Sollte auch den neuen Intent(context, MySystemService.class)
Konstruktor beim Erstellen der Absicht verwenden.
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
in der public class
Leitung. Irgendwelche Ideen?
So wird eine Aktivität nach dem Neustart des Android-Geräts gestartet:
Fügen Sie diesen Code in Ihre AndroidManifest.xml
Datei innerhalb des <application>
Elements ein ( nicht innerhalb des <activity>
Elements):
<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>
Erstellen Sie dann eine neue Klasse yourActivityRunOnStartup
(die mit der android:name
für das <receiver>
Element im Manifest angegebenen übereinstimmt ):
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);
}
}
}
Hinweis: Der Aufruf i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ist wichtig, da die Aktivität aus einem Kontext außerhalb der Aktivität gestartet wird. Ohne dies wird die Aktivität nicht gestartet.
Auch die Werte android:enabled
, android:exported
und android:permission
in dem <receiver>
Tag nicht zwingend erscheinen. Die App empfängt das Ereignis ohne diese Werte. Siehe das Beispiel hier .
Application
? Vielleicht innerhalb onCreate()
?
onReceive()
einesBroadcastReceiver
Hören Sie auf ACTION_BOOT_COMPLETE und tun Sie von dort aus, was Sie brauchen. Hier gibt es ein Code-Snippet .
Aktualisieren:
Der ursprüngliche Link bei der Antwort ist ausgefallen. Basierend auf den Kommentaren handelt es sich hier um verknüpften Code, da niemand den Code jemals verpassen würde, wenn die Links ausgefallen sind.
In AndroidManifest.xml (Anwendungsteil):
<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);
}
}
Darüber hinaus können Sie eine App wie AutoStart verwenden, wenn Sie den Code nicht ändern möchten, um beim Start eine Android-Anwendung zu starten: AutoStart - Kein Root
Die Lösung von Sean hat anfangs bei mir nicht funktioniert (Android 4.2.2). Ich musste dem gleichen Android-Projekt eine Dummy-Aktivität hinzufügen und die Aktivität mindestens einmal manuell auf dem Gerät ausführen. Dann begann die Lösung von Sean zu funktionieren und der BroadcastReceiver wurde nach nachfolgenden Neustarts benachrichtigt.
Ich möchte einen Punkt in diese Frage aufnehmen, mit dem ich einige Tage lang konfrontiert war. Ich habe alle Antworten ausprobiert, aber diese haben bei mir nicht funktioniert. Wenn Sie Android Version 5.1 verwenden, ändern Sie bitte diese Einstellungen.
Wenn Sie Android Version 5.1 verwenden, müssen Sie die App-Einstellungen deaktivieren (Zum Starten einschränken).
Einstellungen> App> Ihre App> Auf Start beschränken (deaktivieren)
Ein anderer Ansatz besteht darin, Verzögerungen während des Startvorgangs zu vermeiden, android.intent.action.USER_PRESENT
anstatt sie android.intent.action.BOOT_COMPLETED
zu vermeiden. Dies ist jedoch nur möglich, true
wenn der Benutzer den Sperrbildschirm aktiviert hat. Andernfalls wird diese Absicht niemals gesendet.
Referenzblog - Das Problem mit der ACTION_USER_PRESENT-Absicht von Android