更改时间时不会触发AlarmManager

时间:2013-08-16 12:11:26

标签: android service notifications alarmmanager android-pendingintent

在我的应用程序中,我根据自定义时间向用户显示通知。我在我的主要课程中触发alarmmanager并通过service将通知pendingIntent课程称为alarmmanager

如果用户没有更改设备时间,则alarmmanager正在触发,通知service正常工作,我收到通知。

考虑以下情况:

如果用户将设备时间设置为大于当前时间,则一切正常,通知正常。如果不是,则用户将时间设置为小于设备当前时间,然后alarmmanager不会触发pendingIntent。所以我无法收到通知。

详细

设备当前时间:上午10点 通知时间:上午11点 设备时间更改为:上午11点 通知:是的

设备当前时间:上午10点 通知时间:上午9点 设备时间更改为:上午9点 通知:否

为什么会这样?

更改设备时间小于当前时间不会触发alarm manager ..为什么?

如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

其中一个选项是将所有设置的警报存储在数据库中,然后创建一个BroadcastReceiver,它将侦听ACTION_TIME_CHANGE操作。当用户更改时间时,它将被触发。然后创建一个IntentService,负责重置警报。在此服务类中:

读取数据库并识别所有传递的警报。 取消传递的警报 设置第二天的闹钟 您的代码可能如下所示: 在你的清单中:

<uses-permission android:name="android.permission.ACTION_TIME_CHANGE"/>

及以下活动:

<receiver android:name=".TimeChangedReceiver" android:enabled="true">
 <intent-filter>
     <action android:name="android.intent.action.TIME_SET" />
 </intent-filter>

创建课程&#34; TimeChangedReceiver&#34;其中:

public class TimeChangedReceiver extends BroadcastReceiver {

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

    if("android.intent.action.TIME_SET".equals(intent.getAction())) {
        Intent i = new Intent(context, RestartAlarmsService.class);
        ComponentName service = context.startService(i);
    }

}

}

创建&#34; RestartAlarmsService&#34;其中的课程:

public class RestartAlarmsService extends IntentService {

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

@Override
protected void onHandleIntent(Intent intent) {

    // read db here
    // then cancel passed alarms
    // reset them to next day
}

}

您可以找到许多有关如何使用数据库并在代码中实现它的教程。希望我的答案有所帮助。