aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android elapsedRealtime và uptimeMillis: thời gian máy ngủ có được tính không?

Suong Nguyen by Suong Nguyen
07/11/2026
in Lập trình Mobile
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Bạn muốn một khoảng chờ vẫn hết hạn khi điện thoại đã ngủ một lúc. Một phép trừ hai mốc uptime có thể cho thời lượng ngắn hơn kỳ vọng vì đồng hồ ấy không tính deep sleep. Chọn đúng clock cần bắt đầu từ định nghĩa khoảng thời gian, không chỉ từ đơn vị millisecond.

Bài đọc Android SystemClock và System ngày 07/11/2026. Mẫu Kotlin giả định minSdk từ 23; elapsedRealtime và uptimeMillis có từ API 1. Code được rà thủ công, chưa build Android hoặc chạy thử deep sleep trên thiết bị. Các số bên dưới là dữ liệu minh họa phép tính, không phải log đo pin hay thời gian ngủ thật.

Ba câu hỏi cho ba loại mốc

System.currentTimeMillis biểu diễn thời điểm theo lịch, tính từ epoch. Nó phù hợp khi bạn cần ghi timestamp để hiển thị hoặc đối chiếu thời điểm, nhưng đồng hồ lịch có thể được chỉnh.

SystemClock.elapsedRealtime đếm từ lúc boot và bao gồm deep sleep. uptimeMillis cũng đếm từ boot nhưng loại thời gian deep sleep. Với phép đo khoảng thời gian thông thường có tính lúc máy ngủ, elapsedRealtime là lựa chọn được tài liệu khuyến nghị.

Hai giá trị since-boot không phải timestamp UTC. Đừng đưa chúng trực tiếp vào trình định dạng ngày giờ rồi kỳ vọng nhận đúng ngày sự kiện.

1. Tách phép so thời lượng khỏi việc đọc clock

Trong file Kotlin của module Android, có thể định nghĩa helper thuần sau. Nó giả định start và now đến từ cùng một clock trong cùng lần boot:

fun hasElapsed(startMs: Long, nowMs: Long, durationMs: Long): Boolean {
    require(startMs >= 0)
    require(nowMs >= startMs)
    require(durationMs >= 0)
    return nowMs - startMs >= durationMs
}

Định nghĩa dùng dấu >= nên đúng tại biên cũng được coi là hết khoảng chờ. Duration bằng 0 hết ngay khi đọc cùng mốc start. Nếu nghiệp vụ muốn quy tắc khác, đổi hợp đồng và assertions thay vì sửa mơ hồ một dấu so sánh.

Helper không phát hiện đáng tin cậy một lần reboot từ mọi cặp số. Điều kiện now lớn hơn start không chứng minh hai mốc thuộc cùng lần boot. Người gọi phải bảo đảm nguồn và vòng đời của hai mốc.

2. Đọc elapsedRealtime trong một đối tượng giữ ở bộ nhớ

Ghép class sau vào cùng file, giữ import ở đầu file Kotlin:

import android.os.SystemClock

class InMemoryWaitWindow(private val durationMs: Long) {
    private val startedAt = SystemClock.elapsedRealtime()

    init {
        require(durationMs >= 0)
    }

    fun hasExpired(): Boolean {
        return hasElapsed(startedAt, SystemClock.elapsedRealtime(), durationMs)
    }
}

Đối tượng chỉ giữ mốc trong bộ nhớ. Nó không đăng ký timer, không tự đánh thức app và không gọi callback khi hết hạn. hasExpired chỉ trả lời câu hỏi tại lúc bạn gọi nó; lịch thực thi một công việc là bài toán khác.

Mẫu cũng không lưu startedAt vào preferences để dùng qua reboot. Nếu cần trạng thái hết hạn tồn tại qua nhiều lần mở máy hoặc đồng bộ giữa thiết bị, thiết kế thêm nguồn thời gian và chính sách nghiệp vụ phù hợp.

Kiểm tra phép tính bằng đầu vào biết trước

Với duration 5000, start 1000 và now 5999 phải chưa hết hạn; now 6000 phải hết. Thêm ca duration 0, now nhỏ hơn start và duration âm để kiểm tra guard. Những ca này kiểm tra logic helper, chưa kiểm tra implementation SystemClock của Android.

Giả sử một kịch bản có 3000 ms máy hoạt động và 10000 ms deep sleep. Theo định nghĩa đồng hồ, mức tăng minh họa của elapsed là 13000 ms, còn uptime là 3000 ms. Không dùng thao tác tắt màn hình đơn thuần làm bằng chứng rằng thiết bị đã thật sự vào deep sleep.

Giới hạn cần giữ khi đo thực tế

Hai lần đọc clock có độ phân giải và chi phí của môi trường thực. Một ví dụ dùng đơn vị millisecond không chứng minh bạn đo chính xác đến từng millisecond cho mọi thao tác. Khi benchmark, xác định workload, warm-up và công cụ đo riêng; bài không đưa số liệu benchmark.

Không dùng mốc elapsed của máy này để trừ mốc của máy khác, hoặc trộn elapsed với currentTimeMillis. Các hệ quy chiếu khác nhau có thể tạo ra con số trông hợp lệ nhưng không đại diện khoảng thời gian cần đo.

Ghi rõ tên clock trong biến, loại mốc trong dữ liệu chẩn đoán và vòng đời mà mốc được phép dùng. Cách đặt hợp đồng ấy giúp bạn tránh đọc “năm giây” theo hai định nghĩa khác nhau khi app đi vào trạng thái ngủ.

Nguồn tham khảo

  • Android: SystemClock và deep sleep
  • Android: System.currentTimeMillis

Tags: AndroidSystemClockThời gian
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android SharedPreferences.apply: đọc lại được chưa chứng minh đã ghi xong xuống đĩa

by Suong Nguyen
06/11/2026
0

Tách việc cập nhật SharedPreferences trong bộ nhớ khỏi xác nhận lưu bền vững, và kiểm tra đúng phạm vi của apply với commit.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android Uri.Builder: thêm query parameter mà không ghép chuỗi thủ công

by Suong Nguyen
05/11/2026
0

Tạo URI tìm kiếm có tiếng Việt, dấu & và dấu cộng bằng appendQueryParameter rồi kiểm tra giá trị đã giải mã.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android LayoutParams nhận pixel: đổi dp đúng một lần

by Suong Nguyen
04/11/2026
0

Dùng TypedValue.applyDimension để đưa khoảng cách dp vào LayoutParams bằng code, đồng thời tránh đổi lại những kích thước vốn đã là pixel.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android INVISIBLE và GONE: ẩn nội dung có cần giữ chỗ không?

by Suong Nguyen
03/11/2026
0

Dùng LinearLayout thử ba trạng thái VISIBLE, INVISIBLE và GONE để chọn cách ẩn một vùng thông tin theo nhu cầu giữ khoảng trống.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native FlatList hai cột: numColumns không tạo layout masonry
  • JavaScript Set với object: cùng id vẫn có thể là hai phần tử
  • Android elapsedRealtime và uptimeMillis: thời gian máy ngủ có được tính không?

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply