1

在我的应用程序中,我根据用户的自定义时间向用户显示通知。我在我的主类中触发并通过alarmmanager调用通知service类。pendingIntentalarmmanager

如果用户没有更改设备时间意味着alarmmanager正在触发并且通知service工作正常并且我正在收到通知。

考虑以下情况:

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

详细地

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

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

为什么会这样?

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

如何克服这一点?

4

1 回答 1

0

一种选择是将所有设置的警报存储在数据库中,然后创建一个将侦听 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
}

}

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

于 2018-05-10T07:24:36.453 回答