私のアプリにはバックグラウンドservice
が実行されており、ユーザーが現在location
を取得して、5分ごとにサーバーに更新します。このlocation
更新プロセスを継続的に実行するには、アラームマネージャーを使用して、service
自体から次の実行時間を設定します。ただし、_Nokia 6
_を実行している_Android 8.1
_にアプリをインストールすると、しばらく動作し、しばらく電話をアイドル状態にすると、次のアラームでservice
が削除されますアプリケーションがシステム_alarm manager
_からもクリアされます。私の推測では、アイドル時間は電話を_doze mode
_に入れます。ただし、アラームマネージャがクリアされた理由はわかりません。私の理解では、_doze mode
_は定期的にメンテナンスウィンドウを開いて、保留中のタスクを実行する必要があります。
この問題を軽減するため、15分ごとに実行されるJobScheduler
の上にservice
AlarmManager
を適用しようとしました。このjobscheduler
の目的は、service
が含まれるalarmmanager
を再起動することでした。そのため、たとえそれが殺されてアラームがクリアされても、jobscheduler
はservice
を再度アップします。
このパッチをテストし、_idle mode
_に入るまでしばらく保持した後、アラームが含まれるJobScheduler
Service
とService
の両方を取得しました。スケジュールされたジョブとアラームがシステムからクリアされて殺された。
Androidドキュメントでは、JobScheduler
を使用してそのバックグラウンド実行制限を緩和できると言われています。これをテストするために、2つのservices
を強制的に強制終了しました。アプリをテストしましたが、既にスケジュールされたジョブはクリアされず、service
でアラームが再び正常に実行されました。この動作の理由はわかりませんが、Evernoteの担当者は説明しますここでこのシナリオに一致する可能性があります EvernoteのAndroid Job
この異常な行動のアイデアはありますか?
テスト環境の詳細
Nokia 6 (TA-1021)
Android 8.1.0
_動作の変更があるため、Oreoで長時間実行されているバックグラウンドサービスを実行することはできません。現在、システムメモリ、バッテリーなどを最適化するOreo、バックグラウンドサービスを停止し、フォアグラウンドサービスを使用する必要がある問題を解決します。
バックグラウンド実行の制限をご覧ください https://developer.Android.com/about/versions/oreo/Android-8.0-changes
私からの提案は、もしあなたがFCMを使ってそれを手に入れたら、WeChatのようなアプリがFacebookを使って通知を配信し、問題に直面しないからです...
これが問題の理解に役立つことを願っています。..
現在、私はあなたと同じ問題に直面しており、あなたと同じ仕事をしています。つまり、ジョブスケジューラを定期ジョブに設定して、タスクが強制終了されたなどの理由で強制終了された場合に、15分ごとにフォアグラウンドサービスを起動します。これは、以前のOreoバージョンの魅力のように機能します。
Oreoの場合、現時点で認識している唯一のソリューションは、設定でアプリを自動起動できるようにすることです。つまり、インストール済みアプリの下。その後、再びPre Oreoのように動作するはずです。聞いたことはありますが、まだテストされていませんが、ジョブスケジューラでsetPersisted(true)オプションを設定することです。それが役立つかどうか教えてください
現在、DOZEモードはバックグラウンドサービスに許可されていないため、DOZEモードがアプリに影響しない方法を見つける必要があります。問題を解決するには、フォアグラウンドサービスを使用する必要があります。または、バッテリーを設定します。いずれにせよ、私のより良いオプションは Firebase Cloud Messaging
Doze moreでは、アラームはリセットされませんが、後で延期されます。ここには2つの主流オプションがあります。
setAndAllowWhileIdle()
または setExactAndAllowWhileIdle()
を使用します。ただし、これらも最大頻度 9分ごとに1回 で起動できます。そのため、アプリで位置情報を取得する頻度を減らす必要があります。
フォアグラウンド通知を表示するには、 フォアグラウンドサービス を使用します。誰もがそれを行います(Uber、Googleマップなどのアプリ)。そうすれば、サービスは強制終了されず、アプリを開いているかのように扱われます。