web-dev-qa-db-fra.com

Android - Service de démarrage au démarrage

Je dois démarrer un service au moment du démarrage. J'ai beaucoup cherché. Ils parlent de Broadcastreceiver. Comme je suis nouveau dans le développement de Android, je n’ai pas eu une idée précise des services sur Android. Veuillez fournir du code source.

106
harish

Créez un BroadcastReceiver et enregistrez-le pour recevoir ACTION_BOOT_COMPLETED . Vous avez également besoin de la permission RECEIVE_BOOT_COMPLETED .

Lire: écoute et diffusion de messages globauxet définition des alarmes

94
Peter Knego

Votre récepteur:

public class MyReceiver extends BroadcastReceiver {   

    @Override
    public void onReceive(Context context, Intent intent) {

     Intent myIntent = new Intent(context, YourService.class);
     context.startService(myIntent);

    }
}

Votre AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
      package="com.broadcast.receiver.example"
      Android:versionCode="1"
      Android:versionName="1.0">
    <application Android:icon="@drawable/icon" Android:label="@string/app_name" Android:debuggable="true">

        <activity Android:name=".BR_Example"
                  Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <!-- Declaring broadcast receiver for BOOT_COMPLETED event. -->
        <receiver Android:name=".MyReceiver" Android:enabled="true" Android:exported="false">
            <intent-filter>
                <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

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

</manifest>
191
Vladimir Ivanov

Il est possible d'enregistrer votre propre service d'application pour qu'il démarre automatiquement lorsque le périphérique a été démarré. Vous en avez besoin, par exemple, lorsque vous souhaitez recevoir des événements Push d'un serveur HTTP et que vous souhaitez informer l'utilisateur dès qu'un nouvel événement se produit. L'utilisateur n'a pas à démarrer l'activité manuellement avant le démarrage du service ...

C'est assez simple. Donnez d'abord à votre application l'autorisation RECEIVE_BOOT_COMPLETED. Ensuite, vous devez enregistrer un BroadcastReveiver. Nous l'appelons BootCompletedIntentReceiver.

Votre fichier Manifest.xml devrait maintenant ressembler à ceci:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
 package="com.jjoe64">
 <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>
 <application>
  <receiver Android:name=".BootCompletedIntentReceiver">
   <intent-filter>
    <action Android:name="Android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
  </receiver>
  <service Android:name=".BackgroundService"/>
 </application>
</manifest>

La dernière étape consiste à implémenter le récepteur. Ce récepteur ne fait que démarrer votre service d’arrière-plan.

package com.jjoe64;

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.SharedPreferences;
import Android.preference.PreferenceManager;

import com.jjoe64.BackgroundService;

public class BootCompletedIntentReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if ("Android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
   Intent pushIntent = new Intent(context, BackgroundService.class);
   context.startService(pushIntent);
  }
 }
}

De http://www.jjoe64.com/2011/06/autostart-service-on-device-boot.html

32
appsthatmatter

Il manque un élément important à la plupart des solutions publiées ici: le faire sans verrouillage de sillage présente le risque que votre service soit tué avant la fin du traitement. Vu cette solution dans un autre fil, répondant ici aussi.

Depuis WakefulBroadcastReceiver est obsolète dans api 26, il est recommandé pour les niveaux d'API inférieurs à 26

Vous devez obtenir un verrou de réveil. Heureusement, le la bibliothèque de support nous donne une classe pour le 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 et d'enregistrer votre destinataire dans le manifeste:

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

...

<service Android:name=".SimpleWakefulReceiver">
    <intent-filter>
        <action Android:name="com.example.SimpleWakefulReceiver"/>
    </intent-filter>
</service>
15
phreakhead

vous devez vous inscrire à BOOT_COMPLETE ainsi que REBOOT

<receiver Android:name=".Services.BootComplete">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            <action Android:name="Android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver> 
5
Raafat Alhoumaidy

Enregistrez également votre service créé dans le Manifest et utilisez-permission en tant que

<application ...>
   <service Android:name=".MyBroadcastReceiver">
        <intent-filter>
            <action Android:name="com.example.MyBroadcastReciver"/>
        </intent-filter>
   </service>
</application>
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>

et puis dans le casting reçu appelez votre service

public class MyBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent myIntent = new Intent(context, MyService.class);
        context.startService(myIntent);
    }
}
1
SoftEye

Enregistrez d'abord un destinataire dans votre fichier manifest.xml:

    <receiver Android:name="com.mileagelog.service.Broadcast_PowerUp" >
        <intent-filter>
            <action Android:name="Android.intent.action.ACTION_POWER_CONNECTED" />
            <action Android:name="Android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>

puis écrivez une émission pour ce récepteur comme:

public class Broadcast_PowerUp extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
        Toast.makeText(context, "Service_PowerUp Started",
                Toast.LENGTH_LONG).show();


    } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {



        Toast.makeText(context, "Service_PowerUp Stoped", Toast.LENGTH_LONG)
        .show();
    }
  }
}
0
Manoj Tarkar