Android 中获取稳定时间的方法 - 指南

news/2025/9/22 20:13:47/文章来源:https://www.cnblogs.com/tlnshuju/p/19105954

Android 中获取稳定时间的方法 - 指南

2025-09-22 20:10  tlnshuju  阅读(0)  评论(0)    收藏  举报

在Android中,获取不会因系统时间设置改变而跳变的时间通常需要利用基于设备启动时间的单调时钟。下面我将展示几种实现方式。

实现思路

1. 运用SystemClock.elapsedRealtime() - 基于设备启动时间,不受系统时间设置影响
2. 使用SystemClock.uptimeMillis() - 同样基于设备启动时间,但不包括深度睡眠时间
3. 使用System.nanoTime() - 高精度单调时间

示例代码实现

```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
android:orientation="vertical"
android:gravity="center">

<TextView
android:id="@+id/titleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="稳定时间获取示例"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="30dp"/>

<Button
android:id="@+id/elapsedRealtimeButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取elapsedRealtime"
android:layout_marginBottom="10dp"/>

<Button
android:id="@+id/uptimeMillisButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取uptimeMillis"
android:layout_marginBottom="10dp"/>

<Button
android:id="@+id/nanoTimeButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取nanoTime"
android:layout_marginBottom="30dp"/>

<TextView
android:id="@+id/resultTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="结果将显示在这里"
android:textSize="16sp"
android:gravity="center"
android:padding="10dp"
android:background="#f0f0f0"/>

</LinearLayout>
```

```java
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

private TextView resultTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

resultTextView = findViewById(R.id.resultTextView);
Button elapsedRealtimeButton = findViewById(R.id.elapsedRealtimeButton);
Button uptimeMillisButton = findViewById(R.id.uptimeMillisButton);
Button nanoTimeButton = findViewById(R.id.nanoTimeButton);

elapsedRealtimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long elapsedTime = SystemClock.elapsedRealtime();
resultTextView.setText("elapsedRealtime: " + elapsedTime + "ms\n" +
"格式化为时间: " + formatTime(elapsedTime));
}
});

uptimeMillisButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long uptime = SystemClock.uptimeMillis();
resultTextView.setText("uptimeMillis: " + uptime + "ms\n" +
"格式化为时间: " + formatTime(uptime));
}
});

nanoTimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long nanoTime = System.nanoTime();
resultTextView.setText("nanoTime: " + nanoTime + "ns\n" +
"转换为毫秒: " + (nanoTime / 1_000_000) + "ms");
}
});
}

private String formatTime(long milliseconds) {
long seconds = milliseconds / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;

return String.format("%d天 %02d:%02d:%02d.%03d",
days, hours % 24, minutes % 60, seconds % 60, milliseconds % 1000);
}
}
```

关键说明

1. SystemClock.elapsedRealtime():
· 自设备启动以来经过的时间,包括深度睡眠时间
· 最适合测量时间间隔,不受系统时间设置影响
2. SystemClock.uptimeMillis():
· 自设备启动以来经过的时间,不包括深度睡眠时间
· 适合应该忽略设备睡眠时间的场景
3. System.nanoTime():
· 提供纳秒级精度的时间
· 通常用于性能测量和高精度计时

这些技巧都提供了单调递增的时间值,不会因为用户更改系统时间或自动时间同步而跳变。

使用场景建议

· 测量时间间隔或耗时操作:使用elapsedRealtime()或uptimeMillis()
· 高精度性能测量:利用nanoTime()
· 需跨设备重启保持时间跟踪:需要将时间持久化存储并与elapsedRealtime()结合使用

注意:如果必须跨设备重启保持时间跟踪,允许将设备启动时间与elapsedRealtime()结合使用,但这必须额外的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【精品资料鉴赏】RPA财务机器人应用(基于UiPath)教材配套课件 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何让AI生成多页面APP原型图?AI原型设计实用指南

引言 很多产品经理已经在实际项目中开始使用AI原型设计工具,尤其是在制作APP原型图、小程序原型图等产品项目中。AI可以帮助产品经理快速产出原型图,但是也有一些容易被忽视的实用功能。例如:如何一次性生成多个页面…

国外优秀网站建设公司淄博优化网站

默认为递增顺序&#xff1b;注&#xff1a;一下例子希望自己再次复习时&#xff0c;可以用笔在纸上画画内存图。 包括有: 选择排序冒泡排序插入排序 1.选择排序 <--------------------------------------选择排序---------------------------------------> 1、选择排…

北京摇号网站维护企业网站优化托管

1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂. Makefile的组织流程的能力如此之强, 不仅可以用来编译项目, 还可以用来组织我们平时的一些…

做网站成都求几个能用的地址2021

文章目录一、第1种方式1. 因依赖2. 工具类测试方法3. 服务端接收二、第2种方式三、第3种方式3.1. 引依赖3.2. 工具类测试3.3. 服务端代码一、第1种方式 1. 因依赖 <!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient --><dependency>…

广州翼讯资讯科技有限公司 网站地方建立网站做SEM

go-zero整合单机版Redis并实现增删改查 本教程基于go-zero微服务入门教程&#xff0c;项目工程结构同上一个教程。 go-zero微服务入门教程&#xff08;点击进入&#xff09; 本教程主要实现go-zero框架整合单机版Redis&#xff0c;并暴露接口实现对Redis数据的增删改查。 本…

