[英]Waking up the Device from a Lockscreen and showing an Activity
我正在編寫一個警報應用程序。 當需要響鈴時,我希望設備喚醒並顯示我的活動,允許用戶禁用警報。 除了設備被鎖定(也就是在鎖定屏幕上)之外,它工作正常。
我已經嘗試了很多關於這個的答案,但幾乎所有的東西似乎都被棄用了,我顯然想避免使用這些方法。 使用我當前的代碼(我試圖將我找到的答案組合在一起)它將振動很短的時間(我的警報應該在它響起時發生,但通常會一直持續到警報被禁用)但不是更多。 之后解鎖設備時,不會顯示禁用警報的活動,並且警報未響鈴(由該活動完成)。 但是我已經檢查並確保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
android:name=".view.AlarmActivity"
android:excludeFromRecents="true"
android:showOnLockScreen="true"
android:showWhenLocked="true"
android:turnScreenOn="true"
android:showForAllUsers="true">
</activity>
我最好希望活動顯示在鎖屏的“上方”,但這不是我的主要優先事項。 如果活動開始並且用戶必須解鎖他們的手機才能看到它就足夠了,同時活動正在振動並振鈴電話。 注意:我正在Android 7.1上測試我的應用程序,目前的最低API級別為21。
我已經弄清楚了,它實際上與喚醒鎖沒有問題。 問題是我還在活動的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中的活動設置選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.