即使设置为重复

时间:2016-03-14 10:22:41

标签: android alarmmanager

我现在试图解决这个问题 在我的活动中,我设置了一个警报管理器,每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;但没有运气。它仍然只触发一次。 有人可以指出我错过了什么吗?

提前致谢。

2 个答案:

答案 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