自动检测系统日期是否已更改

时间:2017-11-23 20:14:42

标签: android android-intent alarmmanager android-broadcastreceiver

每当系统日期发生变化或用户手动更改系统日期时,我都会尝试启动倒数计时器。我使用 this 广播操作来检测系统日期是否已更改但是无法正常工作。这个问题有很多线索。有些用户说只有当用户从设置中手动更改日期时才会起作用,而有些用户说它可以同时工作,但日期会自动更改,或者用户手动更改设置。但就我而言,它并不适用于这两种情况。有些用户建议使用Alarm Manager而不是此广播操作,即“android.intent.action.DATE_CHANGED”。

以下是我对广播的实施:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.byteshaft.a1440time">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".receivers.OnDateChangeReceiver"  android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.DATE_CHANGED"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

我的广播接收器类:

    public class OnDateChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(Intent.ACTION_DATE_CHANGED)){
            System.out.println("Changed");
        }
    }
}

如果警报管理器是唯一的解决方案,那么有关于如何以正确方式实现它的指南吗?

2 个答案:

答案 0 :(得分:1)

您是否只想在设置时间时收到通知?

您可以通过android.intent.action.TIME_SET广播收听。 每次修改系统时间时都会触发它。

如果您的应用定位到Android 8.0(API级别26)或更高版本,则此广播无法在AndroidManifest.xml中注册,则只能通过Context.registerBroadcastReceiver

注册

答案 1 :(得分:0)

要检测日期的变化,您必须使用两个意图操作:

    <receiver android:name=".BroadcastReceiverTest">
        <intent-filter>
            <action android:name="android.intent.action.TIME_SET"/>
            <action android:name="android.intent.action.TIMEZONE_CHANGED"/>
        </intent-filter>
    </receiver>

我测试过,效果很好。

在面向 API 级别 26 或更高级别期间,您不能将 "android.intent.action.DATE_CHANGED" 用于清单中的隐式广播。