package com.itbox.fx.core; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences.Editor; import android.net.ConnectivityManager; public class AppTime extends BroadcastReceiver { private static final String KEY_TIME_DEVIATION = "time_deviation"; private static AppTime mInstance; private static OnTimeSetChangedListener mListener; private static long deviationMills; private static long startMills; private static long endMills; private boolean isRegistered; private Context context; static { mInstance = new AppTime(Application.getInstance()); } public static AppTime getInstance() { return mInstance; } public static void setOnTimeSetChangedListener(OnTimeSetChangedListener listener) { mListener = listener; } public AppTime(Context context) { super(); this.register(context); } @Override public void onReceive(Context context, Intent intent) { if (mListener != null) { setStartMillis(); mListener.onTimeSetChanged(); } } private IntentFilter getFilter() { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); return filter; } public AppTime register(Context context) { if (!isRegistered) { this.context = context; context.registerReceiver(this, getFilter()); isRegistered = true; } return this; } public AppTime unRegister() { if (isRegistered) { context.unregisterReceiver(this); isRegistered = false; } return this; } /** * <font color="red" size="4">必须是System.currentTimeMillis()</font> */ private static void setStartMillis() { startMills = System.currentTimeMillis(); } /** * <font color="red" size="4">必须是System.currentTimeMillis()</font> */ private static void setEndMillis() { endMills = System.currentTimeMillis(); } public static synchronized long getTimeMillis() { if(deviationMills == 0){ deviationMills = Application.getAppPreferences().getLong(KEY_TIME_DEVIATION, 1); } long clientTime = System.currentTimeMillis(); long svrTime = clientTime + deviationMills; // return svrTime; return System.currentTimeMillis(); } public static void refreshTimeDeviation(long svrTimeMills) { setEndMillis(); if (-1 != svrTimeMills) { deviationMills = svrTimeMills - (startMills / 2) - (endMills / 2); L.e("deviationMills: "+deviationMills); Editor edit = Application.getAppPreferences().edit(); edit.putLong(KEY_TIME_DEVIATION, deviationMills); edit.commit(); } } public interface OnTimeSetChangedListener { public void onTimeSetChanged(); } }