我发现了一些有趣的行为,但不知道为什么或如何解决它。
该活动是一个单任务活动,这意味着 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 并且包含一个片段。
任何帮助将不胜感激!
但是,直到手机唤醒时才会创建活动
位于堆栈顶部。
据我所知,这是设计使然。唤醒手机并使其保持唤醒状态的唯一方法是获取唤醒锁。
http://developer.android.com/reference/android/os/PowerManager.WakeLock.html http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
典型的模式是您收到一些唤醒应用程序的意图,例如网络状态已更改或其他什么。在您的接收器中,在onHandleIntent(),
你抓住了一个唤醒锁。您启动一个服务来执行某些工作,该服务在完成后会释放唤醒锁。
在您的情况下,向您的活动发送意图的接收器可以获取部分唤醒锁,然后您的活动可以获取屏幕唤醒锁。请记住,只要您按住唤醒锁,手机就无法睡眠......导致它使用更多的电池。因此,唤醒锁是非常危险的事情。
请注意,您必须将锁移开。如果您在以下情况下没有保持唤醒锁onHandleIntent()
返回后,设备可以立即返回睡眠状态。所以它会是这样的,
receiver: acquire partial lock
activity: acquire screen lock
activity: release partial lock
您也可以暂时锁定屏幕,然后释放它......屏幕会根据显示超时设置正常打开,然后关闭。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)