首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 鎖屏喚醒 Activity 無法保持屏幕常亮:FLAG_KEEP_SCREEN_ON 與 KeyguardManager 協同方案

     編輯:程式設計綜合問答

問題原因

鎖屏狀態下 FLAG_TURN_SCREEN_ON | FLAG_SHOW_WHEN_LOCKED | FLAG_KEEP_SCREEN_ON 僅能點亮屏幕,**不會阻止系統在無交互時再次熄屏**。需顯式調用 KeyguardManager.requestDismissKeyguard() 或使用 WakeLock。

完整解決方案 (API 27+ 推薦)

// 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 處理
    }
}

舊版兼容 (API < 27) - WakeLock 方案

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 確保準時喚醒。
  • Activity 標啟動模式 singleTop 或 singleTask 避免重複實例。
  • 播放鈴聲用 MediaPlayer + AudioManager.STREAM_ALARM,設置 setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) 保證 CPU 不休眠。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved