如何确保即使 android 应用程序关闭也能触发 AlarmManager?
How to ensure that an AlarmManager fires even if the android app is closed?
我有一个应用程序应该每六小时 update/get 来自服务器的数据。为此,我通过以下方式制作了一个 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 应该 运行 一直 我让他在启动完成时也启动。为此,我将以下内容添加到我的清单文件中:
<receiver android:name=".AlarmReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
我 运行 mainActivity 的 onCreate() 中的函数 initAlarmManager()。因此,如果应用程序启动,AlarmManager 也会启动并且一切正常。即使我通过主页按钮关闭我的应用程序或通过 "change between recent apps" 按钮切换到另一个应用程序,我的 AlarmManager 仍然会触发并且我会收到通知,尽管我的应用程序在后台。
我还在我的 AlarmReceiver 中 运行 函数 initAlarmManager()。因此,如果我重新启动我的 phone,接收器将被调用,看到我的 AlarmManager 为 null 并在之后初始化它。所以这里也一切正常。
但这是我的问题:如果我按下 "change between recent apps" 按钮并滑动关闭我的应用程序,我的 AlarmManager 将停止,我将不会收到任何进一步的通知。这很奇怪,因为在重新启动后我的应用程序也没有出现在最近的应用程序菜单中,但它在那里工作。
我谷歌了很多,有些人说这是不可能的,因为如果用户真的想关闭应用程序,他必须能够这样做。我理解这一点,因为它提供了针对病毒应用程序的安全性。但我也看到像 WhattsApp 这样的应用程序能够总是 通知用户。
所以真的没有办法完成我总是 运行ning AlarmManager 或者如果有办法,我该如何实现它?
提前致谢!
我通过以下方式解决了这个问题:
我将在 BroadcastReceiver 中执行的所有操作都移到了 IntentService 中。 BroadcastReceiver 现在所做的就是启动这个 IntentService。
当应用程序现在通过从最近的应用程序菜单中滑动关闭时,我的通知仍然会弹出。
感谢 Muthu 给我正确的提示!
我有一个应用程序应该每六小时 update/get 来自服务器的数据。为此,我通过以下方式制作了一个 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 应该 运行 一直 我让他在启动完成时也启动。为此,我将以下内容添加到我的清单文件中:
<receiver android:name=".AlarmReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
我 运行 mainActivity 的 onCreate() 中的函数 initAlarmManager()。因此,如果应用程序启动,AlarmManager 也会启动并且一切正常。即使我通过主页按钮关闭我的应用程序或通过 "change between recent apps" 按钮切换到另一个应用程序,我的 AlarmManager 仍然会触发并且我会收到通知,尽管我的应用程序在后台。
我还在我的 AlarmReceiver 中 运行 函数 initAlarmManager()。因此,如果我重新启动我的 phone,接收器将被调用,看到我的 AlarmManager 为 null 并在之后初始化它。所以这里也一切正常。
但这是我的问题:如果我按下 "change between recent apps" 按钮并滑动关闭我的应用程序,我的 AlarmManager 将停止,我将不会收到任何进一步的通知。这很奇怪,因为在重新启动后我的应用程序也没有出现在最近的应用程序菜单中,但它在那里工作。
我谷歌了很多,有些人说这是不可能的,因为如果用户真的想关闭应用程序,他必须能够这样做。我理解这一点,因为它提供了针对病毒应用程序的安全性。但我也看到像 WhattsApp 这样的应用程序能够总是 通知用户。
所以真的没有办法完成我总是 运行ning AlarmManager 或者如果有办法,我该如何实现它?
提前致谢!
我通过以下方式解决了这个问题:
我将在 BroadcastReceiver 中执行的所有操作都移到了 IntentService 中。 BroadcastReceiver 现在所做的就是启动这个 IntentService。
当应用程序现在通过从最近的应用程序菜单中滑动关闭时,我的通知仍然会弹出。
感谢 Muthu 给我正确的提示!