android.os.SystemClock类概述

本文介绍了Android系统中三种主要的计时机制:System.currentTimeMillis(), uptimeMillis() 和 elapsedRealtime()。详细阐述了每种计时器的特点及适用场景,如wall clock时钟适合用于日历等应用中显示真实世界的时间,而uptimeMillis()则适用于大多数UI事件和性能测量。

类的概述

核心计时设施。

<wbr></wbr>

三种不同的时钟是适合的,并且他们不应该被混淆:

System.currentTimeMillis()是一个标准的“墙”时钟(时间和日期)表达毫秒自纪元。该墙时钟能够被用户或电话网络(见setCurrentTimeMillis(long))设置,所以时间可能会向前或向后不可预知地跳。该时钟应该仅仅被使用,当现实世界的对应的日期和时间是重要的,例如在一个日历或闹钟应用程序。间隔的或经过的时间测量应该使用一个不同的时钟。如果你使用System.currentTimeMillis(),考虑监听<wbr></wbr>ACTION_TIME_TICKACTION_TIME_CHANGED<wbr></wbr>和<wbr></wbr>ACTION_TIMEZONE_CHANGED意图广播去发现当时间变化的时候。

uptimeMillis()以毫秒为单位进行计数自系统启动时,返回的是系统从启动到当前处于非休眠期的时间。该时钟停止当系统进入深度睡眠时(CPU关闭,显示黑暗,等待外部输入装置),但是不被时钟调整,闲置或其他节能机制影响。<wbr></wbr>这是基本的对于大多数时间间隔例如Thread.sleep(millls)Object.wait(millis),和<wbr></wbr>System.nanoTime()该时钟被保证是单调的,并且是为通用的用户界面事件,性能测量,和其他任何不需要在器件测量经过睡眠时间间隔时间的建议的基础。大多数的方法接受一个时间戳的值除了uptimeMillis()时钟。

elapsedRealtime()以毫秒为单位进行计数自动系统启动,包含深度睡眠。该时钟应该被使用当测量时间间隔可能跨越系统睡眠的时间段。

这有一些机制为了控制定时事件的:

标准的功能像<wbr></wbr>Thread.sleep(millis)<wbr></wbr>和<wbr></wbr>Object.wait(millis)<wbr></wbr>都总是合适的。这是功能使用uptimeMillis()时钟;如果该设备进入睡眠,剩余的时间将被推迟直到系统唤醒。这些同步功能可能被中断伴随<wbr></wbr>Thread.interrupt()方法,并且你必须处理InterruptedException异常。

SystemClock.sleep(millis)<wbr></wbr>是一种实用工具函数变化类似于Thread.sleep(millis)但是它忽视了InterruptedException异常。使用该函数产生的延迟如果你不使用Thread.interrupt(),因为它会保存线程的中断状态。

处理程序类可以安排在绝对或相对时间异步回调。处理器类对象也使用<wbr></wbr>uptimeMillis()时钟,并且需要一个event loop(正常呈现在任何一个GUI应用程序上)。该AlarmManager可以触发一次或重复事件去发生即使在深睡眠或你的应用程序没有运行。事件可能有计划的发生伴随你的<wbr></wbr>currentTimeMillis()(RTC)机会或<wbr></wbr>elapsedRealtime()<wbr></wbr>(ELAPSED_REALTIME),并且引起一个意图广播当它们发生时。

