处理FLAG_ACTIVITY_NEW_TASK的onNewIntent

时间:2012-03-22 04:12:11

标签: java android android-intent notifications

我让Activity在singleTop模式和C2DM接收器中运行。在某些通知中,我需要运行该活动,并且我这样做:

Intent activity = new Intent(context, klass);
activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(activity);

当活动如果背景(例如之前按下Home按钮),一切正常。 但是当我按下电源按钮关闭屏幕时,无法通知运行活动有关某些更改(onNewIntent从未调用过)。

如何通知有关通知的正在运行的活动?

2 个答案:

答案 0 :(得分:4)

Skayred, 我相信我的情况完全相同。然而,我注意到当手机睡着并且新的意图被发送到活动时,它将不会启动活动,直到屏幕打开(为了我的目的,我希望屏幕打开)。

我的解决方案是在我的C2DM接收器中获取唤醒锁。

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,     TAG);
mWakeLock.acquire();

当然,请务必在活动中使用mWakeLock.release()释放锁。

这是一种奇怪的行为,似乎与其他Android活动行为不一致。在我的情况下,我使用singleTask活动(我不确定你使用什么类型的活动,你没有说明)。如果堆栈顶部没有活动实例,并且手机处于睡眠状态,我的活动将启动,我可以在onCreate()中使用以下内容:

getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

但是,如果活动位于堆栈顶部且手机处于睡眠状态,则在我打开屏幕之前不会启动活动。希望这适合你。如果您不需要屏幕,我会尝试使用其他标志为唤醒锁。

答案 1 :(得分:1)

根据您的配置,这应该有效:

  • 将应用程序类构建为单例,稍后您可以轻松访问它
  • 给它一个数据成员,这是一个数据模型,它可以从C2DM通知接收器和所有活动中访问
  • 根据observable-Observer设计模式
  • 构建数据模型
  • C2DM通知将更改模型
  • 活动,onCreate将插入一个事件监听器,在onDestroy
  • 期间拔掉插头
  • 当模型更改时,它会向所有侦听器和活动发出事件,当他们收到事件时,更新他们的UI

这也是在您的应用中获得更好设计的好机会。