Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onNewIntent()将在手机唤醒后才会启动_Android_Android Activity_Android Intent - Fatal编程技术网

Android onNewIntent()将在手机唤醒后才会启动

Android onNewIntent()将在手机唤醒后才会启动,android,android-activity,android-intent,Android,Android Activity,Android Intent,我发现了一些有趣的行为,但不知道为什么或如何避开它。 该活动是单任务活动,这意味着onNewIntent()用于该活动,而该活动位于堆栈顶部。当手机屏幕打开时,这项功能工作正常。但是,一旦屏幕关闭,直到手机处于“唤醒”状态并调用onNewIntent()时,才会收到新的意图。如果该活动不在堆栈顶部,并且手机处于休眠状态,则会启动该活动并调用onCreate()方法 该活动被宣布为: <activity android:name=".MyActivity" androi

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

该活动被宣布为:

<activity android:name=".MyActivity" 
          android:launchMode="singleTask" 
          android:alwaysRetainTaskState="true" >
但是,只有当手机处于堆栈顶部时处于唤醒状态,才会创建该活动。现在我很困惑,不知道从哪里开始。我的活动还使用onSaveInstanceState()。该活动是一个FragmentActivity,包含一个片段

任何帮助都将不胜感激

但是,只有当手机处于唤醒状态时,才会创建该活动 在堆栈的顶部

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

典型的模式是,你收到一些想要唤醒你的应用程序的意图,比如网络状态已经改变,或者别的什么。在你的接收器中,在
onHandleIntent()中,
你抓住了一个唤醒锁。您启动一个服务来做一些工作,服务完成后会释放唤醒锁

在您的情况下,向您的活动发送意图的接收者可以获取部分唤醒锁,然后您的活动可以获取屏幕唤醒锁。请记住,只要您按住唤醒锁,手机就无法入睡。。。使它使用更多的电池。出于这个原因,尾水锁是非常危险的东西

请注意,您必须关闭锁定手柄。如果在
onHandleIntent()
返回时没有保持唤醒锁,设备可以立即返回睡眠状态。所以会有点像

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

你也可以暂时抓住屏幕锁,然后释放它。。。屏幕将打开,然后根据显示超时设置正常关闭。

我曾想过这样做,但希望避免使用唤醒锁,除非我必须这样做。如果活动不在堆栈顶部,并且在手机处于睡眠状态时发送意图,则活动将启动,我不需要唤醒锁。我假设同一活动中的onNewIntent()将遵循相同的行为,但显然不是。我将尝试使用部分锁。这很奇怪,我同意,我认为活动是否位于堆栈顶部并不重要。让我知道你发现了什么。部分锁不好。该活动从未被调用,因此我无法获得屏幕锁定。已在接收器中使用wakelock使其工作。奇怪的是,只有当活动接收到新的意图时才需要唤醒锁。当没有收到新的意图或非标准活动时,设置窗口标志效果很好…谢谢!您不应该将锁交给活动,而应该能够用
acquire(毫秒)
在最短时间内获取它。根据doco:“确保设备在创建唤醒锁时处于所请求的级别。在给定超时过期后,锁将被释放”。因此,即使变量已超出范围或最终确定,设备仍应在采集期间处于唤醒状态。我使用了标志FULL_WAKE_LOCK和ACQUE_CAUSES_WAKEUP,并获得了1000毫秒。
receiver: acquire partial lock
activity: acquire screen lock
activity: release partial lock