【问题标题】:onNewIntent() will not fire until phone is awakeonNewIntent() 在手机唤醒之前不会触发
【发布时间】:2012-03-28 00:52:25
【问题描述】:

我发现了一些有趣的行为,但不知道为什么或如何解决它。 该活动是一个单任务活动,这意味着 onNewIntent() 用于该活动,而该活动位于堆栈顶部。这很好用,在手机屏幕打开时。然而,一旦屏幕关闭,直到手机“唤醒”并且此时调用 onNewIntent() 时才会接收到新意图。如果 Activity 不在栈顶且手机处于睡眠状态,则启动 Activity 并调用 onCreate() 方法。

Activity 声明为:

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

Activity 也使用 FLAG_ACTIVITY_NEW_TASK 标志启动。意图是从广播接收器启动的。如果手机处于睡眠状态并且意图被广播,则活动会使用以下标志唤醒手机:

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

但是,直到手机处于堆栈顶部时唤醒时才会创建活动。现在我很困惑,不知道从哪里开始。我的活动也使用 onSaveInstanceState()。 Activity 是一个 FragmentActivity,包含一个 Fragment。

任何帮助将不胜感激!

【问题讨论】:

    标签: android android-activity android-intent


    【解决方案1】:

    但是,直到手机唤醒时才会创建活动 位于栈顶。

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

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

    典型的模式是您收到一些唤醒应用程序的意图,例如网络状态发生了变化,或者其他什么。在您的接收器中,在onHandleIntent(), 中,您获取了一个唤醒锁。你启动一个服务做一些工作,服务完成后释放唤醒锁。

    在您的情况下,向您的 Activity 发送 Intent 的接收器可以获取部分唤醒锁,然后您的 Activity 可以获取屏幕唤醒锁。请记住,只要您按住唤醒锁,手机就无法睡眠......导致它使用更多的电池。出于这个原因,唤醒锁是非常危险的事情。

    请注意,您必须解除锁定。如果onHandleIntent() 返回时您没有保持唤醒锁定,则设备可以立即重新进入睡眠状态。所以它会是这样的,

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

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

    【讨论】:

    • 我正在考虑这样做,但是除非绝对必须,否则我想避免使用唤醒锁。当活动不在堆栈顶部并且在手机处于睡眠状态时发送意图时,活动开始并且我不需要唤醒锁。我假设同一活动中的 onNewIntent() 将遵循相同的行为,但显然不是。我打算试试部分锁定。
    • 这很奇怪,同意,我认为活动是否位于堆栈顶部并不重要。告诉我你发现了什么。
    • 部分锁定不走运。该活动从未被调用,因此我无法获得屏幕锁定。
    • 让它与接收器中的唤醒锁一起工作。奇怪的是,仅当活动接收新意图时才需要唤醒锁。当没有收到新的意图或设置非标准活动时,窗口标志工作得很好......谢谢!
    • 您应该能够使用acquire(milliseconds) 在最短的时间内获得它,而不是将锁交给活动。根据文档:“确保设备处于创建唤醒锁时请求的级别。锁定将在给定的超时到期后释放”。因此,即使变量超出范围或最终确定,设备在获取的时间段内仍应处于唤醒状态。我使用了标志 FULL_WAKE_LOCK 和 ACQUIRE_CAUSES_WAKEUP,并获得了 1000 毫秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多