我需要知道旧系统时间和新系统时间之间的差异值(用户更改后)
使用以下代码,我会抓住用户更改时间的时刻:
<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()));
}
}
例如当前时间10:00,用户将其更改为11:00 - onReceive方法调用,但时间已经更改,如何获取以前的值 - 10:00?
答案 0 :(得分:9)
下面是一个计算前一个值的解决方案。我试过了,你可以在这里找到我的实现 https://github.com/chrisport/setTimeIntent
主要思想是这样的: 你需要一个独立的时间来比较,我们可以采取 SystemClock.elapsedRealtime(),这是自设备启动以来的时间。 现在我们可以计算这个elapsedTime和System.currentTimeMillis()之间的差异。 除非SystemTime已经改变(例如由用户改变),否则该差异将始终是恒定的。在这种情况下,我们可以计算新的差异并进行比较,以确定已经改变了多少。
我们这样做:
计算当前差异:
public static long getCurrentDifference() {
long elapsedTime = SystemClock.elapsedRealtime();
long currentTime = System.currentTimeMillis();
return currentTime - elapsedTime;
}
将此差异存储在开始*到SharedPreferences
收到SET_TIME时,计算当前差异与存储差异之间的差异
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;
你也可以用它制作一个日期(新日期(上一个时间))。
*要始终拥有初始时差,您可以在应用程序打开时,设备启动时(需要另一个BroadCastReceiver)将其存储到SharedPreferences,以及在收到SET_TIME后保存新计算的差异。< / p>
编辑:
我的示例的输出如下所示:
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
以某种方式接收SET_TIME两次。因此,有两个Log消息,第二个显示当前时间的两倍,因为我用新计算的一个覆盖lastDifference。
答案 1 :(得分:1)
据我所知,唯一的方法是在调用接收器之前保存它。在应用程序启动时,例如:
public class MainActivity extends Activity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mReferenceTime = System.currentTimeMillis();
}
...
}
根据您所需的准确度,您可能需要更频繁地更新此参考时间,例如使用后台任务(请注意电池!):
// at application startup:
mClkRef = new Thread() {
@Override
public void run() {
while (hasToRun()) {
mReferenceTime = System.currentTimeMillis();
sleep(A_REASONABLE_WHILE);
}
}
...
};
mClkRef.start();
在这种情况下,您必须从TimeChangeReceiver.onReceive()
控制或处置/重新创建此线程。
根据您的操作/应用的工作方式,Handler.postDelayed()
也可能是一个有趣的解决方案。
答案 2 :(得分:0)
Chrisport,
我修复了&#34;不知怎的,SET_TIME被收到两次。因此,有两个Log消息,第二个显示当前时间的两倍,因为我用新计算的一个&#34;覆盖lastDifference。你在说什么
基本上,如果mySharedPrefs.getLastTimeDifference()
等于-1,则不记录差异。
我得到的第一个日志的日期是1969年,所以我添加了一个if语句然后修复了。