Android AlarmManager 为什么调用BroadcastReceiver?

Android AlarmManager why calling BroadcastReceiver?

我目前正在开发一个处理警报的应用程序。我已经达到可以使用 AlarmManager 设置警报的地步,并且一切似乎都正常,但是..在我找到的所有示例中,甚至在 Android 官方文档中,我看到人们使用BroadcastReceiver 用于 PendingIntent,然后在警报触发时调用 activity 或他们需要的任何内容。但是,我尝试将一个简单的 activity 传递给 AlarmManager 的 PendingIntent,如下所示:

Intent intent = new Intent (getApplicationContext(), AlarmActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity (this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set (AlarmManager.RTC_WAKEUP, timeToTrigger.getTimeInMillis(), pendingIntent);

在多个上下文中测试警报后(应用在前台,应用不是 运行,等等)我发现 activity 总是被正确调用。

所以,我的疑问很简单:为什么人们使用 BroadcastReceiver 并在 onReceive 方法中调用 activity 如果你可以直接简单地调用 activity?

Android 对这种行为表示不满。如果他正在做其他事情,你不应该打断他。这就是您不想从 AlarmManager 启动 Activity 的原因。通常,你发布一个 BroadcastReceiver,如果它想引起用户的注意,它会 post 一个 Notification。然后,用户可以随时通过 Notification 打开应用程序。

此外,通常您只想执行一些后台进程(例如从服务器获取数据或更新一些统计信息),这不需要任何用户交互。在这种情况下,您还会启动 BroadcastReceiverService 而不是 Activity.

从 Android10 开始,对后台应用程序启动活动有更多限制。因此,在 Android 的当前版本中,执行此操作变得更加困难。参见 https://developer.android.com/guide/components/activities/background-starts

所以基本上,即使它确实有效,也不被认为是“尊重用户”,并且将来可能不会有效。