【问题标题】:WakeLock Mechanism唤醒锁机制
【发布时间】:2012-12-30 14:59:03
【问题描述】:

在我的应用程序中有一个广播接收器,它在特定时间由带有 RTC_WAKEUP 的警报调用。该接收器首先获取部分锁定,因此它不会终止,然后检查条件,如果为真,则启动一个活动,通过获取完整锁定和解锁键盘保护来完全打开手机。

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

  • 所以我想知道设备是否处于睡眠状态,活动会开始吗? 它可以获取全锁吗?

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

【问题讨论】:

  • 我认为你的应用被设计为在特定时间启动一个 Activity,就像原生闹钟 Activity 一样,不是吗?
  • @Huang 是的,这是一个提醒,但我想在开始活动之前检查简单的离线情况。是否有类似警报活动的源代码可供检查?我找不到一个。我想看看我做的是否正确。

标签: android


【解决方案1】:
  1. 如果要在 BroadcastReceiver 中启动 Activity,请不要忘记添加标志:FLAG_ACTIVITY_NEW_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);
            } 
    
     }
    
  2. 使用 FULL_WAKE_LOCK 强制打开屏幕,在 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();
    

【讨论】:

  • 这就是我所做的,我的问题是活动是否开始了?
  • 我读到的某个地方必须在电源唤醒锁之前完成禁用键盘保护,而在其他地方则相反,哪个更好?
  • @Ali 我写了一个类似警报的活动,我使用了上面的代码(首先在 onCreate() 中调用 disableKeyguard(),然后在 onResume() 中调用 wl.acquire())。它对我来说很好。
  • @Ali 我没有阅读AOSP的powermanager的源代码,我只是根据我的实践给出了答案。我无法回答背后的机制......
  • 键盘锁解锁有一个奇怪的行为。解锁后,首先调用 onresume,然后调用 onpause,然后再次调用 onresume。你知道吗?
【解决方案2】:

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

http://developer.android.com/google/gcm/gcm.html#handling_intents

我认为您必须在仍然处于 BroadcastReceiver#onReceive 的同时获得 WakeLock。他们在 IntentService 中使用静态 WakeLock。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多