鎖屏狀態下 FLAG_TURN_SCREEN_ON | FLAG_SHOW_WHEN_LOCKED | FLAG_KEEP_SCREEN_ON 僅能點亮屏幕,**不會阻止系統在無交互時再次熄屏**。需顯式調用 KeyguardManager.requestDismissKeyguard() 或使用 WakeLock。
// 1. Activity onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 必須在 setContentView 之前
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
);
setContentView(R.layout.alarm_activity);
// 2. 解鎖 (API 28+ 需權限 REQUEST_DISMISS_KEYGUARD)
KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
km.requestDismissKeyguard(this, null);
} else {
// 舊版已由 FLAG_DISMISS_KEYGUARD 處理
}
}
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(
PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
"AlarmApp::WakeLock"
);
wakeLock.acquire(10*60*1000L); // 最長持有 10 分鐘
// onDestroy 釋放
@Override protected void onDestroy() { wakeLock.release(); super.onDestroy(); }
需清單權限 <uses-permission android:name="android.permission.WAKE_LOCK"/>。
setExactAndAllowWhileIdle / setAlarmClock 確保準時喚醒。singleTop 或 singleTask 避免重複實例。MediaPlayer + AudioManager.STREAM_ALARM,設置 setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) 保證 CPU 不休眠。