我现在试图解决这个问题 在我的活动中,我设置了一个警报管理器,每2分钟触发一次(用于测试)并通过接收器调用服务。该服务假设进行网络呼叫等。
我的问题是AlarmManager第一次正确触发但从不再触发它。我错过了什么?
在我的活动中,我这样做 -
//Register an alarm manager
//If no alarm is set
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
if(!defaultSharedPref.getBoolean("isAlarmSet",false)){
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
manager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(),
R.string.interval,
pendingIntent);
editor = defaultSharedPref.edit();
editor.putBoolean("isAlarmSet",true);
editor.commit();
}
在我的清单中: -
<receiver android:process=":remote" android:name=".receiver.AlarmReceiver" />
<service android:name=".service.AlarmService"/>
我的接收者: -
public class AlarmReceiver extends WakefulBroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, AlarmService.class);
startWakefulService(context,i);
}
}
我甚至试过了#34; setRepeating&#34;但没有运气。它仍然只触发一次。 有人可以指出我错过了什么吗?
提前致谢。
答案 0 :(得分:1)
作为重复计时器的间隔,您将提供资源ID - R.string.interval。这没有意义,但会编译,因为它是一个整数。如果您希望将时间间隔作为资源,则最好使用整数资源,但最重要的更改是传递资源的实际值而不是资源 ID 。因此,请使用Resources.getInteger或getString。
这应该有效,但我鼓励你根本不使用字符串资源:
manager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(),
Integer.parseInt(getResources().getString(R.string.interval)),
pendingIntent);`
您在实践中没有看到任何触发警报的原因是资源ID是非常大的整数,通常在0x8000000范围内,因此您可以有效地设置具有非常长的间隔的周期性警报。如果等待一个月左右,将触发警报。 :-)
答案 1 :(得分:0)
如果您想要一种更灵活的方式来安排作业,我建议使用这个库来抽象使用的调度程序:https://github.com/evernote/android-job