在多活动应用程序中实现Wakeful IntentService

时间:2012-10-12 02:20:14

标签: android commonsware-cwac

我有一个需要频繁轮询数据的应用程序。我有一个带有TimerTask实现的App Service逻辑,但之后我被@Commonsware移到了WakefulIntentService

现在我的问题是我有多个活动屏幕响应服务发出的广播意图。我如何确保只调用一次对scheduleAlarms的调用(或者我没有必要为此烦恼?)。实际问题是scheduleAlarms的代码被放置在超类的onCreate上,大多数活动(如果不是所有活动)都会延伸,从而导致多个警报被安排。

2 个答案:

答案 0 :(得分: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

    }
}

我会告诉你什么:它有效!

我希望这有帮助!

答案 1 :(得分:0)

  

我有一个需要频繁轮询数据的应用程序。我有一个带有TimerTask实现的App Service逻辑,但随后我被@Commonsware转移到了WakefulIntentService。

WakefulIntentService是针对我认为不频繁的间隔(每隔几分钟最多)而设计的,与任何UI分离运行。听起来这并不是你如何使用它。

  

如何确保只调用一次scheduleAlarms调用

跟踪你何时打电话。

  

或者我没有必要为此烦恼吗?

这取决于时间表。

对于针对特定时间(例如,下周二下午4点)的警报,您可以盲目地重新安排它们,因为下周二下午4点不会改变。如果您每次使用等效的PendingIntent,Android会在更换旧警报时取消旧警报。

对于定期闹钟(每N分钟/小时/天),你可以盲目地重新安排它们,但有一点需要注意:除非你小心避免,否则你的日程安排会稍微改变。假设您希望每天发出一次警报。在最后一次报警后12小时,您重新安排闹钟每天再次关闭一次。如果你想确保闹钟在12小时后仍然响起(坚持原来的时间表),你需要知道这是必需的,并在你的setRepeating()电话中设置初始事件。正确的时间。