Besoin d'un exemple de code sur la façon d'exécuter un service Android pour toujours en arrière-plan, même lorsque l'appareil dort, comme Whatsapp?

j'ai essayé divers moyens pour y parvenir, mais mon service finit par se faire tuer.

je veux utiliser AlarmManager pour déclencher un cours toutes les heures. Même si l'appareil est endormi, il devrait envoyer une alerte clignotante LED, la vibration ou le son. Dans tous les cas, ça devrait être pour toujours.

J'ai remarqué que Whatsapp est toujours en cours d'exécution, même si je tue toutes les applications en cours d'exécution et effacer la mémoire, mettre l'appareil pour dormir, et toujours Whatsapp recevoir des messages et m'alerte. Comment font-ils? Je veux faire la même chose avec mon application.

21
demandé sur zeeshan 2013-10-13 16:07:26

5 réponses

depuis que j'ai posté cette question, j'ai implémenté deux approches différentes de cette solution dans plusieurs applications.


approche 1

cet extrait provient d'une application où j'utilise des notifications push, qui nécessitent des appels de réveil instantanés pour l'appareil. Voici ce que j'ai à faire est de

  1. utiliser la permission WAKE_LOCK et
  2. utiliser un Wakelocker classe abstraite
  3. l'utiliser dans une Activité neededed:

manifeste:

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

WakeLocker de la classe:

public abstract class WakeLocker {
private static PowerManager.WakeLock wakeLock;

public static void acquire(Context context) {
    if (wakeLock != null) wakeLock.release();

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
            PowerManager.ACQUIRE_CAUSES_WAKEUP |
            PowerManager.ON_AFTER_RELEASE, "WakeLock");
    wakeLock.acquire();
}

public static void release() {
    if (wakeLock != null) wakeLock.release(); wakeLock = null;
}
}

exemple de classe D'activité:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Waking up mobile if it is sleeping
        WakeLocker.acquire(getApplicationContext());
        // do something
        WakeLocker.release();
}

approche 2

mieux lorsque vous voulez donner à Android contrôle sur wake up, et peut vivre avec périodiquement réveiller votre code. Il suffit d'utiliser un AlarmManager pour invoquer une classe de Service à intervalles réguliers. Voici un peu de code de mon LifeLog24 application:

MainActivity

Intent ll24 = new Intent(context, AlarmReceiverLifeLog.class);
    PendingIntent recurringLl24 = PendingIntent.getBroadcast(context, 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarms.setRepeating(AlarmManager.RTC_WAKEUP, first_log.getTime(), AlarmManager.INTERVAL_HOUR, recurringLl24); // Log repetition

Classe D'Alarme

public class AlarmReceiverLifeLog extends BroadcastReceiver {

    private static final String TAG = "LL24";
    static Context context;

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

        Log.v(TAG, "Alarm for LifeLog...");

        Intent ll24Service = new Intent(context, LifeLogService.class);
        context.startService(ll24Service);
    }
    }

et LifeLogService.la classe est où je fais mes trucs. L'alarme se réveille toutes les heures dans ce cas et déclenche L'émetteur qui, en retour, gère le service. Il y a plus que cela, pour s'assurer que le service n'est pas exécuté deux fois et ainsi de suite, mais vous obtenez le point comment il est fait. Et AlarmManager est en fait la meilleure façon de le faire puisque vous ne s'inquiéter de l'utilisation de la batterie, etc. et Android s'occupe de réveiller votre Service à intervalles réguliers.

20
répondu zeeshan 2016-05-16 10:29:29

C'est très simple.

les étapes:

1.créer une classe de Service.

2.créer une classe BroadcastReceiver

3.appelez BroadReceiver à onDestroy mode de service

4.In onReceive méthode du service de démarrage de classe BroadReceiver encore une fois.

Voici le code

Manifeste fichier:`

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".LauncherActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name=".utilities.NotificationService"
        android:enabled="true">

    </service>

    <receiver
        android:name=".utilities.RestartService"
        android:enabled="true"
        android:exported="true"
        android:label="RestartServiceWhenStopped"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action android:name="RestartService" />
        </intent-filter>
    </receiver>
</application>

`

classe de Service

public class NotificationService extends Service {
    public NotificationService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       super.onStartCommand(intent, flags, startId);
       return START_STICKY;
   }

   @Override
   public void onDestroy() {
       super.onDestroy();
       Intent restartService = new Intent("RestartService");
       sendBroadcast(restartService);
  }
}

classe de diffusion

public class RestartService extends BroadcastReceiver {

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

         context.startService(new Intent(context,NotificationService.class));
     }
 }
7
répondu Vignesh Viper 2017-06-20 18:05:36

suivez ces étapes faciles pour garder servce en vie pour toujours dans l'appareil android. 1. Appelez un service en utilisant alarm manager. 2. retourner START_STICKY dans la méthode onStart. 3. Dans sur appel detruce le gestionnaire d'alarme et le service de redémarrage en utilisant la méthode de startService. 4.(Optionnel)répéter le point numéro 3 dans la méthode onTaskRemoved.

1
répondu Syed Danish Haider 2017-09-17 12:11:08
<uses-permission android:name="android.permission.WAKE_LOCK" />

 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
mWakeLock.acquire();

onStartCommand retrun START_STICKY :

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId); 
        return START_STICKY;
    }
0
répondu Basbous 2013-10-13 12:20:00

vous pouvez utiliser une fonction startForeground (int, Notification)voir ici et ici

un service démarré peut utiliser l'API startForeground(int, Notification) mettre le service dans un État de premier plan, où le système considère il doit être quelque chose dont l'utilisateur est activement conscient et donc pas un candidat pour tuer quand la mémoire est faible. (Il est encore théoriquement possibilité de tuer le service sous une pression de mémoire extrême de l'application actuelle des connaissances nouvelles, mais dans la pratique cela devrait pas un sujet de préoccupation.)

-2
répondu Ricardo Pessoa 2014-09-16 11:49:48