我的应用程序需要每小时执行一项特定任务。应用程序是否正在运行、暂停甚至关闭都没有关系。
当应用程序正在运行或暂停时,我可以通过调度一个 AlarmManager 广播接收器来做到这一点。但是当应用程序关闭时,我必须调用“unregisterReceiver”来不泄露意图,并且应用程序永远不会被唤醒(或其他东西)来处理任务。
那么,问题来了:如何安排一个我不需要注销的alarmmanager任务,这样即使我的应用程序关闭也会调用它?
我的应用程序需要每小时执行一项特定任务。应用程序是否正在运行、暂停甚至关闭都没有关系。
当应用程序正在运行或暂停时,我可以通过调度一个 AlarmManager 广播接收器来做到这一点。但是当应用程序关闭时,我必须调用“unregisterReceiver”来不泄露意图,并且应用程序永远不会被唤醒(或其他东西)来处理任务。
那么,问题来了:如何安排一个我不需要注销的alarmmanager任务,这样即使我的应用程序关闭也会调用它?
用于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>
您需要为此调用一个 Android 组件Service
。从服务代码中,您可以使用具有 PendingIntent 类的 AlarmManager 每小时安排您的任务。由于您的 AlarmManger 在服务组件中声明,它不需要任何 GUI,并且会在后台执行,直到您的设备中有电池。