Android 尾流锁定机构

Android 尾流锁定机构,android,Android,在我的应用程序中,有一个广播接收器,它在特定时间被带有RTC_唤醒的警报调用。此接收器首先获取部分锁定,使其不会终止,然后检查条件,如果条件属实,则启动一项活动,通过获取完全锁定和解锁键盘将手机完全打开 经过一点测试和试用,我发现广播接收器的生命周期在开始活动之前就结束了,一旦结束,部分锁就被释放 因此,我想知道如果设备处于睡眠状态,那么活动是否会如此开始 它可以获得全锁吗 或者,一旦广播接收器结束,设备就会返回到 睡眠和活动的开始推迟到它再次醒来时 如果要在BroadcastReceive

在我的应用程序中,有一个广播接收器,它在特定时间被带有RTC_唤醒的警报调用。此接收器首先获取部分锁定,使其不会终止,然后检查条件,如果条件属实,则启动一项活动,通过获取完全锁定和解锁键盘将手机完全打开

经过一点测试和试用,我发现广播接收器的生命周期在开始活动之前就结束了,一旦结束,部分锁就被释放

  • 因此,我想知道如果设备处于睡眠状态,那么活动是否会如此开始 它可以获得全锁吗

  • 或者,一旦广播接收器结束,设备就会返回到 睡眠和活动的开始推迟到它再次醒来时

  • 如果要在BroadcastReceiver中启动活动,请不要忘记添加标志:flag\u Activity\u NEW\u TASK

     public void onReceive(Context context, Intent i) {
      if (check condition) {
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         intent.setClass(context,THE_ACTIVTY_YOU_WANT_TO_START.class);
        context.startActivity(intent);
            } 
    
     }
    
  • 使用完整的_WAKE_锁强制打开屏幕,在onCreate()方法中添加下面的代码

    pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    
        km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        kl = km.newKeyguardLock("info");
        wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                | PowerManager.ACQUIRE_CAUSES_WAKEUP
                | PowerManager.ON_AFTER_RELEASE, "info");
        kl.disableKeyguard();
    

  • 在浏览GCM手册时,我发现了以下章节:


    我认为你必须在广播接收机接收时获得唤醒锁。他们在IntentService中使用静态唤醒锁。

    我认为你的应用程序设计为在特定时间启动活动,就像本机警报活动一样,不是吗?@Huang是的,这是一个提醒,但我想在启动活动之前检查简单的脱机条件。是否有类似报警活动的源代码可供检查?我找不到。我想看看我是否做得对。这就是我所做的,我的问题是活动是否开始了?在我读到的某个地方,禁用keyguard必须在通电唤醒锁之前完成,而在其他地方则相反,哪一个更好?@Ali我写了一个类似警报的活动,我使用了上面的代码(调用disableKeyguard()首先是onCreate(),然后是onResume()中的wl.acquire()。这对我来说很好。@Ali我没有阅读AOSP的powermanager的源代码,我只是根据自己的实践给出了答案。我无法回答它背后的机制…钥匙护卫解锁有一种奇怪的行为。解锁后,首先调用onresume,然后调用onpause,然后再次调用onresume。你知道这件事吗?