商店展示機需在用戶無操作一段時間後,自動播放宣傳影片;使用者觸碰螢幕則回到互動介面。
在 Application 或基底 Activity 中攔截所有觸控/按鍵事件,重置倒數計時器。
public class MyApplication extends Application {
private static final long IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 分鐘
private Handler handler = new Handler(Looper.getMainLooper());
private Runnable idleAction = this::startAttractMode;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override public void onActivityResumed(Activity act) { resetIdleTimer(); }
// 其他回調留空
});
}
public void resetIdleTimer() {
handler.removeCallbacks(idleAction);
handler.postDelayed(idleAction, IDLE_TIMEOUT_MS);
}
private void startAttractMode() {
// 啟動宣傳片 Activity,或發送全域廣播通知當前 Activity 切換
Intent intent = new Intent(this, AttractVideoActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
}
dispatchTouchEvent / onKeyDown 可捕獲觸控、實體鍵;若需捕獲系統級事件 (如掃描槍、NFC),可在 ViewGroup 根佈局 setOnTouchListener。ACTION_SCREEN_OFF 無法區分自動熄屏與按電源鍵。不依賴螢幕狀態,改用「使用者輸入事件重置計時器」 才是正確邏輯。handler.removeCallbacks 確保同一時間只有一個倒數任務。AttractVideoActivity.onTouchEvent 中 finish() 返回主介面,並呼叫 ((MyApplication)getApplication()).resetIdleTimer()。Android 4.2+ 支援 DreamService (Daydream/螢幕保護程式),可在充電/靜止時自動啟動,但無法精確控制「無操作 N 分鐘」觸發條件,且需用戶在設定中啟用,適合簡單場景。
推薦:應用層計時器 + 事件攔截,邏輯可控、不依賴系統設定、支援複雜業務流程。