我正在編寫警報應用程序。當響鈴時間到了,我希望設備喚醒并顯示允許用戶禁用鬧鐘的活動。它工作正常,除非設備被鎖定(也就是在鎖屏上)。我已經嘗試了很多我找到的關于這個的答案,但幾乎所有的東西似乎都被棄用了,我顯然想避免使用這些方法。使用我當前的代碼(我試圖將我找到的答案結合起來)它會振動很短的時間(我的鬧鐘應該在響鈴時這樣做,但通常它會持續到鬧鐘被禁用) ,但不會更多。之后解鎖設備時,不會顯示禁用警報的活動并且警報不會響起(由該活動完成)。但是,我已經檢查并確保 onCreate() 方法完全執行并且直到最后沒有任何錯誤。在我的 BroadcastReceiver 中(我使用 AlarmManager 在必要的時候執行我的代碼): @Override public void onReceive(Context context, Intent intent) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "myalarmapp:alarm."); wl.acquire(600000); Intent startAlarmActivity = new Intent(context, AlarmActivity.class); context.startActivity(startAlarmActivity); wl.release(); }在我的活動的 onCreate() 方法中: setContentView(R.layout.activity_alarm); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { setShowWhenLocked(true); setTurnScreenOn(true); KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); keyguardManager.requestDismissKeyguard(this, null); } else { getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); }在我的 AndroidManifest.xml 中: <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />...最好我希望活動顯示在鎖屏“上方”,但這不是我的主要優先事項。如果 Activity 開始并且用戶必須解鎖他們的手機才能看到它就足夠了,而 Activity 一直在振動并使手機響鈴。注意:我正在 Android 7.1 上測試我的應用程序,我當前的最低 API 級別是 21。
1 回答

慕姐8265434
TA貢獻1813條經驗 獲得超2個贊
我已經弄清楚了,喚醒鎖實際上并不是什么問題。問題是我還在活動的 onStop() 方法中取消了警報(并調用了 finish() )。當屏幕被鎖定時 onStop() 被立即調用,所以它也關閉了活動并停止響鈴。
我通過檢查以下布爾值來修復它(來源:檢測屏幕何時鎖定):
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
boolean isPhoneLocked = keyguardManager.inKeyguardRestrictedInputMode();
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenAwake = powerManager.isInteractive();
通過該解決方案,我還設法在鎖屏上顯示它,而無需為 AndroidManifest 中的活動設置選項。
添加回答
舉報
0/150
提交
取消