处理FLAG_ACTIVITY_NEW_TASK的onNewIntent

5

我有一个以singleTop模式运行的Activity和C2DM接收器。在某些通知中,我需要运行该Activity,并通过以下方式实现:

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

当应用在后台运行时(例如按下Home键),一切都正常。但是当我按下电源键关闭屏幕时,正在运行的应用程序可能无法被通知到某些更改(onNewIntent从未被调用)。

我该如何通知正在运行的应用程序有关通知的信息?


我建议不要仅在onCreate中更新UI,而是也要使用onResume。然而,我觉得这个问题太模糊了,我不确定我们是否已经得到了回答所需的所有东西。请提供一些活动代码,主要方法。 - Snicolas
手机被锁定,活动似乎在前台而未重新启动,onResumeonCreateonNewIntent没有被调用。 - skayred
您可以考虑使用某些网络锁定的服务,以确保您仍然收到C2DM通知。 - Snicolas
通知功能正常,我已经成功接收到了。我的问题是如何通知正在运行的活动有关某些更改的信息。我尝试处理从startActivity调用的onNewIntent,但它不起作用。 - skayred
遇到了完全相同的问题。当一个 singletask activity 在栈顶时,如果在手机睡眠时发送了新的 intent,则 onNewIntent() 直到屏幕唤醒后才会被调用。我的问题已经发布在这里:https://dev59.com/42LVa4cB1Zd3GeqPsggs - Patrick Jackson
2个回答

4
我相信我遇到了完全相同的情况。然而,当手机睡眠并且新的意图被发送到活动时,它不会启动活动,直到屏幕开启(为了我的目的,我希望屏幕一直开启)。
我的解决办法是在我的C2DM接收器中获取一个唤醒锁。
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,     TAG);
mWakeLock.acquire();

当然,在您的Activity中一定要使用mWakeLock.release()释放锁。

这种行为很奇怪,似乎与其他Android Activity的行为不一致。在我的情况下,我正在使用一个singleTask activity(我不确定您使用的是哪种类型的activity,您没有说明)。如果堆栈顶部没有Activity实例,并且手机处于休眠状态,我的Activity将启动,我可以在onCreate()中使用以下代码:

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

然而,如果活动在堆栈的顶部且手机处于睡眠状态,则在我打开屏幕之前不会启动该活动。希望这对您有用。如果您不需要打开屏幕,我建议尝试使用其他唤醒锁标志。


1
根据您的配置,这应该可以工作:
  • 构建一个应用程序类作为单例,稍后您可以轻松访问它
  • 给它一个数据成员作为数据模型,它将从C2DM通知接收器和所有活动中都可以访问
  • 根据可观察-观察者设计模式构建您的数据模型
  • C2DM通知将更改模型
  • 在onCreate中,活动将插入事件侦听器,在onDestroy期间取消插入
  • 当模型发生变化时,它会向所有侦听器和活动触发事件,当它们接收到事件时,更新其UI

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接