0

私は Android を初めて使用するので、次の解決策が正しいことを確認したいと思います。

問題: Web サービスを介して、デバイスのローカル データベースをサーバー上のデータベースと 10 分ごとに同期したいと考えています。新しい/更新されたレコードを返す Web サービス呼び出しを既に持っています。私が疑問に思っているのは、このタスクをスケジュールする最良の方法は何ですか。アプリケーションが実行されていないときでもデータベースを同期したい。

私の解決策(これは正しいルートですか?):android.intent.action.BOOT_COMPLETEDをリッスンするBroadcastReceiverが1つあり、onReceiveで10ごとに(PendingIntentを介して)MyReceiverにメッセージを送信するAlarmManagerを作成します分。また、アプリケーションの起動時に同じことを行います (PendingIntent を介して MyReceiver にメッセージを送信するアラームを作成します) - 両方のアラームが MyReceiver にメッセージを送信し、対応する PendingIntents が PendingIntent.FLAG_UPDATE_CURRENT で初期化されるため、新しいアラームが古いもの?(これは私がやりたいことです。何らかの理由でデバイスの起動後にアラームがキャンセルされた場合、アプリケーションの起動時にアラームを再起動する必要があります)。

MyReceiver の onReceive() で、MyIntentService を作成します (このインスタンスは Web サービス呼び出しを行い、ローカル データベースを更新します)。

これは良い解決策ですか?助言がありますか?

ありがとう

4

2 に答える 2

2

解決策は問題ありません...実際には、デバイスの電源を切って再起動すると、すべての AlarmManager インスタンスがクリアされます。

簡単な方法は... アプリケーションの起動時にまず AlarmManager を作成します。BOOT_COMPLETED BroadcastReceiver の onReceive の 2 番目。

PendingIntent.FLAG_UPDATE_CURRENT は、一度に 1 つのアラームのみがアクティブになるようにします。

このようにして、アプリケーションの起動時にアラームが登録されました。BOOT_COMPLETED ですでに登録されている場合は問題ありません。デバイスの電源をオフにすると、アクティブ化されたアラームは非アクティブ化されますが、BroadcastReceiver から BOOT_COMPLETED は、次回の起動時に新しいアラームを登録します。

これがあなたの質問に答えていると判断した場合は、「承認済み」とマークしてください。これにより、あなたと私の両方の評判スコアが上がります。

また、ネットワークを使用する間隔を確認する必要があります。これは、デバイスとユーザーにとって非常にリソースを消費する可能性があります。1 つのポリシーとして、間隔を長くして、ユーザーがアプリを起動したときに更新を確認することがあります (これはユーザー フレンドリーではないかもしれませんが、多くのシステム リソースとバッテリー電力を節約できます)。ニーズに応じて、より良いポリシーを見つけてみてください。

于 2012-08-15T04:53:44.737 に答える
1

そのように FLAG_UPDATE_CURRENT を使用すると、既存の PendingIntent が存在する場合はオーバーライドされます。私は肯定的ではありませんが、onReceive に入るとすぐに PendingIntent が消費されるため、オーバーライドする必要がなくなると思います。どちらの場合も、これはあなたが探している機能のように聞こえます。はい、この種の問題を解決する良い方法です。私の他の唯一の提案は、10 分の間隔のタイミングが絶対に重要ではない場合、AlarmManager で INTERVAL_ スケジュールの 1 つ (たとえば、INTERVAL_FIFTEEN_MINUTES) を使用してバッテリー寿命を節約することです。基本的に、間隔を置いて実行されるすべてのアプリが作業をまとめて「バッチ処理」し、デバイスを起動する頻度を減らすことができます。

于 2012-08-15T04:42:53.053 に答える