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;
    }
    
  • 在开始*时将此差异存储到SharedReferences

  • 收到设置时间后,计算当前差值和存储差值之间的差值

    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)将其存储到SharedReferences,并在收到SET_time后保存新计算的时差

    编辑:

    我的示例的输出如下所示:

    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