AlarmManager 在应用程序启动时安排警报
AlarmManager schedule Alarm on application start
这是一个非常愚蠢的问题,我仍然无法弄清楚 AlarmManager
在 Android 中是如何工作的。假设我想每半小时安排一个重复任务。我想安排在 activity 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);
}
现在我的问题是 OS 怎么知道这个闹钟 已经安排好了 ?我的意思是它不会在每次 activity 创建时安排一个新的,是吗?否则,在 10 activity 次启动后,我会每三分钟而不是半小时收到一次警报。请任何 Android 大师解释一下这个问题。
Now my question is how does OS knows that this alarm has already been scheduled?
AFAIK,它会寻找一个现有的警报来寻找等效的 PendingIntent
。这里,"equivalent PendingIntent
",我的意思是:
- 相同的操作(例如,
getBroadcast()
)
- 相同的 ID(
getBroadcast()
的第二个参数)
- 相当于
Intent
这里,"equivalent Intent
",我的意思是它们匹配所有的路由信息,在你的例子中是从this
和AlarmReceiver.class
生成的ComponentName
。额外的,特别是,在这里不计入等价。
这是一个非常愚蠢的问题,我仍然无法弄清楚 AlarmManager
在 Android 中是如何工作的。假设我想每半小时安排一个重复任务。我想安排在 activity 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);
}
现在我的问题是 OS 怎么知道这个闹钟 已经安排好了 ?我的意思是它不会在每次 activity 创建时安排一个新的,是吗?否则,在 10 activity 次启动后,我会每三分钟而不是半小时收到一次警报。请任何 Android 大师解释一下这个问题。
Now my question is how does OS knows that this alarm has already been scheduled?
AFAIK,它会寻找一个现有的警报来寻找等效的 PendingIntent
。这里,"equivalent PendingIntent
",我的意思是:
- 相同的操作(例如,
getBroadcast()
) - 相同的 ID(
getBroadcast()
的第二个参数) - 相当于
Intent
这里,"equivalent Intent
",我的意思是它们匹配所有的路由信息,在你的例子中是从this
和AlarmReceiver.class
生成的ComponentName
。额外的,特别是,在这里不计入等价。