私のアプリはAlarmManagerを使用しており、4年前から機能しています。しかし、私はそれがいくつかのデバイスで失敗し始めたことに気づきました。
コードは正しいと確信しています(Dozeを搭載したデバイスにWakefulBroadcastReceiver、setExactAndAllowWhileIdleを使用しています)。Nexusデバイスでは完全に機能しますが、一部のメーカーのデバイス(Huawei、Xiaomi ...)では失敗します。
たとえば、Huaweiデバイスには、アプリを強制終了する一種のバッテリーマネージャーがあり、アプリが強制終了されると、スケジュールされたアラームはキャンセルされます。そのため、Huaweiバッテリーマネージャーでアプリを「保護」として設定すると、問題が解決します。
しかし最近、Xiaomi、Samsung(新しい「Smart Manager」に関連している可能性がありますか?)...より多くのデバイスで動作していないことに気付きました...この動作は標準になりつつあるようです。
誰もがそれについて何か知っていますか?アラームが発生することを保証する方法はありますか?
編集:この問題は、さまざまなメーカーによって追加された「バッテリーセーバー」が原因です。詳細はこちら: https://dontkillmyapp.com/
私はすでに数週間それを解決しようとしています。何も見つかりませんでした。 Huaweiはしばらくしてからすべてのアラームを削除します。バッテリーセーバーで保護されたアプリにアプリを配置しても、役に立ちません。 ただし、アラーム、時計、カレンダーなどの単語を含むようにアプリのパッケージ名を変更すると、他のデバイスと同じように完全に正常に動作します。 Googleがこのがらくたを認定する方法を理解できません。 OEMはこのような方法でコアプラットフォームを変更すべきではないと思います。ユーザーが使用しないとしばらくしてからアプリを強制終了する独自のバッターセーバーがあることを理解しています。しかし、これは保護されたアプリの警告を殺します。
正確なタイミングアラームのsetAlarmClock()も役立ちます。しかし、ウィジェットの更新のように考えるためにこれを使用することはできません。
問題はスマートマネージャーです。 Samsungには、特定のアプリをバックグラウンドで実行できない場合があるバッテリーマネージャーがあります。アプリに戻るときに「再開」しようとしましたが、アプリケーションを完全に無効にするか、5分ごとに再開する場合があります(Samsungの機能によって異なります)。
これは、Samsung Managerがないため、Androidのストックバージョンで動作します。また、SMを有効にするいくつかの機能を備えたAndroid rom)。
<5.0デバイスにはAlarmManagerを使用し、5.0 +デバイスにはJobSchedulerを使用します。 JobSchedulerがメーカーのシェナンガンの影響を受けないことは確かではありませんが、AndroidがAlarmManagerからJobSchedulerに人々を移動させようとしていることを考えると、それははるかに少ないようです。
編集:Googleは WorkManager と呼ばれるこの問題に対するファーストパーティソリューションを発表しました。複数のスケジューリングフレームワークを抽象化し、デバイスに最適なフレームワークを使用します。
最近のほとんどのAndroidデバイスにはアプリまたはメカニズムが付属しており、自動的にバッテリーを節約する方法を見つけようとするため、特定のサードパーティアプリが停止する場合があります。ジョブ(例:アラームがオフにならない、プッシュ通知が機能しないなど)。多くの場合、これはAndroidのバッテリー節約メカニズムとは完全に独立して行われます。ユーザーをスタートアップマネージャーにリダイレクトして、アプリケーションをホワイトリストに登録します
すべてのモデルのこのリンクには、呼び出す必要がある意図があります https://Android-arsenal.com/details/1/6771
アラームを設定するアプリもあります。ソリューションは AlarmManager.setAlarmClock() api> = 21を使用することです。これはdoze afaikの影響を受けず、目覚まし時計アイコンを追加するボーナスがあります。システムトレイ。
BOOT_COMPLETEDを聞いていますか?デバイスがリブートされると、アラームを再度設定する必要があります。
しばらく前にAlarmManagerの使用を停止しました...より良く、より安定した代替手段
はい、それは苦痛です。しかし、仕事は成し遂げられます
これらのデバイスは、どのバージョンのAndroidで実行されていますか?
API 23の時点では、OS自体はしばらく使用されていないと低電力アイドルモードになり、そのモードではアラームは配信されません。ただし、アプリが「バッテリーの使用量に関係なく、この時点でこのアラームをオフにする必要がある」と明示的に言う方法があります。 setAndAllowWhileIdle()
およびsetExactAndAllowWhileIdle()
と呼ばれる新しいAlarmManagerメソッド。
あなたの説明から、これは特定のOEMデバイスの問題の特定の原因ではないように聞こえますが、これはAlarm Managerを使用するすべての開発者が認識すべきものです。
最後に、Alarm Managerの多くの使用法は、Job Schedulerのメカニズムを使用してより適切に対処されます。後方互換性のために、Playサービスの「GCMネットワークマネージャー」は、実際には機能的にジョブスケジューラに非常に近く、新しいバージョンのAndroid=で内部的にジョブスケジューラを使用します。クラスの名前にもかかわらず、ネットワーキング。
アプリマネージャーの自動起動マネージャー、in vivo v5などの一部のハンドセットでアプリを有効にする必要があります。
In vivo v5では、このメニューはiManager-> App Manager-> Auto Start Managerで確認できます。ここでアプリを有効にします。
その後、アプリが強制終了または閉じられた場合、アラーム/アラームマネージャーがアラームをトリガーします。
私は答えを探していましたが、数時間後にこれを見つけました:
https://stackoverflow.com/a/35220476/3174791
履歴書では、アプリが「保護されたアプリ」によって殺されたかどうかを知る方法であり、これはHuaweiデバイスでのみ機能します。他のデバイス(Samsung、Sony、Xiaomiなど)に解決策があれば教えてください。
最近のほとんどの携帯電話には、あなたが説明したのと同じことを行う何らかのバッテリー/省電力マネージャーがバンドルされています。デュブースターやクリーンマスターは数えません。
アプリ/ Playストアのリストに免責事項またはよくある質問を記載して、適切に機能するためにこのアプリをバッテリーマネージャーアプリの例外にする必要があることを示す必要があると思います。
Xiaomiの場合、アプリのAutoStartを有効にする必要があります。バックグラウンドプロセスに影響を与える可能性のあるAndroidの変更(通常は携帯電話の製造元による)のリストを作成しようとしています。何か新しいものがある場合は、ここに答えを追加してください Androidタスクキラーのリスト
アプリを強制終了しても、アラームマネージャーがアプリを起動できないとは思いません。
アラームマネージャーからのコールバックを受信しないアプリを「強制停止」または無効にした場合のみです。
根本原因は他の何かかもしれません。
また、Mで... setExactAndAllowWhileIdleはスロットリングを行います...つまり、2分ごとにアラームをスケジュールすると、トリガーされません。 ..15分のウィンドウが必要です。 。