package com.oplus.engineermode.entrance; import android.app.AlertDialog; import android.app.KeyguardManager; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.CountDownTimer; import android.os.PowerManager; import android.os.SystemClock; import android.view.Window; import android.view.WindowManager; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.oplus.engineermode.R; import com.oplus.engineermode.core.sdk.entrance.EngineerFragmentCompat; import com.oplus.engineermode.display.sdk.EngineerDisplayManager; import com.oplus.engineermode.display.sdk.OplusDisplayPanelFeature; import com.oplus.engineermode.entrance.widget.ImageOptionPreference; import com.oplus.engineermode.core.sdk.featureoption.BaseFeatureOptions; import com.oplus.engineermode.manualtest.modeltest.ModelTestBaseAcivity; import com.oplus.engineermode.manualtest.modeltest.ModelTestImpl; import com.oplus.engineermode.core.sdk.modeltest.ModelTestItem; import com.oplus.engineermode.modeltest.ModelTestListManager; import com.oplus.engineermode.sensornew.featureoptions.SensorFeatureOptions; import com.oplus.engineermode.core.sdk.testrecord.constants.ReserveTestResult; import com.oplus.engineermode.core.sdk.testrecord.constants.TestEntrance; import com.oplus.engineermode.core.sdk.testrecord.constants.TestResult; import com.oplus.engineermode.core.sdk.testrecord.TestRecordAssistant; import com.oplus.engineermode.core.sdk.testrecord.record.TestRecord; import com.oplus.engineermode.touchscreen.base.TpCommonUtils; import com.oplus.engineermode.util.AodModeHelper; import com.oplus.engineermode.util.ExternFunction; import com.oplus.engineermode.core.sdk.impl.IPowerManagerImpl; import com.oplus.engineermode.core.sdk.impl.KeyguardManagerWrapper; import com.oplus.engineermode.core.sdk.utils.Log; import com.oplus.engineermode.util.OplusFeatureConfigManager; import com.oplus.engineermode.util.ProjectFeatureOptions; import com.oplus.engineermode.core.sdk.utils.ReflectionHelper; import com.oplus.engineermode.core.sdk.ui.ShowVerifyDialog; import com.oplus.engineermode.core.sdk.ui.ShowVerifyDialog.VerifyCallback; import com.oplus.engineermode.core.sdk.utils.SystemProperties; import java.util.Arrays; import java.util.List; import java.util.Map; public class ProductTestFragmentCompat extends EngineerFragmentCompat { private static final String TAG = "ProductTestFragment"; public static final String KEY_SDCARD_TEST = "sdcard_test"; public static final String KEY_SOUNDTRIGGER_TEST = "soundtrigger_test"; public static final String KEY_ELECTROCHROMIC_TEST = "electrochromic_test"; public static final String KEY_MODEL_TEST_PREFIX = "modeltest"; private static final long MILLIS_IN_FUTURE = 10000; private static final long COUNT_DOWN_INTERVAL = 1000; private static final String A2_SUB_BOARD_FUNCTION_TEST = "a2_sub_board_function_test"; private long mLastPreferenceClickTime = 0L; private PreferenceScreen mPreferenceScreen; private PowerManager mPowerManager; private PowerManager.WakeLock mCpuWakelock; private String mLastBlackGestureState = null; private List<String> mNfcModelList = Arrays.asList("modeltest31", "modeltest32"); private final CountDownTimer mBrightSpotDetectTimer = new CountDownTimer(MILLIS_IN_FUTURE, COUNT_DOWN_INTERVAL) { @Override public void onTick(final long millisUntilFinished) { Log.i(TAG, "mBrightSpotDetectTimer onTick"); if (mPowerManager.isInteractive()) { Log.i(TAG, "screen already on ?"); restoreAodAndBlackGesture(); mBrightSpotDetectTimer.cancel(); KeyguardManagerWrapper.requestDismissKeyguard(getActivity()); AlertDialog.Builder dialogBuilder; //# ifdef OPLUS_BUG_COMPATIBILITY //ChangFeiyue@ANDROID.ENGINEERTOOL, 2020/11/21, Modify for Dialog style with oplus Object style = ReflectionHelper.getDeclaredField(null, "com.oplus.internal.R$style", "Theme_Dialog_Alert"); //# endif /* OPLUS_BUG_COMPATIBILITY */ if (null != style) { dialogBuilder = new AlertDialog.Builder(mContext, (int) style); } else { dialogBuilder = new AlertDialog.Builder(mContext); } dialogBuilder.setCancelable(false); dialogBuilder.setTitle(R.string.fake_proximity_bright_spot_detect_title); dialogBuilder.setMessage(R.string.fake_proximity_bright_spot_detect_warning); dialogBuilder.setPositiveButton(R.string.ok, new OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { dialog.dismiss(); } }); dialogBuilder.create().show(); } } @Override public void onFinish() { Log.i(TAG, "fake proximity bright spot detect pass"); restoreAodAndBlackGesture(); mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_APPLICATION, PowerManager.wakeReasonToString(PowerManager.WAKE_REASON_APPLICATION)); KeyguardManagerWrapper.requestDismissKeyguard(getActivity()); AlertDialog.Builder dialogBuilder; //# ifdef OPLUS_BUG_COMPATIBILITY //ChangFeiyue@ANDROID.ENGINEERTOOL, 2020/11/21, Modify for Dialog style with oplus Object style = ReflectionHelper.getDeclaredField(null, "com.oplus.internal.R$style", "Theme_Dialog_Alert"); //# endif /* OPLUS_BUG_COMPATIBILITY */ if (null != style) { dialogBuilder = new AlertDialog.Builder(mContext, (int) style); } else { dialogBuilder = new AlertDialog.Builder(mContext); } dialogBuilder.setCancelable(false); dialogBuilder.setTitle(R.string.fake_proximity_bright_spot_detect_title); dialogBuilder.setMessage(R.string.fake_proximity_bright_spot_detect_result); dialogBuilder.setPositiveButton(R.string.fake_proximity_bright_spot_detect_pass, new OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { final TestRecord testRecord = new TestRecord(ReserveTestResult.FAKE_PROXIMITY_BRIGHT_SPOT_DETECT); testRecord.setEntrance(TestEntrance.MANUAL_TEST); testRecord.setTestResult(TestResult.PASS); TestRecordAssistant.saveTestRecord(testRecord); setPreferenceState("fake_proximity_bright_spot_detect", ExternFunction.TEST_PASS_NV_FLAG); dialog.dismiss(); } }); dialogBuilder.setNegativeButton(R.string.fake_proximity_bright_spot_detect_fail, new OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { final TestRecord testRecord = new TestRecord(ReserveTestResult.FAKE_PROXIMITY_BRIGHT_SPOT_DETECT); testRecord.setEntrance(TestEntrance.MANUAL_TEST); testRecord.setTestResult(TestResult.FAIL); TestRecordAssistant.saveTestRecord(testRecord); setPreferenceState("fake_proximity_bright_spot_detect", ExternFunction.TEST_FAIL_NV_FLAG); dialog.dismiss(); } }); AlertDialog alertDialog = dialogBuilder.create(); KeyguardManager keyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); if ((keyguardManager != null) && keyguardManager.isKeyguardSecure() && keyguardManager.isKeyguardLocked()) { Window window = alertDialog.getWindow(); if (window != null) { window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); } } alertDialog.show(); } }; /** * Default empty constructor */ public ProductTestFragmentCompat() { } @Override public void onDestroy() { if (mCpuWakelock.isHeld()) { mCpuWakelock.release(); } super.onDestroy(); } private void setPreferenceState(String key, byte flag) { Preference targetPre = findPreference(key); if (targetPre instanceof ImageOptionPreference) { ((ImageOptionPreference) targetPre).setState((int) flag); } } @Override public void onResume() { super.onResume(); mBrightSpotDetectTimer.cancel(); byte[] buff = ExternFunction.getProductLineTestFlag(); for (int i = ReserveTestResult.MODEL_TEST_1.getIndex(); i <= ReserveTestResult.MODEL_TEST_20.getIndex(); i++) { setPreferenceState(KEY_MODEL_TEST_PREFIX + (i + 1), buff[i]); } if (buff[ReserveTestResult.SDCARD_DETECT.getIndex()] == ExternFunction.TEST_PASS_NV_FLAG) { setPreferenceState(KEY_SDCARD_TEST, buff[ReserveTestResult.SDCARD_DETECT.getIndex()]); } else { setPreferenceState(KEY_SDCARD_TEST, ExternFunction.NOT_TEST_NV_FLAG); } setPreferenceState("fake_proximity_bright_spot_detect", buff[ReserveTestResult.FAKE_PROXIMITY_BRIGHT_SPOT_DETECT.getIndex()]); setPreferenceState(KEY_SOUNDTRIGGER_TEST, buff[ReserveTestResult.SOUND_TRIGGER_TEXT.getIndex()]); setPreferenceState(KEY_ELECTROCHROMIC_TEST, buff[ReserveTestResult.ELECTROCHROMIC_TEST.getIndex()]); } @Override public boolean onPreferenceTreeClick(Preference preference) { String key = preference.getKey(); Log.i(TAG, "onPreferenceTreeClick : intent=" + preference.getIntent() + ", key=" + key); // to avoid launch some test twice long current = SystemClock.elapsedRealtime(); if (current - mLastPreferenceClickTime > 300) { mLastPreferenceClickTime = current; } else { Log.i(TAG, "double click too fast"); return true; } if ((key != null) && ("screen_component_test_setting".equals(preference.getKey()))) { showInputDialog(preference); return true; } if ((preference instanceof ImageOptionPreference) && (key != null) && key.startsWith(KEY_MODEL_TEST_PREFIX)) { Intent intent = new Intent(mContext, ModelTestImpl.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra(ModelTestImpl.MODELTEST_KEY, key); startActivity(intent); return true; } if ("fake_proximity_bright_spot_detect".equals(key)) { final TestRecord testRecord = new TestRecord(ReserveTestResult.FAKE_PROXIMITY_BRIGHT_SPOT_DETECT); testRecord.setEntrance(TestEntrance.MANUAL_TEST); testRecord.setTestResult(TestResult.PENDING); TestRecordAssistant.saveTestRecord(testRecord); enableAodAndBlackGesture(); SystemClock.sleep(200); if (mCpuWakelock.isHeld()) { mCpuWakelock.release(); } mCpuWakelock.acquire(MILLIS_IN_FUTURE + COUNT_DOWN_INTERVAL); mPowerManager.goToSleep(SystemClock.uptimeMillis()); mBrightSpotDetectTimer.cancel(); mBrightSpotDetectTimer.start(); } return super.onPreferenceTreeClick(preference); } private void showInputDialog(Preference preference) { ShowVerifyDialog showVerifyDialog = new ShowVerifyDialog(mContext); showVerifyDialog.setVerifyKeyMode(ShowVerifyDialog.WARN); showVerifyDialog.show(new VerifyCallback() { @Override public void onNegativeClick() { } @Override public void onPositiveClick(final boolean verifyPass) { if (verifyPass) { Intent intent = preference.getIntent(); if (intent != null) { mContext.startActivity(intent); } } else { Log.i(TAG, "wrong passwd"); } } @Override public void onDismiss() { } }); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mCpuWakelock = IPowerManagerImpl.newWakeLock(mContext, PowerManager.PARTIAL_WAKE_LOCK, TAG); } @Override public void onCreatePreferences(Bundle bundle, String s) { mPreferenceScreen = getPreferenceManager().createPreferenceScreen(mContext); setPreferenceScreen(mPreferenceScreen); // add product line test list ModelTestListManager modelTestListManager = ModelTestListManager.getInstance(mContext.getApplicationContext()); Map<String, List<ModelTestItem>> internalModelTestMap = modelTestListManager.getInternalModelTestConfig(); Map<String, List<ModelTestItem>> externalModelTestMap = modelTestListManager.getExternalModelTestConfig(); Map<String, List<ModelTestItem>> defaultModelTestMap = modelTestListManager.getDefaultModelTestConfig(mContext); for (int i = 1; i <= ModelTestBaseAcivity.RESERVED_MODEL_TEST_END; i++) { String modelTestKey = KEY_MODEL_TEST_PREFIX + i; if (mNfcModelList.contains(modelTestKey)){ Log.i(TAG, "nfc modelTestKey not show:" + modelTestKey); continue; } String modelTestXmlId = modelTestKey + "_list.xml"; Preference modelTest = null; if ((externalModelTestMap != null) && externalModelTestMap.containsKey(modelTestXmlId)) { List<ModelTestItem> modelTestItemList = externalModelTestMap.get(modelTestXmlId); if ((modelTestItemList != null) && !modelTestItemList.isEmpty()) { modelTest = new ImageOptionPreference(mContext); modelTest.setTitle(getString(R.string.model_test_prefix) + i); modelTest.setKey(modelTestKey); modelTest.setSummary("Customization"); if (ProjectFeatureOptions.isActivityAvailable(mContext, new Intent(mContext, ModelTestImpl.class))) { mPreferenceScreen.addPreference(modelTest); } } } if (modelTest == null) { List<ModelTestItem> modelTestItemList = null; if ((internalModelTestMap != null) && internalModelTestMap.containsKey(modelTestXmlId)) { modelTestItemList = internalModelTestMap.get(modelTestXmlId); } else if ((defaultModelTestMap != null) && defaultModelTestMap.containsKey(modelTestXmlId)) { modelTestItemList = defaultModelTestMap.get(modelTestXmlId); } if ((modelTestItemList != null) && !modelTestItemList.isEmpty()) { modelTest = new ImageOptionPreference(mContext); modelTest.setTitle(getString(R.string.model_test_prefix) + i); modelTest.setKey(modelTestKey); if (ProjectFeatureOptions.isActivityAvailable(mContext, new Intent(mContext, ModelTestImpl.class))) { mPreferenceScreen.addPreference(modelTest); } } } } // add other preferences from xml. addPreferencesFromResource(R.xml.product_test); loadTestPreference(); } private void loadTestPreference() { if (!OplusDisplayPanelFeature.isDualDisplayPanelSupport()) { removeUnnecessaryPreference("sub_screen_aging"); } if (BaseFeatureOptions.isSupportNavigationBar(mContext)) { removeUnnecessaryPreference("screen_component_test"); } if (!SensorFeatureOptions.isFakeProximitySensorSupport()) { removeUnnecessaryPreference("fake_proximity_bright_spot_detect"); } if (!ProjectFeatureOptions.AUDIO_SOUNDTRIGGER_SUPPORTED || (BaseFeatureOptions.DEVICE_INITIAL_SDK_INT >= Build.VERSION_CODES.R)) { removeUnnecessaryPreference("soundtrigger_test"); } if (!ProjectFeatureOptions.ANT_PDS_DETECT_SUPPORTED) { removeUnnecessaryPreference("ant_pds_detect_test"); } else { if (SystemProperties.get("ro.separate.soft", "unknown").equals("19329")) { //19328 and 19329 are total different project, but uses same featureoptions.xml removeUnnecessaryPreference("ant_pds_detect_test"); } else if (!SystemProperties.get("ro.hw.phone.color", "unknown").equals("FF00CECA")) { //ant_pds_detect_test support, but with wrong color, <color name="darkgreen">#FF00CECA</color> removeUnnecessaryPreference("ant_pds_detect_test"); } } if (!OplusFeatureConfigManager.isRadioESimSupport()) { removeUnnecessaryPreference("esim_card"); } if (!ProjectFeatureOptions.ELECTROCHROMIC_SUPPORT) { removeUnnecessaryPreference("electrochromic_test"); } if (!EngineerDisplayManager.MultiScreenAdapter.isRemapDisplay()) { removeUnnecessaryPreference("sub_again_test"); } if (!ProjectFeatureOptions.FPGA_SUPPORTED) { removeUnnecessaryPreference("fpga_test"); removeUnnecessaryPreference(A2_SUB_BOARD_FUNCTION_TEST); } } //Add for fake proximity bright spot detect private void enableAodAndBlackGesture() { if (mLastBlackGestureState == null) { mLastBlackGestureState = TpCommonUtils.getBlackGestureEnableState(); } TpCommonUtils.setBlackGestureEnableState(TpCommonUtils.ENABLE_BLACK_GESTURE); AodModeHelper.getInstance().enableAod(mContext.getContentResolver()); } private void restoreAodAndBlackGesture() { if (mLastBlackGestureState != null) { TpCommonUtils.setBlackGestureEnableState(mLastBlackGestureState); mLastBlackGestureState = null; } AodModeHelper.getInstance().restoreAod(mContext.getContentResolver()); } }
最新发布
08-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值