簡體   English   中英

從鎖定屏幕喚醒設備並顯示活動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM