344 Stimmen

Versuchen, einen Dienst beim Booten unter Android zu starten

Ich habe versucht, einen Dienst zu starten, wenn ein Gerät unter Android hochfährt, aber ich kann es nicht zum Laufen bringen. Ich habe mir eine Reihe von Links im Internet angesehen, aber keiner der Codes funktioniert. Habe ich etwas vergessen?

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" />

BroadcastReceiver

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");
    }
}

4voto

Jaichander Punkte 802

Diesen Link empfehlen http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Schritt-für-Schritt-Verfahren zur Verwendung von Boot on Service

3voto

Md. Sajedul Karim Punkte 6961

Vor dem Einhängen des externen Speichers wird BOOT_COMPLETE gesendet. Wenn Ihre Anwendung auf dem externen Speicher installiert ist, wird sie die BOOT_COMPLETE-Broadcast-Nachricht nicht erhalten. Um dies zu verhindern, können Sie Ihre Anwendung im internen Speicher installieren. Dazu müssen Sie nur diese Zeile in menifest.xml hinzufügen

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly"
... >

Einige HTC-Geräte können eine "Schnellstart"-Funktion aktivieren, die eher einem tiefen Ruhezustand als einem echten Neustart gleicht und daher nicht die Absicht BOOT_COMPLETE auslösen sollte. Um dies wiederherzustellen, können Sie diesen Intent-Filter in Ihrem Empfänger hinzufügen:

            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>

2voto

phreakhead Punkte 13829

Wie @Damian schon sagte, sind alle Antworten in diesem Thread falsch formuliert. Wenn Sie es manuell machen, besteht das Risiko, dass Ihr Dienst mitten im Schlafmodus des Geräts gestoppt wird. Sie müssen zuerst eine Aufwecksperre erhalten. Glücklicherweise ist die Support-Bibliothek gibt uns eine Klasse um dies zu tun:

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Intent service = new Intent(context, SimpleWakefulService.class);

        // Start the service, keeping the device awake while it is launching.
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        startWakefulService(context, service);
    }
}

Stellen Sie dann sicher, dass Sie in Ihrem Dienst die Nachlaufsperre lösen:

    @Override
    protected void onHandleIntent(Intent intent) {
        // At this point SimpleWakefulReceiver is still holding a wake lock
        // for us.  We can do whatever we need to here and then tell it that
        // it can release the wakelock.

...
        Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

Vergessen Sie nicht, die WAKE_LOCK-Berechtigung zu Ihrem Mainfest hinzuzufügen:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

1voto

David Hx Punkte 125

In der Tat, ich habe dieses Problem vor nicht allzu langer Zeit, und es ist wirklich sehr einfach zu beheben, Sie eigentlich nichts falsch machen, wenn Sie die Einstellung "android.intent.action.BOOT_COMPLETED" Erlaubnis und Absichtsfilter.

Achten Sie darauf, dass Sie unter Android 4.X den Broadcast-Listener ausführen müssen, bevor Sie den Dienst beim Booten starten, d.h. Sie müssen zuerst eine Aktivität hinzufügen, sobald Ihr Broadcast-Empfänger läuft, 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X