私はこの質問をほぼ3週間の調査の後に行うことに決めました。ビジネス要件として、私は自分のアンドロイドアプリケーションで常時稼働しているバックグラウンドサービスを維持する必要があります
私のアプリにはバックグラウンドサービスが1つしかなく、常にBLEデバイスを検索する必要があります。 (私はBLEデバイスがスキャンを一時停止して再開する範囲にない場合、私は低速スキャンモードを設定しています。このアプリケーションは、BLEデバイスが範囲内に入ったときにBLEデバイスで何らかの認証を行うことを目的としているため、誰もが利用できるわけではありません。うまくいけば、これは常に実行されているサービスの重要性を確立します。私は前景サービス(ビジネス要件)を使用することはできません。
アンドロイドが私のサービスを殺すたびにonDestroy()
は呼び出されません。だから私の最善の策は、5分ごとにトリガするアラームマネージャを使用して、サービスが強制終了されているかどうかをチェックし、殺された場合はstartService()
を呼び出します。アラームはしばらくは正常にトリガされますが、ランダムな時間(1,2時間)後にもアラームが殺され、それ以上トリガされません。
私は、サービスを開始する責任を負うonReceive()
のアラームで放送を送信しています。私はいくつかのランダムな時間の後に、アラームマネージャが誤動作する理由を説明したり、提案したりすることができます。私は現在、nexus 6p、Galaxy s7 edge、Samsung A5、Huawei P9で自分のアプリをテストしています。
これ以上説明することはできません。
返信いただきありがとうございます。私は実際にアラームが存在すると判断した場合、明日adbに確認します。どのように 'setAndAllowWhileIdle()'を使って5分ごとにアラームを繰り返すのですか?また、WakeLockについては、私の放送受信機のonReceive()で取得し、 'startService()'を呼び出してからリリースします。どのようになっているのでしょうか? – madking
@madking: "setAndAllowWhileIdle()を使用して、アラームを5分ごとに繰り返す方法は?" - できません。私は広告された最小期間が9分だと思うし、頻繁ではないかもしれません。 「それはどうしたの?」つまり、あなたの「WakeLock」が約1マイクロ秒間取得されたことを意味します。 'startService()'は非同期です。 'startService()'が返ったときにサービスは開始されません。私はあなたのサービスがとにかく仕事をするために 'WakeLock'を必要とすることを期待しています。そのためユーザーはあなたのアプリに不満を感じるかもしれません。 – CommonsWare
私は 'RTC_WAKEUP'を使用しています。サービスが開始されているかどうかに関係なく、電話がDOZEモード(Android 6で導入されています)に関係なく、通知は' onReceive() 'で発行されます。非常に短い瞬間にCPUをウェイクアップさせるので、アラームがトリガされます。しかし、通知はしばらくしてから停止します。 – madking