我有一个需要频繁轮询数据的应用程序。我有一个带有TimerTask
实现的App Service逻辑,但之后我被@Commonsware移到了WakefulIntentService。
现在我的问题是我有多个活动屏幕响应服务发出的广播意图。我如何确保只调用一次对scheduleAlarms的调用(或者我没有必要为此烦恼?)。实际问题是scheduleAlarms的代码被放置在超类的onCreate上,大多数活动(如果不是所有活动)都会延伸,从而导致多个警报被安排。
答案 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()
电话中设置初始事件。正确的时间。