Android中的日期和时间更改侦听器?

don*_*221 63 android

在我的应用程序中,有一个警报服务,我发现如果用户将其日期或时间更改为过去的时间.在我预期的时候我的警报不会被触发.

因此,我可能需要再次重置所有警报.在android中是否有日期和时间更改监听器?

Ben*_*ish 89

创建一个意图过滤器:

static {
    s_intentFilter = new IntentFilter();
    s_intentFilter.addAction(Intent.ACTION_TIME_TICK);
    s_intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
    s_intentFilter.addAction(Intent.ACTION_TIME_CHANGED);
}
Run Code Online (Sandbox Code Playgroud)

和广播接收器:

private final BroadcastReceiver m_timeChangedReceiver = new BroadcastReceiver() {                                                                                             
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (action.equals(Intent.ACTION_TIME_CHANGED) ||
                    action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
            doWorkSon();
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

注册接收者:

public void onCreate() {
    super.onCreate();
    registerReceiver(m_timeChangedReceiver, s_intentFilter);     
}
Run Code Online (Sandbox Code Playgroud)

编辑:

并取消注册:

public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(m_timeChangedReceiver);     
}
Run Code Online (Sandbox Code Playgroud)

  • `onDestroy()`永远不是取消注册接收器的好地方,因为它可能永远不会被调用(在进程中由于来自其他应用程序的内存声明而被杀死).所以*注册*接收器的最佳位置是`onResume()`和*unregister*是`onPause()`. (29认同)
  • 静态{}语法是什么?我生命中第一次看到类似的东西. (6认同)
  • 它被称为静态初始化块.http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html (6认同)
  • 不要忘记在`onDestroy`方法中添加`this.unregisterReceiver(m_timeChangedReceiver);`. (5认同)
  • 为什么不将它放在清单中并在警报激活时处理这些广播?动态注册/取消注册容易出现更多错误恕我直言. (3认同)
  • @AndroidDev请阅读`onDestroy()`文档http://developer.android.com/reference/android/app/Activity.html#onDestroy(),如果系统由于内存不足而要终止应用程序进程,则可以注册广播将以任何方式被杀死。 (2认同)
  • 代码没有理由在侦听`Intent.ACTION_TIME_TICK`,这完全是在浪费资源和电池消耗。代码还应该监听 `Intent.ACTION_DATE_CHANGED` 并对其采取行动。 (2认同)

Cha*_*ham 27

除了接受的答案

如果您想在应用未运行时收听时间更改,我会在清单中注册:

<receiver android:name="com.your.pacakge.TimeChangeBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.TIME_SET"/>
        <action android:name="android.intent.action.TIMEZONE_CHANGED"/>
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

如果这样做,请不要使用registerReceiver和在代码中明确注册接收器unregisterReceiver.

同样,这只是对已接受答案的补充.

  • @JorgeCevallos是'ACTION_TIME_TICK`,而不是'TIME_SET` (4认同)