在我的应用程序中,我根据用户的自定义时间向用户显示通知。我在我的主类中触发了alarmmanager,并通过alarmmanager以pendingIntent的形式调用通知service类。
如果用户未更改设备时间均值,alarmmanager将触发,通知service工作正常,我将收到通知。
考虑以下情况:
如果用户将设备时间设置为大于当前时间,则一切正常,通知也正常工作。如果不是,用户将时间设置为小于设备当前时间,则alarmmanager不会触发pendingIntent。所以我无法收到通知。
详述
设备当前时间:上午10点通知时间:上午11点设备时间更改为:上午11点通知:是
设备当前时间:上午10点通知时间:上午9点设备时间更改为:上午9点通知:否
为什么会发生这种情况?
将设备时间更改为小于当前时间不会触发alarm manager。为什么?
如何克服这一点?
发布于 2018-05-10 15:24:36
其中一个选项是将所有设置的警报存储在数据库中,然后创建一个侦听ACTION_TIME_CHANGE操作的BroadcastReceiver。当用户更改时间时,它将被触发。然后创建一个负责重置警报的IntentService。在此服务类中:
读取db并识别所有已传递的警报。取消传递的警报设置第二天的警报您的代码可能如下所示:在清单中:
<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>
创建"TimeChangedReceiver“类,其中:
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);
}
}}
创建"RestartAlarmsService“类,其中:
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
}}
您可以找到许多关于如何使用数据库并在您的代码中实现它的教程。希望我的回答能有所帮助。
https://stackoverflow.com/questions/18273070
复制相似问题