我需要将活动上下文传递给onReceive
类的MyAlarmReceiver extends BroadcastReceiver
。为此,我在设置intent时传递上下文:
myAlarmManager.set(AlarmManager.RTC_WAKEUP, d.getTime(),
PendingIntent.getBroadcast(MainActivity.this, 1,
myIntentAlarm, PendingIntent.FLAG_ONE_SHOT));
但是,onReceive
中的上下文与myAlarmManager
中传递的上下文不同。为什么呢?
答案 0 :(得分:1)
提供给Context
的{{1}}与用于创建BroadcastReceiver
或您可以修改的任何内容的内容不同。它是BroadcastReceiver
的有限变体,并且是框架故意的。如果您在Context
中有任何重要事项,则需要启动自己的BroadcastReceiver
或使用其他机制来触发它。
答案 1 :(得分:0)
并且此上下文用于创建和显示AlertDialog
基于警报触发对话框对用户来说是相当危险的。您当时不知道用户正在做什么,并且对话框可能会干扰用户(例如,您在实时的逐向导航会话中弹出对话框)。请始终使用Notification
或根据用户偏好设置。
除此之外,在闹钟响起时,您不能再依赖原始MainActivity
实例了。毕竟,显而易见的是,如果您计划在一周后发生警报,那么您的原始活动实例将在销毁后很长时间。
欢迎您在活动巴士上发布活动(LocalBroadcastManager
,greenrobot的EventBus等)。这样,如果你做碰巧在前台有UI,它就可以显示对话框。而且,如果您不碰巧在前台有UI,您可以执行其他操作(例如,显示Notification
)。我有示例应用显示此for LocalBroadcastManager
和for greenrobot's EventBus。