1

ContentObserver (C) をホストするサービス (S) を作成しました。C は、一部のデータを追跡し、データベースに加えられた変更をログに記録します (D)。

S には、時間間隔で D の内容をファイルにダンプするタイマーもあります。

私は自分の電話でサービスを実行していますが、しばらくの間 (数時間程度) は問題ないようです。その後、突然、データに加えられた変更の記録を停止し、ファイルへのダンプを停止します。データを変更して (C で onChange を引き起こします)、電話をブラウジングしてデバイスを起動させようとしましたが、何も起こりませんでした。サービスはまだ非アクティブです。S はまだ実行中で、ラップトップに接続してもログにエラーは表示されません。

私の推測では、サービスはスリープ状態です (CPU スライスを取得していません)。ウェイクロックについて少し読んだことがありますが、電話を常に強制的に起動させたくありません。(). 別の方法は、T 分ごとに C の作業を実行する繰り返しアラームを作成することです (ポーリング)。ユーザーは更新の間にデータを変更 (特に削除) できるため、ContentObservers のアイデアがより気に入っています。ContentObserver を使用すると、時間間隔のスナップショットだけでなく、すべての変更を取得できます。

定期的にサービスを起動する方法についてのアイデアはありますか?

よろしくフレデリック

4

1 に答える 1

0

AlarmManager を使用して、設定された間隔で保留中のインテントをブロードキャストできます。RTC_WAKEUP タイプを使用すると、デバイスがスリープ状態の場合でも送信されます。

Intent intent = new Intent("android.intent.action.DO_SOMETHING");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60*60*1000, pendingIntent);

次に、インテント用のブロードキャスト レシーバーを登録し、必要な処理を実行します。ブロードキャスト レシーバーは約 10 分後にタイムアウトすることに注意してください。10秒なので、長いタスクがある場合はサービスを使用してください

于 2011-11-02T15:11:15.333 に答える