2

我的应用程序需要每小时执行一项特定任务。应用程序是否正在运行、暂停甚至关闭都没有关系。

当应用程序正在运行或暂停时,我可以通过调度一个 AlarmManager 广播接收器来做到这一点。但是当应用程序关闭时,我必须调用“unregisterReceiver”来不泄露意图,并且应用程序永远不会被唤醒(或其他东西)来处理任务。

那么,问题来了:如何安排一个我不需要注销的alarmmanager任务,这样即使我的应用程序关闭也会调用它?

4

2 回答 2

3

用于AlarmManager.setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)此。将类型设置为AlarmManager.RTC_WAKEUP以确保设备在睡眠时被唤醒(如果这是您的要求)。

像这样的东西:

    Intent intent = new Intent("com.foo.android.MY_TIMER");
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
    long now = System.currentTimeMillis();
    long interval = 60 * 60 * 1000; // 1 hour
    manager.setRepeating(AlarmManager.RTC_WAKEUP, now + interval, interval,
        pendingIntent); // Schedule timer for one hour from now and every hour after that

您将 PendingIntent 传递给此方法。您无需担心 Intent 泄漏。

AlarmManager.cancel()当您不再需要它时,请记住通过调用来关闭警报。

不要为此在代码中注册接收器。只需在<intent-filter>您的 BroadcastReceiver 的清单条目中添加一个标签,如下所示:

    <receiver android:name=".MyReceiver">
        <intent-filter>
            <action
                    android:name="com.foo.android.MY_TIMER"/>
        </intent-filter>
    </receiver>
于 2012-05-30T15:15:16.597 回答
0

您需要为此调用一个 Android 组件Service。从服务代码中,您可以使用具有 PendingIntent 类的 AlarmManager 每小时安排您的任务。由于您的 AlarmManger 在服务组件中声明,它不需要任何 GUI,并且会在后台执行,直到您的设备中有电池。

于 2012-05-30T15:07:18.677 回答