web-dev-qa-db-de.com

Android - Startet den Dienst beim Booten

Nach allem, was ich auf Stack Exchange und anderswo gesehen habe, habe ich alles richtig eingerichtet, um einen IntentService zu starten, wenn das Android-Betriebssystem startet. Leider startet es nicht beim Booten und ich bekomme keine Fehler. Vielleicht können die Experten helfen ...

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
  package="com.phx.batterylogger"
  Android:versionCode="1"
  Android:versionName="1.0"
  Android:installLocation="internalOnly">

<uses-sdk Android:minSdkVersion="8" />
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.BATTERY_STATS" />

<application Android:icon="@drawable/icon" Android:label="@string/app_name">
    <service Android:name=".BatteryLogger"/>
    <receiver Android:name=".StartupIntentReceiver">  
        <intent-filter>  
            <action Android:name="Android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
</application>

</manifest>

BroadcastReceiver für den Start:

package com.phx.batterylogger;

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;

public class StartupIntentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(context, BatteryLogger.class);
        context.startService(serviceIntent);
    }
}

UPDATE: Ich habe fast alle unten aufgeführten Vorschläge ausprobiert und dem onReceive-Handler des StartupIntentReceiver die Protokollierung hinzugefügt, z. B. Log.v("BatteryLogger", "Got to onReceive, about to start service");, und nichts wird protokolliert. Es kommt also nicht mal zum BroadcastReceiver.

Ich denke, ich setze das APK bereit und teste es richtig. Ich habe nur Debug in Eclipse ausgeführt und die Konsole meldet, dass es erfolgreich auf meinem Xoom-Tablet unter\BatteryLogger\bin\BatteryLogger.apk installiert wird. Dann teste ich das Tablet neu und schaue mir dann die Protokolle in DDMS an und überprüfe die laufenden Dienste in den Betriebssystemeinstellungen. Klingt das alles richtig oder fehlt mir etwas? Auch hier wird jede Hilfe sehr geschätzt.

86
Gady

Hier ist ein vollständiges Beispiel für eine AutoStart-Anwendung

AndroidManifest-Datei

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="pack.saltriver" Android:versionCode="1" Android:versionName="1.0">

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

    <application Android:icon="@drawable/icon" Android:label="@string/app_name">

        <receiver Android:name=".autostart">
            <intent-filter>
                <action Android:name="Android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity Android:name=".hello"></activity>
        <service Android:enabled="true" Android:name=".service" />
    </application>
</manifest>

autostart.Java

public class autostart extends BroadcastReceiver 
{
    public void onReceive(Context context, Intent arg1) 
    {
        Intent intent = new Intent(context,service.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent)
        } else {
            context.startService(intent)
        }
        Log.i("Autostart", "started");
    }
}

service.Java

public class service extends Service
{
    private static final String TAG = "MyService";
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");
    }

    @Override
    public void onStart(Intent intent, int startid)
    {
        Intent intents = new Intent(getBaseContext(),hello.class);
        intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intents);
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStart");
    }
}

hello.Java - Dies wird jedes Mal angezeigt, wenn Sie das Gerät nach dem Ausführen des Applicaton einmal starten.

public class hello extends Activity 
{   
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Toast.makeText(getBaseContext(), "Hello........", Toast.LENGTH_LONG).show();
    }
}
255
Lalit Poptani

Ihr Service wird möglicherweise vor dem Abschluss heruntergefahren, da das Gerät nach dem Booten in den Ruhezustand wechselt. Sie müssen zuerst eine Wecksperre erhalten. Zum Glück gibt uns die Support-Bibliothek 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 in Ihrem Dienst sicher, dass Sie die Wecksperre aufheben:

    @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 Berechtigung WAKE_LOCK hinzuzufügen:

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
2
phreakhead

Folgendes sollte funktionieren. Ich habe verifiziert Möglicherweise liegt dein Problem woanders. 

public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("TAG", "MyReceiver");
        Intent serviceIntent = new Intent(context, Test1Service.class);
        context.startService(serviceIntent);
    }
}




public class Test1Service extends Service {
    /** Called when the activity is first created. */
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("TAG", "Service created.");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("TAG", "Service started.");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.d("TAG", "Service started.");
    }
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}




<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
      package="com.test"
      Android:versionCode="1"
      Android:versionName="1.0"
      Android:installLocation="internalOnly">
    <uses-sdk Android:minSdkVersion="8" />

    <application Android:icon="@drawable/icon" Android:label="@string/app_name">

    <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission Android:name="Android.permission.BATTERY_STATS" 
    />
<!--        <activity Android:name=".MyActivity">
            <intent-filter>  
                <action Android:name="Android.intent.action.MAIN" /> 
                <category Android:name="Android.intent.category.LAUNCHER"></category> 
            </intent-filter>
       </activity> -->
        <service Android:name=".Test1Service" 
                  Android:label="@string/app_name"
                  >
        </service>
        <receiver Android:name=".MyReceiver">  
            <intent-filter>  
                <action Android:name="Android.intent.action.BOOT_COMPLETED" /> 
            </intent-filter>  
        </receiver> 
    </application>
</manifest>
2
Vivek

Sieht sehr ähnlich zu mir , aber ich verwende den vollständigen Paketnamen für den Empfänger:

<receiver Android:name=".StartupIntentReceiver">

Ich habe:

<receiver Android:name="com.your.package.AutoStart"> 
1
ciscogambo

Ich hatte Erfolg ohne das vollständige Paket. Wissen Sie, wo die Anrufkette unterbrochen wird? Wenn Sie mit Log() debuggen, an welchem ​​Punkt funktioniert es nicht mehr?

Ich denke es kann in Ihrem IntentService sein, das sieht alles gut aus.

1
Phix

Um die Suche zu vereinfachen, wie in Kommentaren erwähnt, ist dies seit 3.1 https://stackoverflow.com/a/19856367/6505257 nicht möglich.

0
MrKew