Ich habe versucht, einen Dienst zu starten, wenn ein Gerät auf Android startet, aber ich kann es nicht zum Laufen bringen. Ich habe mir eine Reihe von Links online angesehen, aber keiner der Codes funktioniert. Vergesse ich etwas?
AndroidManifest.xml
<receiver
android:name=".StartServiceAtBootReceiver"
android:enabled="true"
android:exported="false"
android:label="StartServiceAtBootReceiver" >
<intent-filter>
<action android:name="android.intent.action._BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.test.RunService"
android:enabled="true" />
Rundfunkempfänger
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent serviceLauncher = new Intent(context, RunService.class);
context.startService(serviceLauncher);
Log.v("TEST", "Service loaded at start");
}
}
Antworten:
Die anderen Antworten sehen gut aus, aber ich dachte, ich würde alles in einer vollständigen Antwort zusammenfassen.
Sie benötigen Folgendes in Ihrer
AndroidManifest.xml
Datei:In deinem
<manifest>
Element:In Ihrem
<application>
Element (stellen Sie sicher, dass Sie einen vollständig qualifizierten [oder relativen] Klassennamen für Ihr Element verwendenBroadcastReceiver
):(Sie brauchen nicht die
android:enabled
,exported
etc., Attribute: die Android Vorgaben korrekt sind)In
MyBroadcastReceiver.java
:Aus der ursprünglichen Frage:
<receiver>
Element im<application>
Element befandBroadcastReceiver
angegeben wurde<intent-filter>
quelle
Als zusätzliche Information: BOOT_COMPLETE wird an Anwendungen gesendet, bevor der externe Speicher bereitgestellt wird . Wenn die Anwendung auf einem externen Speicher installiert ist, empfängt sie keine BOOT_COMPLETE-Broadcast-Nachricht.
Weitere Details finden Sie hier im Abschnitt Rundfunkempfänger, die auf "Start abgeschlossen" warten.
quelle
So starten Sie den Dienst beim Gerätestart (Autorun-App usw.)
Zum einen: Seit der Version Android 3.1+ erhalten Sie BOOT_COMPLETE nicht mehr, wenn der Benutzer Ihre App nie mindestens einmal gestartet hat oder der Benutzer die Anwendung "erzwingen". Dies wurde durchgeführt, um zu verhindern, dass Malware den Dienst automatisch registriert. Diese Sicherheitslücke wurde in neueren Versionen von Android geschlossen.
Lösung:
App mit Aktivität erstellen. Wenn der Benutzer es einmal ausführt, kann die App die Broadcast-Nachricht BOOT_COMPLETE empfangen.
Zum zweiten: BOOT_COMPLETE wird gesendet, bevor der externe Speicher bereitgestellt wird. Wenn die App auf einem externen Speicher installiert ist, empfängt sie keine BOOT_COMPLETE-Broadcast-Nachricht.
In diesem Fall gibt es zwei Lösungen:
Wenn Ihre App bereits im internen Speicher installiert ist, kann Ihnen der folgende Code helfen, den Dienst beim Gerätestart zu starten.
In Manifest.xml
Genehmigung:
Registrieren Sie Ihren BOOT_COMPLETED-Empfänger:
Registrieren Sie Ihren Service:
Im Empfänger OnBoot.java:
Für HTC müssen Sie diesen Code möglicherweise auch in Manifest hinzufügen, wenn das Gerät RECEIVE_BOOT_COMPLETED nicht abfängt:
Der Empfänger sieht jetzt so aus:
Wie kann man BOOT_COMPLETED testen, ohne den Emulator oder das reale Gerät neu zu starten? Es ist einfach. Versuche dies:
Wie erhalte ich die Geräte-ID? Liste der verbundenen Geräte mit IDs abrufen:
adb in ADT finden Sie standardmäßig in:
Genießen! )
quelle
Zusammen mit
auch verwenden,
HTC-Geräte scheinen BOOT_COMPLETED nicht zu fangen
quelle
android.intent.action.QUICKBOOT_POWERON
nur beim Wiederherstellen vom Fast Boot gesendet wird. Dies bedeutet, dass beim Wiederherstellen von Fast Boot keine Alarme zurückgesetzt werden müssen, da diese beibehalten werden. Daher ist die Verwendung nur erforderlich,<action android:name="android.intent.action.QUICKBOOT_POWERON" />
wenn Sie etwas tun möchten, wenn der Benutzer der Meinung ist, dass das Gerät gestartet wurde.Beachten Sie, dass am Anfang der Frage ein Tippfehler vorliegt:
<action android:name="android.intent.action._BOOT_COMPLETED"/>
Anstatt von :
<action android:name="android.intent.action.BOOT_COMPLETED"/>
ein kleines "_" und all diese Probleme :)
quelle
Ich habe gerade herausgefunden, dass es an der
Fast Boot
Option inSettings
> liegen könntePower
Wenn ich diese Option deaktiviert habe, empfängt meine Anwendung diese Sendung, jedoch nicht anders.
Übrigens habe ich
Android 2.3.3
weiterHTC Incredible S
.Ich hoffe es hilft.
quelle
Ich denke, Ihr Manifest muss hinzufügen:
quelle
Nachdem ich alle genannten Antworten und Tricks ausprobiert habe, finde ich endlich heraus, warum der Code in meinem Telefon nicht funktioniert. Einige Android-Handys wie "Huawei Honor 3C Android 4.2.2 " haben ein Statup Manager- Menü in ihren Einstellungen und Ihre App muss in der Liste überprüft werden. :) :)
quelle
Ich habe einen zusätzlichen
<category>
Tag, weiß nicht, ob das einen Unterschied macht.Haben Sie versucht, die if-Klausel wegzulassen
"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()
, da der Empfänger diese Absicht wahrscheinlich sowieso nur erhält?quelle
Siehe diesen Link http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Schrittweise Anleitung zur Verwendung von boot on Service
quelle
Vor dem Mounten des externen Speichers wird BOOT_COMPLETE ausgeführt. Wenn Ihre App auf einem externen Speicher installiert ist, wird keine BOOT_COMPLETE-Broadcast-Nachricht empfangen. Um dies zu verhindern, können Sie Ihre Anwendung im internen Speicher installieren. Sie können dies tun, indem Sie diese Zeile in menifest.xml hinzufügen
Einige HTC-Geräte können eine "Schnellstart" -Funktion aktivieren, die eher einem tiefen Ruhezustand und keinem echten Neustart ähnelt und daher nicht die Absicht BOOT_COMPLETE geben sollte. Um dies wiederherzustellen, können Sie diesen Absichtsfilter in Ihrem Empfänger hinzufügen:
quelle
Das habe ich getan
1. Ich habe die Empfängerklasse gemacht
2.in dem Manifest
3.und nach ALLEN MÜSSEN Sie den Empfänger in Ihrer MainActivity "einstellen", befindet er sich möglicherweise im onCreate
Der letzte Schritt, den ich von ApiDemos gelernt habe
quelle
Wenn Sie Android Studio verwenden und die automatische Vervollständigung sehr mögen, muss ich Sie informieren. Ich verwende Android Studio v 1.1.0 und habe die automatische Vervollständigung für die folgende Berechtigung verwendet
Und Android Studio wurde automatisch
RECEIVE_BOOT_COMPLETED
in Kleinbuchstaben ausgefüllt,receive_boot_completed
und ich zog mir immer wieder die Haare aus, weil ich bereits meine Checkliste für Aktivitäten zum Starten des Dienstes beim Booten angekreuzt hatte. Ich habe es gerade noch einmal bestätigtquelle
Wie @Damian kommentierte, machen alle Antworten in diesem Thread es falsch. Wenn Sie dies manuell tun, besteht die Gefahr, dass Ihr Dienst in der Mitte gestoppt wird, wenn das Gerät in den Ruhezustand wechselt. Sie müssen zuerst eine Wecksperre erhalten. Glücklicherweise gibt uns die Support-Bibliothek eine Klasse , um dies zu tun:
Stellen Sie dann in Ihrem Dienst sicher, dass die Wecksperre aufgehoben wird:
Vergiss nicht, die WAKE_LOCK-Berechtigung zu deinem Hauptfest hinzuzufügen:
quelle
onNewIntent()
? Oder Sie können sich die Quelle für IntentService ansehen und sehen, was Sie tun müssen, damit Ihr Service übereinstimmt ...Tatsächlich bin ich vor nicht allzu langer Zeit in dieses Problem geraten, und es ist wirklich sehr einfach zu beheben. Sie machen eigentlich nichts falsch, wenn Sie die
"android.intent.action.BOOT_COMPLETED"
Berechtigungs- und Absichtsfilter einrichten.Beachten Sie, dass Sie unter Android 4.X den Broadcast-Listener ausführen müssen, bevor Sie den Dienst beim Booten starten. Dies bedeutet, dass Sie zuerst eine Aktivität hinzufügen müssen, sobald Ihr Broadcast-Empfänger ausgeführt wird, sollte Ihre App wie erwartet funktionieren. Unter Android 4.X habe ich jedoch keine Möglichkeit gefunden, den Dienst beim Booten ohne Aktivität zu starten. Ich denke, Google hat dies aus Sicherheitsgründen getan.
quelle
Ich war mit diesem Problem konfrontiert, wenn ich den leeren Konstruktor in der Empfängerklasse belasse. Nach dem Entfernen des leeren Konstruktors funktionierte onRreceive Methos einwandfrei.
quelle