7

私のアクティビティは、受信した Bluetooth データを継続的に処理しているため、部分的な wake lock で実行されます。wake lock は次のように設定されます。

  powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
  wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
  wakeLock.acquire();

特定のイベントが発生したときに、ユーザーがステータスを確認できるようにディスプレイに表示したいと考えています。ユーザーがキーを押すのではなく、ディスプレイを自動的にオンにしたい。しかし、これを行う試みはすべて失敗しました。部分的な wake lock での実行中にディスプレイがオフになると、ディスプレイを元に戻してユーザーに現在のアクティビティを表示しようとする試みが失敗しました。ユーザーアクティビティを偽造してみました:

PowerManager NewPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
   NewPowerManager.userActivity(1, false);

ウィンドウのフラグの設定:

 Window win = getWindow();
  win.setFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

さらに、ウェイクロックを解放して、画面をオンにする別の起動を開始します。

if (wakeLock != null)
   {
      wakeLock.release(); // release the wakelock
   }
PowerManager.WakeLock TempWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK |
   PowerManager.ACQUIRE_CAUSES_WAKEUP, "TempWakeLock");
   // tried | PowerManager.ON_AFTER_RELEASE to no avail
   TempWakeLock.acquire();

ここに欠けているものはありますか?新しいアクティビティを開こうとしているのではなく、現在のアクティビティをユーザーに表示しているだけです。他の誰かがこれを行うことができましたか? あなたが私に与えることができるどんな助けにも感謝します.

4

1 に答える 1

9

HTC の Lance によるデモ コードを見て、ようやくこの問題を解決することができました (ちなみにありがとう)。

秘密は、ACQUIRE_CAUSES_WAKEUP を設定して追加の完全なウェイクロックを作成することのようです。元の部分的な wake lock は解放しませんが、ディスプレイをオンにしたい場合は、新しい完全な wake lock を作成し、自分の作業を行ってから、新しい完全な wake lock を解放します。これは実際に機能します!

PowerManager TempPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock TempWakeLock = TempPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | 
PowerManager.ON_AFTER_RELEASE, "TempWakeLock");
TempWakeLock.acquire();

// do the work that needs the visible display...

// Release the newest wakelock and fall back to the old one
TempWakeLock.release();
于 2012-07-06T19:34:36.010 に答える