android - onNewIntent() 在手机唤醒之前不会触发

标签 android android-activity android-intent

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

Activity 声明为:

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

Activity 也以 FLAG_ACTIVITY_NEW_TASK 标志启动。 Intent 是从广播接收器启动的。如果手机处于 sleep 状态并且广播了 Intent ,则该 Activity 会使用以下标志唤醒手机:

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

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

如有任何帮助,我们将不胜感激!

最佳答案

However the activity is not created until the phone is awake when it is on the top of the stack.

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

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

典型的模式是您收到一些 Intent 来唤醒您的应用程序,例如网络状态已更改或其他。在您的接收器中,在 onHandleIntent() 中,您获取了一个唤醒锁。你启动一个服务来做一些工作,服务完成后释放唤醒锁。

在您的情况下,向您的 Activity 发送 Intent 的接收者可以获取部分唤醒锁,然后您的 Activity 可以获取屏幕唤醒锁。请记住,只要您按住唤醒锁,手机就无法休眠……导致它消耗更多电池。因此,唤醒锁是非常危险的事情。

请注意,您必须关闭锁。如果您在 onHandleIntent() 返回时没有持有唤醒锁,设备会立即返回 sleep 状态。所以它会是这样的,

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

您也可以暂时锁定屏幕,然后松开……屏幕会亮起,然后根据显示超时设置正常熄灭。

关于android - onNewIntent() 在手机唤醒之前不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9899751/

相关文章:

android - 我如何显示然后删除 android 进度对话框

android - 在抽象类中获取应用上下文

android - 使 Snackbar 向上推 View

android - 为什么要从android Activity生命周期方法中调用父类(super class)方法?

android - 如何启动相机 Intent 并保存非压缩图片

java - Android Studio 如何检查 ImageView 是否已经显示图像,如果是则禁用 Intent

Android "Support Screens"不工作?

Android Lint 提示 Activity 未在 AndroidManifest 中注册,但它是

android - 在其他应用程序编写的服务中获取任何应用程序的前台 Activity

android - 如何锁屏 Android