android - 需要有关如何在后台永久运行 Android 服务的代码示例,即使设备处于休眠状态,例如 Whatsapp?

标签 android service alarmmanager background-process

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

我想使用 AlarmManager 每隔一小时触发一次类(class)。即使设备处于 sleep 状态,它也应该发送闪烁的 LED 警报、振动或声音。无论如何,它应该永远运行。

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

最佳答案

注意:现在此答案仅适用于 ANDROID 7 及更低版本。由于 Android 8 谷歌改变了后台任务的处理方式

自从我发布这个问题以来,我已经在多个应用程序中实现了两种不同的方法来解决这个问题。


APPROACH 1

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

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

list :

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

WakeLocker 类:

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 类示例:

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

最好让 Android 控制唤醒,并且可以忍受定期唤醒您的代码。只需使用 AlarmManager 定期调用服务类。这是我的 LifeLog24 应用程序中的一些代码:

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

报警等级

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

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

关于android - 需要有关如何在后台永久运行 Android 服务的代码示例,即使设备处于休眠状态,例如 Whatsapp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19345008/

相关文章:

android - 使用 algolia 在 firestore 中进行全文搜索

java - 安卓 : Camera's dimensions doesn't match screen's dimensions

android - 每分钟运行的服务

android - Intent.putExtras 不一致

android - 如何避免 `getNotification` 被弃用?

android - InAppBrowser 不会在 ionic 全屏模式下播放 Youtube 视频

安卓图像切换器

rest - 是否可以缓存服务器对服务器 HTTP POST 请求的响应?

安卓 : how to get result back from service in the launching activity

java - Android AlarmManager 启动带有铃声的服务