【问题标题】:AlarmManager schedule Alarm on application startAlarmManager 在应用程序启动时安排警报
【发布时间】:2016-05-06 16:38:47
【问题描述】:

这是一个非常愚蠢的问题,我仍然无法弄清楚AlarmManager 在 Android 中是如何工作的。假设我想每半小时安排一次重复任务。我想把它安排在活动onCreate()。我做这样的事情:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        AlarmManager.INTERVAL_HALF_HOUR,
        AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);
}

现在我的问题是操作系统如何知道这个警报已经安排好了?我的意思是它不是在每次活动创建时都安排一个新的,是吗?否则,在 10 次活动启动后,我会每三分钟而不是半小时收到一次警报。请任何 Android 专家解释一下这个问题。

【问题讨论】:

    标签: android alarmmanager repeatingalarm android-os-handler


    【解决方案1】:

    现在我的问题是操作系统如何知道此警报已被安排?

    AFAIK,它会查找等效 PendingIntent 的现有警报。这里,“等效PendingIntent”是指:

    • 相同的操作(例如,getBroadcast()
    • 相同的 ID(getBroadcast() 的第二个参数)
    • 等价的Intent

    在这里,“等效Intent”是指它们匹配所有路由信息,在您的情况下是从thisAlarmReceiver.class 生成的ComponentName。尤其是附加项,在此不算作等价。

    【讨论】:

    • 所以它只是跳过安排闹钟还是取消以前的?
    • @LuciusHipan:应该是取消了之前的闹钟,就好像你打电话给cancel()一样。由于cancel()PendingIntent 作为要取消的警报的唯一标识符,因此每个PendingIntent 只能有一个警报。
    • 所以这意味着,如果我在 OnCreate() 中安排了 10 分钟,但我在 8 分钟后再次打开应用程序,则警报不会在 2 分钟后触发?
    • @LuciusHipan:我没想到会这样。我最近没有尝试过这个特定的场景,所以我忘记了 Android 是否在这里做了一些意想不到的事情。
    • 我刚刚尝试过,它的行为就像我说的那样......很遗憾,文档中没有任何地方出现这个问题。我想知道有多少开发人员面临不准确的基于警报的事件。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多