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

时间:2016-01-23 09:36:09

标签: 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应该一直运行,所以我也让他在启动完成时启动。为此,我将以下内容添加到我的清单文件中:

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

我在mainActivity的onCreate()中运行函数initAlarmManager()。因此,如果应用程序启动,AlarmManager也会启动,一切正常。即使我通过主页按钮关闭我的应用程序,也可以通过最近的应用程序更改到另一个应用程序&#34;按钮,我的AlarmManager仍然会触发,虽然我的应用程序在后台,但我收到了通知。

我还在AlarmReceiver中运行函数initAlarmManager()。因此,如果我重新启动手机,接收器会被调用,看到我的AlarmManager为空并随后进入。所以一切都很好。

但这是我的问题:如果我按下&#34;在最近的应用程序之间进行更改&#34;按下并通过滑动关闭我的应用我的AlarmManager停止,我不会得到任何进一步的通知。这很奇怪,因为重新启动后我的应用程序也不会出现在最近的应用程序菜单中,但它可以正常工作。

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

所以真的没有办法完成我总是运行的AlarmManager,或者如果有办法,我该如何实现呢?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

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

我将我在BroadcastReceiver中所做的所有操作都移到了IntentService。所有BroadcastReceiver现在都在启动此IntentService。

当应用程序现在关闭时,将其从最近的应用程序菜单中移开,我的通知仍然会弹出。

感谢Muthu给我正确的提示!