web-dev-qa-db-ja.com

Android Oreoはバックグラウンドサービスを殺し、居眠りモードに入った後に保留中のアラーム、スケジュールされたジョブをクリアします

私のアプリにはバックグラウンドserviceが実行されており、ユーザーが現在locationを取得して、5分ごとにサーバーに更新します。このlocation更新プロセスを継続的に実行するには、アラームマネージャーを使用して、service自体から次の実行時間を設定します。ただし、_Nokia 6_を実行している_Android 8.1_にアプリをインストールすると、しばらく動作し、しばらく電話をアイドル状態にすると、次のアラームでserviceが削除されますアプリケーションがシステム_alarm manager_からもクリアされます。私の推測では、アイドル時間は電話を_doze mode_に入れます。ただし、アラームマネージャがクリアされた理由はわかりません。私の理解では、_doze mode_は定期的にメンテナンスウィンドウを開いて、保留中のタスクを実行する必要があります。

この問題を軽減するため、15分ごとに実行されるJobSchedulerの上にserviceAlarmManagerを適用しようとしました。このjobschedulerの目的は、serviceが含まれるalarmmanagerを再起動することでした。そのため、たとえそれが殺されてアラームがクリアされても、jobschedulerserviceを再度アップします。

このパッチをテストし、_idle mode_に入るまでしばらく保持した後、アラームが含まれるJobSchedulerServiceServiceの両方を取得しました。スケジュールされたジョブとアラームがシステムからクリアされて殺された。

Androidドキュメントでは、JobSchedulerを使用してそのバックグラウンド実行制限を緩和できると言われています。これをテストするために、2つのservicesを強制的に強制終了しました。アプリをテストしましたが、既にスケジュールされたジョブはクリアされず、serviceでアラームが再び正常に実行されました。この動作の理由はわかりませんが、Evernoteの担当者は説明しますここでこのシナリオに一致する可能性があります EvernoteのAndroid Job

この異常な行動のアイデアはありますか?

テスト環境の詳細

  • デバイス:Nokia 6 (TA-1021)
  • OS:_Android 8.1.0_
12
k9yosh

動作の変更があるため、Oreoで長時間実行されているバックグラウンドサービスを実行することはできません。現在、システムメモリ、バッテリーなどを最適化するOreo、バックグラウンドサービスを停止し、フォアグラウンドサービスを使用する必要がある問題を解決します。

バックグラウンド実行の制限をご覧ください https://developer.Android.com/about/versions/oreo/Android-8.0-changes

私からの提案は、もしあなたがFCMを使ってそれを手に入れたら、WeChatのようなアプリがFacebookを使って通知を配信し、問題に直面しないからです...

これが問題の理解に役立つことを願っています。..

4
Abdul Aziz

現在、私はあなたと同じ問題に直面しており、あなたと同じ仕事をしています。つまり、ジョブスケジューラを定期ジョブに設定して、タスクが強制終了されたなどの理由で強制終了された場合に、15分ごとにフォアグラウンドサービスを起動します。これは、以前のOreoバージョンの魅力のように機能します。

Oreoの場合、現時点で認識している唯一のソリューションは、設定でアプリを自動起動できるようにすることです。つまり、インストール済みアプリの下。その後、再びPre Oreoのように動作するはずです。聞いたことはありますが、まだテストされていませんが、ジョブスケジューラでsetPersisted(true)オプションを設定することです。それが役立つかどうか教えてください

0
Al Cabone

現在、DOZEモードはバックグラウンドサービスに許可されていないため、DOZEモードがアプリに影響しない方法を見つける必要があります。問題を解決するには、フォアグラウンドサービスを使用する必要があります。または、バッテリーを設定します。いずれにせよ、私のより良いオプションは Firebase Cloud Messaging

0
MK Vimalan

Doze moreでは、アラームはリセットされませんが、後で延期されます。ここには2つの主流オプションがあります。

  1. setAndAllowWhileIdle() または setExactAndAllowWhileIdle() を使用します。ただし、これらも最大頻度 9分ごとに1回 で起動できます。そのため、アプリで位置情報を取得する頻度を減らす必要があります。

  2. フォアグラウンド通知を表示するには、 フォアグラウンドサービス を使用します。誰もがそれを行います(Uber、Googleマップなどのアプリ)。そうすれば、サービスは強制終了されず、アプリを開いているかのように扱われます。

0
Abdul Wasae