繁体   English   中英

处理FLAG_ACTIVITY_NEW_TASK的NewIntent

[英]Handling onNewIntent for FLAG_ACTIVITY_NEW_TASK

我的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 )。

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

Skayred,我相信我的情况完全一样。 但是,我注意到当手机处于睡眠状态并且向活动发送了新的意图时,直到屏幕打开(在我看来,我希望屏幕处于打开状态),它才可以启动活动。

我的解决方案是在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活动行为不一致。 就我而言,我使用的是singleTask活动(我不确定您使用的是哪种类型的活动,您没有说明)。 如果堆栈顶部没有该活动的实例,并且电话处于睡眠状态,则我的活动将开始,我可以在onCreate()中使用以下内容:

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

但是,如果该活动位于堆栈的顶部,并且电话处于睡眠状态,则在我打开屏幕之前该活动才开始。 希望这对您有用。 如果不需要打开屏幕,我会尝试使用其他标志来唤醒。

根据您的配置,这应该可以工作:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM