如何确保即使android应用程序关闭,AlarmManager也会启动?

如何确保即使android应用程序关闭,AlarmManager也会启动?,android,broadcastreceiver,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 Inten

我有一个应用程序,应该每六个小时更新/获取服务器数据。为此,我通过以下方式制作了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也会启动,一切正常。即使我通过“主页”按钮关闭我的应用程序,或通过“在最近的应用程序之间更改”按钮更改为另一个应用程序,我的AlarmManager仍会启动,我会收到通知,尽管我的应用程序在后台

我还在AlarmReceiver中运行函数initAlarmManager()。因此,如果我重新启动手机,接收器会被呼叫,看到我的AlarmManager为空,然后初始化它。所以这里的一切都很好

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

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

那么,是否真的没有办法实现我一直运行的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);
}
我将在BroadcastReceiver中执行的所有操作移动到IntentService。BroadcastReceiver现在所做的就是启动此IntentService

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


感谢穆图给我正确的暗示

出于调试原因,在alarm Receiver中干杯,或者这已经确保了我的AlarmManager始终运行?请尝试使用即使在应用程序关闭后它也将运行的服务。但它可能会耗尽电池电量。在我的清单中使用android:process=“:remote”怎么样?这能解决我的问题吗?