android - 即使 android 应用程序关闭,如何确保 AlarmManager 触发?

标签 android broadcastreceiver alarmmanager

我有一个应用应该每六小时从服务器更新/获取数据。为此,我通过以下方式制作了一个 AlarmManager:

public class Repository {

public static AlarmManager alarmManager;

public static void initAlarmManager(Context context){

    //start the update alarm manager
    Intent resultIntent = new Intent(context,AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0,  60 * 60 * 1000, pendingIntent);
}

我的 AlarmReceiver 现在必须寻找更新,如果有特定条件的新数据,它必须通过通知通知用户。这是我的 AlarmReceiver 的一部分:

public class AlarmReceiver extends BroadcastReceiver {

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

    if(Repository.ddfDb == null){
        Repository.initDdfDb(context);
    }

    if(Repository.alarmManager == null){
        Repository.initAlarmManager(context);
    }

    for(Episode episode : Repository.ddfDb.getListOfNextEpisodes()){
        Notification.showNotification(context,episode);
    }
}

因为我的 AlarmManager 应该一直运行,所以我让他在启动完成后也启动。为此,我将以下内容添加到我的 list 文件中:

<receiver android:name=".AlarmReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

我在 mainActivity 的 onCreate() 中运行函数 initAlarmManager()。因此,如果应用程序启动,AlarmManager 也会启动并且一切正常。即使我通过主页按钮关闭我的应用程序或通过“在最近的应用程序之间切换”按钮切换到另一个应用程序,我的 AlarmManager 仍然会触发并且我会收到通知,尽管我的应用程序在后台。

我还在我的 AlarmReceiver 中运行函数 initAlarmManager()。因此,如果我重新启动手机,接收器会被调用,发现我的 AlarmManager 为 null 并随后将其初始化。所以这里也一切正常。

但这是我的问题:如果我按下“在最近的应用程序之间切换”按钮并通过滑动关闭我的应用程序,我的 AlarmManager 将停止,我将不会收到任何进一步的通知。这很奇怪,因为在重新启动后我的应用程序也没有出现在最近的应用程序菜单中,但它在那里工作。

我在谷歌上搜索了很多,有些人说这是不可能的,因为如果用户真的想关闭应用程序,他必须能够这样做。我理解这一点,因为它提供了针对病毒应用程序的安全性。但我也看到像 WhattsApp 这样的应用程序能够始终通知用户。

那么真的没有办法完成我一直运行的 AlarmManager 吗?或者如果有办法,我该如何实现?

提前致谢!

最佳答案

我通过以下方式解决了这个问题:

我将在 BroadcastReceiver 中执行的所有操作都移到了 IntentService 中。 BroadcastReceiver 现在所做的就是启动这个 IntentService。

当应用程序现在通过从最近的应用程序菜单中滑动关闭时,我的通知仍然会弹出。

感谢 Muthu 给我正确的提示!

关于android - 即使 android 应用程序关闭,如何确保 AlarmManager 触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34961855/

相关文章:

java - WorkManager 一次执行 enqueueUniquePeriodicWork() 多次?

android - 实例化 PagerAdapter Android

javascript - 如何检查 Cordova 应用程序是否在 12(AM/PM)或 24 小时环境中运行

Android ACTION_VIEW 多张图片

Android 小部件 + 服务

android - 如何检查重复闹钟是否在 android 中处于 Activity 状态?

android - 在不耗尽电池的情况下保持服务清醒

android - 捕获 "page finished loading"事件并使用 xwalk webview 在 ionic/cordova MainActivity.java 中做一些事情

android - 屏幕锁定后更新 UI

Android USB枚举