需要关于如何在后台永远运行 Android 服务的代码示例,即使设备处于睡眠状态,例如 Whatsapp? [英] Need code example on how to run an Android service forever in the background even when device sleeping, like Whatsapp?

查看:34
本文介绍了需要关于如何在后台永远运行 Android 服务的代码示例,即使设备处于睡眠状态,例如 Whatsapp?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试了各种方法来实现这一点,但我的服务最终被终止了.

我想使用 AlarmManager 每隔一小时触发一次课程.即使设备处于睡眠状态,它也应该发出闪烁的 LED 警报、振动或声音.无论如何,它应该永远运行.

我注意到 Whatsapp 一直在运行,即使我杀死了所有正在运行的应用程序并清除内存,让设备进入睡眠状态,但 Whatsapp 仍然收到消息并提醒我.他们是怎么做的?我想对我的应用做同样的事情.

解决方案

注意:现在此答案仅对 ANDROID 7 及以下版本有效.自 Android 8 GOOGLE 改变了后台任务的处理方式

自从我发布这个问题以来,我已经在多个应用中实施了两种不同的解决方案.

<小时><块引用>

方法 1

此摘录来自我使用推送通知的应用程序,需要即时唤醒设备.这里我要做的是

  1. 使用 WAKE_LOCK 权限和
  2. 使用 Wakelocker 抽象类
  3. 根据需要在活动中使用它:

清单:

WakeLocker 类:

公共抽象类WakeLocker {私有静态 PowerManager.WakeLock 唤醒锁;公共静态无效获取(上下文上下文){if (wakeLock != null)wakeLock.release();PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);唤醒锁 = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |电源管理器.ACQUIRE_CAUSES_WAKEUP |PowerManager.ON_AFTER_RELEASE, "WakeLock");唤醒锁.获取();}公共静态无效释放(){if (wakeLock != null)wakeLock.release();唤醒锁 = 空;}}

活动类示例:

private final BroadcastReceiver receiver = new BroadcastReceiver() {@覆盖public void onReceive(上下文上下文,意图意图){//如果手机处于睡眠状态,则唤醒它WakeLocker.acquire(getApplicationContext());//做点什么WakeLocker.release();}

<小时><块引用>

方法 2

最适合希望让 Android 控制唤醒,并且可以接受定期唤醒您的代码.只需使用 AlarmManager 定期调用 Service 类.这是我的 LifeLog24 应用程序中的一些代码:

主活动

Intent ll24 = new Intent(context, AlarmReceiverLifeLog.class);PendingIntent recurringLl24 = PendingIntent.getBroadcast(context, 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT);AlarmManager 警报 = (AlarmManager) getSystemService(Context.ALARM_SERVICE);alarms.setRepeating(AlarmManager.RTC_WAKEUP, first_log.getTime(), AlarmManager.INTERVAL_HOUR, recurringLl24);//日志重复

报警类

public class AlarmReceiverLifeLog extends BroadcastReceiver {私有静态最终字符串标记 =LL24";静态上下文上下文;@覆盖public void onReceive(上下文上下文,意图意图){Log.v(TAG, "LifeLog 报警...");Intent ll24Service = new Intent(context, LifeLogService.class);context.startService(ll24Service);}}

而 LifeLogService.class 是我做事的地方.在这种情况下,警报每小时唤醒一次并触发 BroadcastReceiver,后者反过来运行服务.还有更多内容,以确保服务不会运行两次等等,但您明白它是如何完成的.而 AlarmManager 实际上是最好的方法,因为您不必担心电池使用等问题.Android 会负责定期唤醒您的服务.

I have tried various ways to achieve this, but my service eventually gets killed.

I want to use AlarmManager to trigger a class every one hour. Even if the device is sleeping, it should sent a flashing LED alert, vibration or sound. In any case, it should run forever.

I have noticed that Whatsapp is always running, even though I kill all the running apps and clear the memory, put the device to sleep, and still Whatsapp receive messages and alerts me. How are they doing it? I want to do the same with my app.

解决方案

NOTE: NOW THIS ANSWER IS ONLY VALID FOR ANDROID 7 AND BELOW. SINCE ANDROID 8 GOOGLE HAS CHANGED HOW BACKGROUND TASKS ARE HANDLED

Since I posted this question, I have implemented two different approaches to this solution into multiple apps.


APPROACH 1

This extract is from an app where I use push notifications, which need instant wake up calls for the device. Here what I do is

  1. use WAKE_LOCK permission and
  2. use a Wakelocker abstract class
  3. use it in an Activity as needed:

Manifest:

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

WakeLocker class:

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

Activity class example:

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


APPROACH 2

Best when you want to give Android control over wake up, and can live with periodically waking up your code. Simply use an AlarmManager to invoke a Service class at regular intervals. Here is some code from my LifeLog24 app:

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

Alarm Class

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

and LifeLogService.class is where I do my stuff. Alarm wakes up every hour in this case and triggers the BroadcastReceiver which in return runs the service. There is more to it, to make sure service is not run twice and so on, but you get the point how it is done. And AlarmManager is actually the best way to do it since you don't worry about battery usage, etc. and Android takes care of waking up your Service at regular intervals.

这篇关于需要关于如何在后台永远运行 Android 服务的代码示例,即使设备处于睡眠状态,例如 Whatsapp?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