web-dev-qa-db-fra.com

Android - Démarrer le service au démarrage

D'après tout ce que j'ai vu sur Stack Exchange et ailleurs, j'ai tout configuré correctement pour démarrer IntentService lors du démarrage d'Android OS. Malheureusement, cela ne commence pas au démarrage et je ne reçois aucune erreur. Peut-être que les experts peuvent aider ...

Manifeste:

<?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 for Startup:

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: J'ai essayé à peu près toutes les suggestions ci-dessous et j'ai ajouté une journalisation telle que Log.v("BatteryLogger", "Got to onReceive, about to start service"); au gestionnaire onReceive du StartupIntentReceiver, et rien n'est jamais enregistré. Donc, cela ne se rend même pas au BroadcastReceiver.

Je pense que je déploie l'APK et que je teste correctement. Il suffit d'exécuter Debug dans Eclipse et la console indique que l'installation est réussie sur ma tablette Xoom à l'adresse\BatteryLogger\bin\BatteryLogger.apk. Ensuite, pour tester, je redémarre la tablette, puis regarde les journaux dans DDMS et vérifie les Services en cours d'exécution dans les paramètres du système d'exploitation. Est-ce que tout cela semble correct ou est-ce que je manque quelque chose? Encore une fois, toute aide est très appréciée.

86
Gady

Eh bien voici un exemple complet d'une application AutoStart

Fichier AndroidManifest

<?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 - Ceci apparaîtra à chaque fois que vous démarrez l'appareil après avoir exécuté l'application une fois.

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

Votre service est peut-être en train de s'arrêter avant la fin, car l'appareil se met en veille après le démarrage. Vous devez d'abord obtenir un verrou de réveil. Heureusement, la bibliothèque de support nous donne une classe pour ce faire:

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

puis, dans votre service, assurez-vous de libérer le verrou de réveil:

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

N'oubliez pas d'ajouter l'autorisation WAKE_LOCK:

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

Suivre devrait fonctionner. J'ai vérifié. Peut-être que votre problème est ailleurs. 

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

Cela ressemble beaucoup à mine mais j'utilise le nom complet du paquet pour le récepteur:

<receiver Android:name=".StartupIntentReceiver">

J'ai:

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

J'ai eu du succès sans l'ensemble du forfait. Savez-vous où la chaîne d'appels est interrompue? Si vous déboguez avec Log(), à quel moment cela ne fonctionne-t-il plus?

Je pense que cela peut être dans votre IntentService, tout cela va bien.

1
Phix

Simplement pour faciliter la recherche, comme mentionné dans les commentaires, ceci n’est plus possible depuis 3.1 https://stackoverflow.com/a/19856367/6505257

0
MrKew