在电话醒来之前,onNewIntent()不会触发

时间:2012-03-28 00:52:25

标签: android android-activity android-intent

我发现了一些有趣的行为,不知道为什么或如何绕过它。 活动是单一任务活动,这意味着onNewIntent()用于活动,而活动位于堆栈顶部。当手机的屏幕亮起时,可以正常工作。然而,一旦屏幕关闭,在手机“清醒”之前不会收到新意图,此时会调用onNewIntent()。如果活动不在堆栈顶部且手机处于睡眠状态,则启动活动并调用onCreate()方法。

活动声明为:

<activity android:name=".MyActivity" 
          android:launchMode="singleTask" 
          android:alwaysRetainTaskState="true" >

还会使用FLAG_ACTIVITY_NEW_TASK标志启动活动。意图是从广播接收器发起的。如果手机处于睡眠状态且意图被广播,则活动会用这些标志唤醒手机:

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

但是,当手机处于堆叠顶部时,手机处于唤醒状态时才会创建活动。现在我很困惑,不知道从哪里开始。我的活动也使用onSaveInstanceState()。活动是FragmentActivity并包含一个片段。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

  

但是,直到手机处于唤醒状态时才会创建活动   在堆栈的顶部。

据我所知,这是设计的。唤醒手机并使其保持清醒的唯一方法是抓住唤醒锁。

http://developer.android.com/reference/android/os/PowerManager.WakeLock.html

典型的模式是你有一些唤醒应用程序的意图,比如网络状态已经改变,或者其他什么。在您的接收器中,在onHandleIntent(),中,您可以获得唤醒锁。您启动服务以完成某项工作,服务在完成后释放唤醒锁。

在您的情况下,将意图发送到您的活动的接收器可以获取部分唤醒锁定,然后您的活动可以获取屏幕唤醒锁定。请记住,只要你拿着唤醒锁,手机就无法入睡......导致它使用更多的电池。因此,唤醒锁是非常危险的事情。

请注意,您必须关闭锁定手。如果在onHandleIntent()返回时未保持唤醒锁定,则设备可以立即返回睡眠状态。所以它就像是,

receiver: acquire partial lock
activity: acquire screen lock
activity: release partial lock

您也可以暂时抓住屏幕锁定,然后将其释放......屏幕会亮起,然后根据显示超时设置正常关闭。