政务网站建设经验交流发言百度推广怎么运营

目录 1、QT介绍 2、QT的特点 3、QT模块 3.1基本模块 3.2扩展模块 4、QT工程创建 1.选择应用的窗体格式 2.设置工程的名称与路径 3.设置类名 4.选择编译器 5、QT 工程解析 xxx.pro 工程配置 xxx.h 头文件 main.cpp 主函数 xxx.cpp 文件 6、纯手工创建一个QT 工程…

嘉兴型网站系统总部在什么网站上可以做中学数学家教

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代&#xff0c;越来越多的人不愿意花时间阅读书籍&#xff0c;碎片化阅读成了主流。人们获取的东西多而杂&#xff0c;很难系统、全面。海量信息对人是冲击&#xff0c;更是诱惑。谁不想了解天下奇闻&…

网站建设先进跟我学seo从入门到精通

前言 从刚开始学习阶段&#xff0c;一直是用的keil5开发stm32程序&#xff0c;自从看到稚晖君推荐的CLion开发嵌入式程序后&#xff0c;这次尝试在CLion上开发stm32程序。 1、配置CLion用于STM32开发的环境 这里我就不详细写了&#xff0c;没必要重新写&#xff0c;网上教程很多…

商城网站微信支付接口申请流程网站留言板怎么做

《基于单片机的物流皮带传输监控系统设计 实物仿真》 整体功能&#xff1a; 本设计采用以单片机为核心控制器&#xff0c;以及传感器检测部分作为输入部分&#xff0c;以报警、显示、洒水、排烟、电机停止模块作为输出部分&#xff0c;构成整个物流皮带传输监控系统。 本设计…

北京哪个网站最好重庆哪个网站建设比较好

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 . 表示&#xff09;和墙&#xff08;用 表示&#xff09;。 同时给你迷宫的入口 entrance &#xff0c;用 entrance [entra…

简洁的网站建设合同武进做网站的公司

通信&#xff0c;在古代是通过书信与他人互通信息的意思。 今天&#xff0c;“通信”这个词的外沿已经得到了极大扩展&#xff0c;它目前的大意是指双方或多方借助某种媒介实现信息互通的行为。 如果按照当代汉语的方式理解“通信”&#xff0c;那么古代的互遣使节、飞鸽传书…

济南网站建设直播苗木企业网站源码

一、首先需要思考&#xff0c;我们在页面导出excel&#xff0c;用python导出如何写入文件的 封装前需要确认python导出excel接口返回的是一个什么样的数据类型 如下&#xff1a;我们先看下不对返回结果做处理&#xff0c;直接接收数据类型是一个对象&#xff0c;无法获取返回值…

代码随想录算法训练营第五天 | leetcode 242 349 202 1

有效的字母异位词 题目:判断两个字符串的字母是否一样 解题思路:通过字母在Ascll表对应的数字可以定义一个26容量大小的数组,将字符串包含的字母映射到数组中,再用另一个字符串对数组进行操作 代码如下: class So…

CF2146 Codeforces Round 1052 (Div. 2) 游记

A 秒了,B 挂了,1t寄了,差点掉到青名。省流 A 秒了,B 挂了,1t寄了,差点掉到青名。9.21 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 毫无压力的新开一把,飞线接上了电源,不会因为电脑没电下班了。 赛时…

原码补码反码与位操作

今天搜索互联网那个引擎了解了原码补码反码的相关概念 原码是最直观的编码方式,用最高位表示符号(0为正,1为负),其余位表示数值的绝对值 正数的反码与原码相同;负数的反码是对其原码的数值位取反(符号位不变) …

如何安装 SQLPro Studio for Mac?v2024.21.dmg 文件安装步骤详解(附安装包)

如何安装 SQLPro Studio for Mac?v2024.21.dmg 文件安装步骤详解(附安装包)​一、安装前准备​确保你下的是靠谱的文件​ SQLPro Studio for Mac v2024.21.dmg​ 应该是一个 ​DMG 格式的安装包,安装包下载:https…

全新正版营销网站怎么给钓鱼网站做防红

计算函数的变分是指在变分法中寻找函数的极值。变分法是一种数学方法&#xff0c;用于求解函数或泛函的极值问题。在物理学、工程学和数学的最优化问题中&#xff0c;变分法是寻找函数使得某个泛函&#xff08;函数的函数&#xff09;达到极值的过程。 在数学上&#xff0c;泛…

网站建设方案平台架构做网站需要备案吗

2017年2月8日&#xff0c;那是一个阴天。为了完成高翔博士的《一起做RGB-D SLAM》教程&#xff0c;我在 Ubuntu 14.04 安装 g2o。遇到困难&#xff0c;怎奈我眼瞎&#xff0c;找错了方向&#xff0c;浪费时间&#xff0c;没有成功安装。 问题如下&#xff08;跳到最后一个问题描…

郑州炫彩网站建设万网网站建设流程

IO流IO流使用场景 什么是IO流常用的IO流字节流字符流缓冲流 BIO、NIO、AIO的区别 IO流 IO流使用场景 如果操作的是纯文本文件&#xff0c;优先使用字符流如果操作的是图片、视频、音频等二进制文件。优先使用字节流如果不确定文件类型&#xff0c;优先使用字节流。字节流是万能…