2015-11-14 14 views
10

Geeの投稿のDianne Hackbornからのコメントが「文書化」されている場合、明らかに半文書化された動作です:https://plus.google.com/+AndroidDevelopers/posts/94jCkmG4jff通知アイコンドーズモード中にウェイクロックを維持することが許可されるべきである。DozeモードのフォアグラウンドサービスでWake Lockを無効にする - Android Mの新しいバッテリ最適化M

フォアグラウンドサービスに加えてトップアクティビティがある場合、これは有効ではないようです。

は私が実証最小限の実装を作成する必要があり、この: https://github.com/petrnalevka/dozetest/blob/master/src/com/urbandroid/doze/DozeService.java

問題が
AndroidのM上で再現することができ

、MRA58Kネクサス5とMRA58Nネクサス6

マイフォアグラウンドサービス関連する通知があり、私は部分的な起床ロックを保持します。残念ながらDozeモードが引き継がれ、起床ロックが壊れています。私は、バッテリーの最適化からのオプトアウト、またはトップアクティビティから離れることでこれを防ぐことができました。

フォアグラウンドサービスがウェイクロックを維持する理由はないが、トップにアクティビティがある場合はないため、これはAndroidのバグだと思う。

私は、これは明らかにのみ、現時点でREQUEST_REMOVAL_FROM_PLAYSTORE_BY_GOOGLEを意味REQUEST_IGNORE_BATTERY_OPTIMIZATIONSを必要としないためにcrutial機能であるとしても、私はすでにここhttps://code.google.com/p/android/issues/detail?id=193802の回避策を見つけるためにAndrodiの課題追跡にこれを報告しているSO上でこの問題を入れています。ここで

は、私は+ダイアンHackbornからヒントにADB感謝を使用して問題を再現することができた方法です:

また、私のアプリを実行しているフォアグラウンドサービスを持ちながら、私はフォアグラウンドでの活動を維持する際に認識されているようです私は家に押し、私は状態に入る活動ままにしておくと

PARTIAL_WAKE_LOCK    'Doze lock' DISABLED (uid=10112, pid=24649, ws=null) 
ProC# 0: fore F/A/TS trm: 0 24649:com.urbandroid.doze/u0a112 (top-activity) 

:パワーマネージャによってとして

PARTIAL_WAKE_LOCK    'Doze lock' (uid=10112, pid=24649, ws=null) 
ProC# 4: prcp F/S/SF trm: 0 24649:com.urbandroid.doze/u0a112 (fg-service) 
+0

サービスが稼動しているため、画面がいつオフになったかを監視するために監視できるブロードキャストがある'startActivity()'を使ってホーム画面を表示することができます(つまり、自分自身をバックグラウンドに移動させることができます)。 'ACTION_SCREEN_OFF'が聞くべき正しい放送であるかどうかわかりません。 – CommonsWare

+0

私は同様の方向性を考えていました。ホーム画面は標準的な意図を持った良い候補です。これをテストして報告します。 –

+0

ホームスクリーンonScreenOffのインテントを呼び出して、私のアクティビティをonScreenOnに戻したいと考えました。また、adbテストに基づいて正常に動作しているようです。驚いたことに、Nexus 5ではあまりにも奇妙に見えません。ランチャーは、画面をオンにするとすぐに点滅します。私は今実際のドーズモードテストを行うでしょう。数時間を要します。私は実際にこれが十分に信頼できるかどうかについては怒っています。 –

答えて

6

をこれがansweですrはDianne Hackbornの投稿https://plus.google.com/+AndroidDevelopers/posts/94jCkmG4jffに掲載されています。プロセスを分離することは必ずしも容易ではない可能性があるので、ここではより多くの回避策をブレーンストーミングすることができます。

Dianne Hackborn: + Petr Nalevka申し訳ありませんが、これはプラットフォームのバグのようです。可能であれば、私はそれを修正するように見ていきます。

あなたの回避策は正しい方向ですが、画面のオン/オフで状態を動かすことでそのようなことをしないでください。さて、画面が消えると背面に移動しても構いませんが、画面がオンになると前面に強制的に移動するのは間違いです。カメラの起動、ボイスインタラクションなど)。これは実際にはおそらくプラットホームが自分自身を守る上でより良くなるべきものです。

私が提案するのは、開始するにはドーズモードを聞いて、その場合はあなたのアクティビティをバックに置くことです。あなたはブロードキャストを聞いてhttp://developer.android.com/reference/android/os/PowerManager.html#ACTION_DEVICE_IDLE_MODE_CHANGEDを実行し、アイドル状態のデバイスが真であると分かったときに自分自身を送り返すことでそれを行うことができます。私は、フォアグラウンドに戻ろうと心配しないことをお勧めします。ユーザーが実際に自分のデバイスを長時間使用していない場合、これが起こります。驚きです。

EDIT(Dianne Hackborn):実際には、別のソリューション - 前景サービスをアクティビティとは別のプロセスで実行してください。私が見ることから、これはうまくいくでしょう。私はあなたがそこで希望の行動を取るかどうかを見て興味深いでしょう。

また、これは実際にはこの状況で推奨される方法です。長期にわたるフォアグラウンドサービスを使用している場合は、アクティビティとは別のプロセスに配置する必要があります。活動を維持する必要があります。 (これは、このバグが解決した理由です。すべてのアプリでこのパターンが使用されています)。

+0

私の場合は、他のプロセスでフォアグラウンドサービスがあり、 "adb shell dumpsys"と呼ばれるので、フォアグランドサービスを別々のプロセスで実行すると、DozeとApp Standbyの両方が防止されますか? deviceidle force-idle "私のpartialWakeLockとWifiLockがリリースされました。 –

関連する問題