0

頻繁にデータをポーリングする必要があるアプリケーションがあります。実装を伴う App Service ロジックがありましたが、 @CommonswareTimerTaskによって WakefulIntentServiceに移動しました。

今私の問題は、サービスによって送信されたブロードキャスト インテントに応答するアクティビティ画面が複数あることです。scheduleAlarms への呼び出しが 1 回だけ呼び出されるようにするにはどうすればよいですか (または、これについて気にする必要はありませんか?)。実際の問題は、scheduleAlarms へのコードがスーパー クラスの onCreate に配置され、そこからすべてではないにしてもほとんどのアクティビティが拡張されるため、複数のアラームがスケジュールされることです。

4

2 に答える 2

0

あなたが何をしたいのかわかりませんが、これは私がやったことです:

特定のアクティビティで:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 30);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30000, pendingIntent);

これにより、30 秒ごとに AlarmReceiver クラスをトリガーするアラームが設定されます。

AlarmReceiver には次のものがあります。

package com.android.example;

import com.commonsware.cwac.wakeful.WakefulIntentService;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Intent i = new Intent(context, AlarmService.class);
        WakefulIntentService.sendWakefulWork(context, i);

    }
}

そしてAlarmServiceにはこれがあります:

package com.android.example;

import android.content.Intent;
import com.commonsware.cwac.wakeful.WakefulIntentService;

public class AlarmService extends WakefulIntentService {

    public AlarmService() {
        super("AlarmService");
    }

    @Override
    protected void doWakefulWork(Intent arg0) {

        //DO WAKEFUL STUFF

    }
}

そして、私はあなたに何を言うでしょう:それはうまくいきます!

これが役立つことを願っています!

于 2012-10-12T16:00:09.620 に答える
0

頻繁にデータをポーリングする必要があるアプリケーションがあります。TimerTask 実装の App Service ロジックがありましたが、@Commonsware によって WakefulIntentService に移動しました。

WakefulIntentServiceは、UI から切り離されて実行される、まれな間隔 (最大で数分ごと) と見なされるように設計されています。それはあなたがそれを使用している方法ではないようです。

scheduleAlarms への呼び出しが 1 回だけ呼び出されるようにするにはどうすればよいですか

あなたがそれを呼び出すときを追跡します。

それとも私がこれについて気にする必要はありませんか?

スケジュールによって多少前後します。

特定の時刻 (たとえば、次の火曜日の午後 4 時) を狙っているアラームの場合、次の火曜日の午後 4 時は変更されないため、やみくもにスケジュールを変更できます。PendingIntent毎回同等のものを使用している場合、Android は新しいアラームに置き換える過程で古いアラームをキャンセルします。

定期的なアラーム (N 分/時間/日ごと) の場合、やみくもにスケジュールを変更できますが、1 つの注意点があります。注意して回避しない限り、スケジュールがわずかにずれます。1 日に 1 回アラームを鳴らしたいとします。最後のアラームから 12 時間後に、もう一度アラームを 1 日 1 回鳴らすようにスケジュールを変更します。12 時間後にアラームを確実に鳴らしたい場合 (元のスケジュールを守るため)、これが必要であることを理解し、setRepeating()通話の最初のイベントを適切な時間に設定する必要があります。

于 2012-10-13T10:51:18.397 に答える