問題タブ [android-doze-and-standby]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - アプリがバッテリー最適化のホワイトリストに載っているときに居眠りモードで Wi-Fi を使用するにはどうすればよいですか?
現在、Bluetoothペリフェラルからセンサー値を読み取り、バックエンドサーバーに送信するAndroidアプリに取り組んでいます。画面がオフになっているときにこのアプリが動作するようにするには、部分的な wake lock を取得し、ユーザーがアプリをバッテリー最適化のホワイトリストに追加します。他に選択肢がない場合にのみバッテリーのホワイトリストを使用する必要があることはわかっていますが、この記事の最後にある表で説明されているように、私の使用例ではそれが唯一の解決策のようです: https://developer.android .com/training/monitoring-device-state/doze-standby . この表には、「アプリのコア機能が、周辺機器にインターネット アクセスを提供する目的で、周辺機器との永続的な接続を維持している」場合に、ホワイトリストがアプリに受け入れられるソリューションであると記載されています。
これは私のユースケースを正確に説明しています。
ただし、アプリケーションをデバッグすると、画面がオフになり、Bluetooth API がまだ通知を受信しているときにアプリが中断されていないため、ウェイクロックが有効になっていることがわかります。ただし、数分間表示した後、wifi が機能しなくなり、すべての要求が「保留中」の状態のままになります。これは、wifi の代わりにモバイル ネットワークを使用している場合にも発生します。ネットワークが再び利用可能になるまで受信データをバッファリングしようとしましたが、ユーザーがデバイスのロックを再度解除する前にアプリがメモリ不足になる可能性があるため、これを有効な解決策とは考えていません。
Android 7より前のAndroidバージョンでは、アプリはwifiロックを使用して、その特定のアプリケーションでwifiを機能させ続けることができることを読みました。Android バージョン 8 または 9 に同様の機能はありますか? または、Wi-Fiを起動しておくために見逃したデバイス設定に構成オプションがありますか?
ユース ケースは Android 開発者の記事で説明されているため、まったく同じことを行うアプリを誰かが既に実装していることを示唆しています。これを実現する方法を示すコード例はありますか?
私のモバイル アプリは、cordova を使用して実装されています。アプリを起動し続けるために、次のプラグインを試しました。
wake lock の場合: cordova-plugin-powermanagement: 1.0.5 以降。
アプリをホワイトリストに追加するようユーザーに促します: cordova-plugin-doze-optimize: 0.5.4 以上。
android - Android - 強制 DozeMode または AppStandByMode を無効にする
ForegroundService
を使用して位置情報の更新をサーバーに送信するアプリケーションがあります。基本的にトラッカー。
これForegroundService
には、 ( postDelayedHandler
を使用して) 定期的にコード ブロックを実行して位置情報を送信する があります。
これは、アプリがフォアグラウンドにあり、バックグラウンドにある場合でも完全に正常に機能しますが、電話がロックされ、画面が約 15 分間オフになっていると、遅延に気付き始めました。つまり、ユーザーの操作がなく、充電器が接続されていない状態が 15 分間続くということです。
これは、Android Q (v10)デバイスで発生しています。これは、Oreo 以降を実行しているすべてのデバイスでも発生すると想定しています。
明確にしましょう...私のアプリは30秒ごとに場所を送信しますが、DozeModeまたはAppStandByModeであると思われるものを入力すると、場所を送信し続けますが、2分ごと(多かれ少なかれ)です。画面をオンにするか、充電器を差し込むと、すぐに 30 秒のペースに戻ります。それが、DozeModeまたはAppStandByModeについて私が気にする理由です。さらに、充電器を差し込んだまま電話をそのままにしておくと、これは決して起こりません.
前述のように、DozeModeまたはAppStandByModeが作動していることは確かであり、それを防ぐためにアプリをホワイトリストに登録できることはわかっています。しかし、さらに先に進む前に、アプリの動作をテストするたびに 15 分間待たずにこれを再現したいと考えています。
だから私はこれを強制する方法を「ググって」、ここに私が見つけたものがあります:
用DozeMode
(ソースを参照)
adb shell dumpsys バッテリーの取り外し
adb shell dumpsys deviceidle step deep
そして、 IDLE状態になるまで最後のコマンドを実行し続けます。
用AppStandByeMode
(ソースを参照)
adb shell dumpsys バッテリーの取り外し
adb shell am set-inactive packageName true
そして、この別のコマンドで状態を照会します。
adb shell am get-inactive packageName
Idle = trueを返すことを確認しました
また、この他のブログが示唆するように、以下を発行しています。
adb shell dumpsys deviceidle 強制アイドル
私はこのモードに入っていなかったのですが、今はそうなっているようで、抜け出せません... アップデートを参照してください
アップデート
最初は DozeMode に入っていないと思っていました...今は入っていることを確認できますが、常にすぐにトリガーされます。(もう15分待つ必要はありません)
電話をロックして画面がオフになると、自動的に居眠りモードになり、位置情報の更新間隔が開始されます。充電器を差し込んで、30 秒後にもう一度送信します。
私は試しました:
adb shell dumpsys deviceidle unforce
adb shell dumpsys deviceidle 無効化
adb shell dumpsys バッテリーリセット
それでも同じです。
また:
- 電話の電源を落として電源を入れる
- アプリをアンインストールする
- アプリの設定内でバッテリーの最適化を NOT OPTIMZE に変更します
私はステップを逃しましたか?
android - Android の webview でソケット接続を開いたままにする
Web ビューで起動することにより、現在 Android アプリで使用されている Web アプリがあります。Android 機能のほとんどはネイティブであり、webview 部分は主に socket.io を介した通信専用です。
すべて問題なく動作しますが、電話機がスリープ状態になるとすぐに、数分後にソケット接続が切断されます。この接続は着信メッセージに使用されるため、接続を維持するには接続が必要です。
フォアグラウンド サービスを作成してキープアライブとして使用しようとしましたが、ソケット接続が webview にあるため、何をしても閉じられます。つまり、サービスは有効なままで、新しいネットワーク接続を確立できますが、できます既存のアプリ接続を維持しないでください。
電話が居眠りしているときに webview ソケット接続を維持する方法はありますか? 私は何か間違ったことをしていますか?または、私の設計に欠陥があり、別のアプローチが必要ですか?