Android 了解新旧时代的区别
我需要知道新旧系统时间之间的差值(用户更改后) 通过以下代码,我捕捉到了用户更改时间的时刻:Android 了解新旧时代的区别,android,Android,我需要知道新旧系统时间之间的差值(用户更改后) 通过以下代码,我捕捉到了用户更改时间的时刻: <receiver android:name=".TimeChangeReceiver"> <intent-filter> <action android:name="android.intent.action.TIME_SET"></action> </intent-filter> </receiver&
<receiver android:name=".TimeChangeReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET"></action>
</intent-filter>
</receiver>
public class TimeChangeReceiver extends BroadcastReceiver {
private static final String TAG = TimeChangeReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "changed time: " + new Date(System.currentTimeMillis()));
}
}
公共类TimeChangeReceiver扩展了BroadcastReceiver{
私有静态最终字符串标记=TimeChangeReceiver.class.getSimpleName();
@凌驾
公共void onReceive(上下文、意图){
Log.d(标记“更改的时间:”+新日期(System.currentTimeMillis());
}
}
例如,当前时间10:00,用户将其更改为11:00-调用onReceive方法,但时间已更改,如何获取以前的值-10:00?据我所知,唯一的方法是在调用接收器之前将其保存。例如,在应用程序启动时:
public class MainActivity extends Activity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mReferenceTime = System.currentTimeMillis();
}
...
}
根据您需要的准确性,您可能需要更频繁地更新此参考时间,例如使用后台任务(注意电池!):
在这种情况下,您必须从TimeChangeReceiver.onReceive()
控制或处置/重新创建此线程
根据你必须做什么/你的应用程序如何工作,这也可能是一个有趣的解决方案。下面你可以找到一个解决方案来计算之前的值。我试过了,你可以在这里找到我的实现 主要思想是: 你需要一个独立的时间来比较,我们可以 SystemClock.elapsedRealtime()这是设备启动后的时间。 现在我们可以计算此elapsedTime与System.currentTimeMillis()之间的差值。 除非系统时间已更改(例如,由用户更改),否则此差异将始终保持不变。在这种情况下,我们可以计算新的差异并对其进行比较,以确定变化的程度 让我们开始吧:
public static long getCurrentDifference() {
long elapsedTime = SystemClock.elapsedRealtime();
long currentTime = System.currentTimeMillis();
return currentTime - elapsedTime;
}
long lastDifference = mySharedPrefs.getLastTimeDifference();
//Calculate the new difference
long currentDifference = getCurrentDifference();
//Calculate the difference of the differences
//this is the change the user made
long userChangeInMillis = lastDifference - currentDifference;
//and here we get the old time:
long previousTime = System.currentTimeMillis() + userChangeInMillis;
Before it was Wed May 21 17:43:28 GMT+00:00 2014
Now it is: Wed May 21 18:43:00 GMT+00:00 2014
不知何故,设置的时间会收到两次。因此有两条日志消息,第二条显示当前时间的两倍,因为我用新计算的一条覆盖了上次的差异。Chrisport
我修正了“以某种方式设置时间接收两次。因此有两条日志消息,第二条显示当前时间的两倍,因为我用新计算的时间覆盖了上次的差异”的问题
基本上,如果mySharedPrefs.getLastTimeDifference()等于-1,则不记录差异
我得到的第一个日志的日期是1969年,所以我添加了一个if语句,然后它就被修复了 你需要把过去的时光储存在某个地方。您需要在自己的代码中的某个位置维护此值。可能在
SharedReferences
中将旧时间存储为long
?但在这种情况下,我必须每秒更新此值……您想知道用户是否在应用程序的任何位置或整个系统中更改了时间?系统。例如,当前时间10:00,用户将其更改为11:00。在onReceive方法中调用,但时间已更改,如何获取以前的值-10:00?;听起来不错!准确,没有繁琐的背景任务。。。我喜欢。但是,如果用户重新启动设备,此解决方案将不起作用。@user123456如上所述,您需要注册一个BroadCastReceiver进行启动(BOOT_COMPLETED),以便在手机重新启动时收到通知。如果测试显示它起作用,Chrispo的解决方案比我的要好得多。
Before it was Wed May 21 17:43:28 GMT+00:00 2014
Now it is: Wed May 21 18:43:00 GMT+00:00 2014