1

我想在特定时间唤醒一项活动。为此,我(也)在 Boot Complete BroadcastReceiver 上注册了 AlarmManager。

据我所知,只有服务可以永远在后台存活以唤醒活动。活动和广播接收器可能因不活动而死。

我拥有的以下代码没有运行服务。但是,它似乎正在工作(即使我在 24 小时后启动它,警报也会起作用)。这安全吗?还是我应该启动一项服务?如果这可以安全使用,这背后的逻辑是什么?为什么由 BroadcastReceiver 创建的 AlarmManger 不会被 Android 生命周期管理器销毁?

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            registerAlarm(context);
        }
    }

    private void registerAlarm(Context context)
    {
        Intent intent = new Intent(context, Alarm.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager am =(AlarmManager)context.getSystemService(Activity.ALARM_SERVICE);
        long nextAlarm = System.currentTimeMillis() + 10000; //Some time later.
        am.set(AlarmManager.RTC_WAKEUP, nextAlarm, pendingIntent);
    }
}
4

2 回答 2

3

这安全吗?

AlarmManager不在乎PendingIntent你用的是哪种。

用户可能会或可能不会喜欢突然出现的活动,但这是一个单独的问题。

据我所知,只有服务可以永远在后台存活以唤醒活动。

服务不会永远持续下去。

活动和广播接收器可能因不活动而死。

不会。您的流程可能会“因不活动而死亡”,其中包括该流程中的所有组件。

为什么由 BroadcastReceiver 创建的 AlarmManger 不会被 Android 生命周期管理器销毁?

因为AlarmManager是系统服务,由操作系统维护,而不是由您的应用程序维护。

于 2013-03-05T18:54:26.140 回答
0

服务可以随时被 Android 杀死。有关可用于在 android 上触发重复任务或长时间运行任务的选项的详细分析,请查看此线程 - Scheduling recurring task in Android

于 2013-03-05T18:52:07.327 回答