android.os.SystemClock

本文详细介绍了Android系统中SystemClock类的uptimeMillis与elapsedRealtime两个关键方法,它们分别用于记录设备自启动以来的运行时间和包括待机在内的总时间。此外还对比了Java中的System.currentTimeMillis()方法,并探讨了在Android开发中推荐使用的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SystemClock里面有许多关于时间的方法,记录:

SystemClock.uptimeMillis、SystemClock.elapsedRealtime()两个方法为主

uptimeMillis()记录的是从开机到现在的毫秒数(手机睡眠、待机、息屏等时间不包括在内),但是该事件不可以被时钟调整,或其他节能机制影响。 这是基本的对于大多数时间间隔例如Thread.sleep(millls),Object.wait(millis),和 System.nanoTime()。该时钟被保证是单调的,并且是为通用的用户界面事件,性能测量,和其他任何不需要在器件测量经过睡眠时间间隔时间的建议的基础。大多数的方法接受一个时间戳的值除了uptimeMillis()时钟

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

其中Java语言中有个System.currentTimeMillis(),他表示的是 从1970年1月1日 UTC到现在的毫秒数,但是可以通过System.setCurrentTimeMillis修改的,那么,在某些情况下,一但被修改,时间间隔就不准了。因此在android有些需要使用到时间间隔的方法里面都是不建议使用Java里面的这个函数,而转用SystemClock.uptimeMillis

因此Android里面基于时间间隔的函数、操作等建议使用SystemClock.uptimeMillis(),以保证不被其他机制影响,如Android的AlarmManager等需要時間間隔後出發或重複出發某一程序的地方。

SystemClock里面有一个工具性函数SystemClock.sleep(millis) ,其功能类似Thread.sleep(millis),但是它忽视了原有的InterruptedException异常。使用该函数产生的延迟如果你不使用Thread.interrupt(),因为它会保存线程的中断状态。

我刚开始弄framework,我想问问我该如何看源码,比如下面这段我该怎么看呢? /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quickstep; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.quickstep.util.ActiveGestureLog.INTENT_EXTRA_LOG_TRACE_ID; import android.annotation.TargetApi; import android.content.Intent; import android.graphics.PointF; import android.os.Build; import android.os.SystemClock; import android.os.Trace; import android.view.View; import androidx.annotation.BinderThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; import com.android.launcher3.DeviceProfile; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.util.RunnableList; import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener; import com.android.quickstep.views.DesktopTaskView; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; /** * Helper class to handle various atomic commands for switching between Overview. *
最新发布
03-13
<think>好的,用户想了解如何阅读和理解Android框架源码,特别是com.android.quickstep包中的代码示例。我需要根据提供的引用内容来组织回答。首先,用户的问题涉及到源码阅读,而提供的引用中有几个关于quickstep的代码示例和编译问题的内容,需要结合这些信息来回答。 首先,我应该从整体上建议用户如何开始阅读Android框架源码。可能包括环境搭建、代码结构、调试方法等。然后,针对com.android.quickstep包,可能需要解释它的作用,比如处理手势导航,如引用2和3提到的Recents多任务和手势导航架构。用户提供的引用2中的代码片段展示了触发震动的Haptic反馈,这可能与手势操作相关,可以作为一个例子来说明如何跟踪代码流程。 接下来,我需要考虑用户可能的难点,比如代码量大、模块依赖复杂,还有编译问题,比如引用4提到的编译失败,可能需要提醒用户注意环境配置。此外,引用3中的参数传递和Binder通信可能涉及到系统服务的交互,这部分需要解释如何理解跨进程通信。 还需要建议用户使用工具,如Android Studio的调试功能,或者查看官方文档,如引用1中的权限说明,虽然不直接相关,但可以引导用户查阅官方资源。另外,用户可能需要了解如何查找具体的代码实现,比如通过搜索关键字或使用Git blame查看修改历史。 最后,生成相关问题时要围绕源码阅读方法、模块分析、调试技巧、编译问题解决等方面,确保问题相关且有帮助。</think>### 如何阅读和理解Android Framework源码(以com.android.quickstep为例) #### 1. **搭建源码阅读环境** - **下载AOSP源码**:通过Google官方仓库同步Android源码,建议选择与目标设备匹配的分支(如`android-13.0.0_rXX`)[^4]。 - **使用IDE工具**:Android Studio的`File > Open`可直接导入源码目录,利用代码索引功能快速跳转。 - **编译调试支持**:配置Jack Server参数(如引用[4]中的`JACK_SERVER_COMMAND`),避免编译内存不足问题。 #### 2. **理解com.android.quickstep模块** 该包负责Android手势导航(如底部上滑进入多任务视图),核心功能包括: - **手势事件处理**:如`BaseSwipeUpHandler.java`中触发震动的代码(引用[2]): ```java protected void performHapticFeedback() { VibratorWrapper.INSTANCE.get(mContext).vibrate(OVERVIEW_HAPTIC); } ``` 此方法在用户手势操作时调用系统振动服务。 - **跨进程通信**:通过Binder与SystemUI交互,如引用[3]中的`params.putBinder(KEY_EXTRA_SYSUI_PROXY, mSysUiProxy.asBinder())`。 #### 3. **代码分析技巧** - **模块化跟踪**:从入口类(如`RecentsActivity`)开始,逐步跟踪生命周期和事件传递。 - **日志调试**:在关键路径添加`Log.d()`,通过`adb logcat`观察执行流程。 - **官方文档辅助**:参考[Android开发者文档](https://developer.android.com)理解权限机制(如引用[1])和API设计。 #### 4. **实战示例:分析手势触发流程** 1. **触发入口**:从`SystemUI`的`GestureLauncherService`接收手势事件。 2. **事件处理**:在`QuickStepContract`中定义手势类型,通过`TouchInteractionService`转发到Launcher进程。 3. **反馈实现**:如震动效果通过`VibratorWrapper`调用系统服务(引用[2])。 #### 5. **常见问题解决** - **代码跳转失败**:检查SDK版本是否匹配,或通过`Ctrl+Shift+F`全局搜索符号。 - **编译错误**:调整Jack Server内存参数(如引用[4]中的`-Xmx2048M`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值