Toàn bộ foreground service của chúng tôi, quay thành video
Google Play đòi một đoạn quay màn hình cho mỗi loại foreground service mà app khai báo. Đây là bộ video đó — bảy app, mỗi app một trang, quay trên máy thật — kèm giải thích mỗi service làm gì và vì sao cần nó.
Từ Android 14, app chạy foreground service phải nói rõ đó là việc gì: location, mediaPlayback, mediaProjection, dataSync, specialUse… Google Play sau đó bắt giải trình từng loại đã khai — và với hầu hết các loại, phải đính kèm một đoạn quay màn hình cho thấy tính năng đang chạy thật.
Đòi hỏi đó là hợp lý. Thêm một dòng vào manifest thì dễ; quay được cảnh tính năng đang chạy thì không. Nên thay vì gửi cho bên duyệt một đoạn clip rồi quên, chúng tôi quay toàn bộ foreground service đang phát hành và đặt mỗi cái ở một trang riêng. Cùng một đường dẫn đó vừa gửi cho Play, vừa dành cho ai muốn biết app làm gì lúc không hiện trên màn hình.
Mọi đoạn dưới đây đều quay trên máy thật — Pixel 10 Pro XL chạy Android 17 — không phải máy ảo. Đoạn nào cũng theo một mạch: mở app, bật tính năng, thoát khỏi app, kéo thanh thông báo xuống, và cho thấy thông báo của chính service đó nằm sẵn kèm các nút điều khiển. Đó mới là phần bên duyệt cần thấy: service tự khai mình đang chạy, và người dùng tắt được nó ngay từ thanh thông báo mà không cần mở lại app.
Danh sách demo
| App | Loại | Service | Video |
|---|---|---|---|
| GPS Speedometer | location | TripRecordingService, FloatingSpeedService | xem |
| Volume Booster | mediaPlayback | AudioEffectService | xem |
| Interval Timer | mediaPlayback | TimerService | xem |
| Tuner & Metronome | mediaPlayback | MetronomeService | xem |
| Screen Mirror | mediaProjection, microphone | MirrorService | xem |
| Battery Health | specialUse | ChargeMonitorService | xem |
| Device Info | specialUse | MonitorService | xem |
Vì sao cần từng cái
GPS Speedometer — location. Ghi lại chuyến đi là lý do tồn tại của app, mà một chuyến ngừng ghi ngay khi bỏ điện thoại vào túi thì vô dụng. TripRecordingService giữ định vị sống lúc màn hình tắt, kèm thông báo hiện tốc độ và quãng đường theo thời gian thực cùng đúng một nút Stop. Bong bóng tốc độ nổi dùng cùng loại vì cùng lý do. Không có gì được gửi đi: toạ độ nằm trong cơ sở dữ liệu của app ngay trên máy.
Volume Booster — mediaPlayback. Phần khuếch đại và equalizer gắn vào phiên âm thanh của hệ thống; chúng phải sống lâu hơn giao diện app, không thì hiệu ứng tắt ngay lúc bạn chuyển sang app nghe nhạc — đúng lúc bạn cần nó nhất. Thông báo hiện preset đang bật và có sẵn Turn off / Turn on cùng Stop, nên hiệu ứng không bao giờ chạy lén.
Interval Timer — mediaPlayback. Đồng hồ HIIT mà khoá màn hình là dừng thì không còn là đồng hồ. Service giữ việc đếm ngược từng hiệp và tiếng báo chuyển hiệp chạy khi màn hình tắt, còn thông báo đóng vai điều khiển từ xa: hiệp hiện tại, thời gian còn lại, tạm dừng và dừng hẳn.
Tuner & Metronome — mediaPlayback. Máy gõ nhịp là phát âm thanh thật với yêu cầu về độ chính xác thời gian. Chạy nó trong foreground service là cách giữ tiếng gõ đều trong khi bạn mở app khác xem hợp âm.
Screen Mirror — mediaProjection + microphone. Trên Android, quay màn hình chỉ hợp lệ khi app nằm trong một foreground service, và hộp thoại xin phép chiếu màn hình là quyết định của người dùng ở mỗi phiên. Loại microphone có mặt vì phần tiếng bình luận là tuỳ chọn và mặc định tắt.
Battery Health và Device Info — specialUse. Hai cái này là ngoại lệ, và chúng tôi nói thẳng. Cả hai đều theo dõi một tín hiệu hệ thống theo thời gian — dòng sạc, nhiệt độ, điện áp trong một phiên sạc với Battery Health; CPU, bộ nhớ, trạng thái nhiệt với Device Info — và không cái nào khớp với các loại có tên sẵn, vì Android không có hạng mục nào cho việc “đọc cảm biến khi người dùng đang đi chỗ khác”. Còn lại là specialUse, và mỗi app khai rõ subtype trong manifest (battery_monitoring và device_stats_monitoring) kèm phần giải trình bằng chữ mà Play yêu cầu. Cả hai service đều chỉ khởi động khi người dùng bấm, đều hiện thông báo suốt thời gian chạy, và đều tự dừng khi xong việc.
Thứ bạn sẽ không thấy trong video
Không tài khoản, không đăng nhập, không một lệnh gọi mạng nào. Các app này không có máy chủ; những service trên đọc cảm biến hoặc phát âm thanh, ghi vào bộ nhớ máy, rồi dừng. Thanh thông báo trong bản quay đã được che — điện thoại là của một con người, tin nhắn và thư của họ không liên quan gì đến Google hay đến bạn — nên mọi thứ không phải thông báo của chúng tôi đều bị phủ một khối đặc. Riêng thông báo của chính app thì không bao giờ che, vì đó mới là thứ cần quay.
Cho anh em làm app
Nếu bạn cũng đang nhìn cái biểu mẫu duyệt đó: quay trên máy thật, cho thấy thanh thông báo, và để lộ rõ nút dừng. Bên duyệt kiểm ba điều — service có làm đúng loại đã khai không, người dùng có chủ động bật nó không, và người dùng có tắt được mà không phải lục lại trong app không. Ba mươi giây video trả lời cả ba. Đặt clip ở một đường dẫn cố định thay vì đính kèm file còn có cái lợi: lần duyệt sau, ở bản phát hành sau, chỉ việc dán lại.