【问题标题】:AlarmManager does not trigger while changing the time更改时间时 AlarmManager 不触发
【发布时间】:2013-08-16 12:11:26
【问题描述】:

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

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

考虑以下情况:

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

详细说明

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

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

为什么会这样?

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

如何克服这个问题?

【问题讨论】:

  • 使用adb shell dumpsys alarm查看系统时间更改后的闹钟状态。
  • AlarmManager 不处理时间变化。您应该听取时间变化的动作,然后重新安排闹钟。

标签: android service notifications alarmmanager android-pendingintent


【解决方案1】:

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

在其中创建类“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
}

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多