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

611voto

Timo Bruck Punkte 7574

Die anderen Antworten sehen gut aus, aber ich dachte, ich fasse alles in einer vollständigen Antwort zusammen.

Sie benötigen folgende Angaben in Ihrem AndroidManifest.xml Datei:

  1. In Ihrem <manifest> Element:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  2. In Ihrem <application> Element (stellen Sie sicher, dass Sie einen vollqualifizierten [oder relativen] Klassennamen für Ihre BroadcastReceiver ):

    <receiver android:name="com.example.MyBroadcastReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>

    (Sie brauchen nicht die android:enabled , exported usw., Attribute: die Android-Standardeinstellungen sind korrekt)

    Unter MyBroadcastReceiver.java :

    package com.example;
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent startServiceIntent = new Intent(context, MyService.class);
            context.startService(startServiceIntent);
        }
    }

Zur ursprünglichen Frage:

  • Es ist nicht klar, ob die <receiver> Element war in der <application> Element
  • ist es nicht klar, ob der korrekte vollqualifizierte (oder relative) Klassenname für die BroadcastReceiver wurde festgelegt
  • Es gab einen Tippfehler in der <intent-filter>

85voto

inazaruk Punkte 73187

Als zusätzliche Information: BOOT_COMPLETE wird an Anwendungen gesendet avant externer Speicher montiert ist. Wenn die Anwendung also auf einem externen Speicher installiert ist, wird sie keine BOOT_COMPLETE-Broadcast-Nachricht erhalten.

Mehr Details aquí im Abschnitt Broadcast-Empfänger hören auf "Boot abgeschlossen"

70voto

user3439968 Punkte 3238

Wie startet man einen Dienst beim Hochfahren des Geräts (Autorun-App usw.)?

Erstens: Seit der Version Android 3.1+ erhalten Sie kein BOOT_COMPLETE mehr, wenn der Benutzer Ihre App nicht mindestens einmal gestartet hat oder wenn der Benutzer "force clos

S

C

F

I

  1. I
  2. I

I


I

P

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

R

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

R

<service android:name="org.yourapp.YourCoolService" />

I

public class OnBoot extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);

    }

 }

F

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

R

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

H

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

H

adb devices

a

adt-installation-dir/sdk/platform-tools

E

34voto

Tony Punkte 2094

Zusammen mit

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

auch verwenden,

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

HTC-Geräte scheinen BOOT_COMPLETED nicht zu erkennen

20voto

Evgeny Erlihman Punkte 448

Beachten Sie, dass sich am Anfang der Frage ein Tippfehler eingeschlichen hat:

<action android:name="android.intent.action._BOOT_COMPLETED"/>

anstelle von:

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

ein kleines "_" und der ganze Ärger :)

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