遇到的问题
存在密码锁,亮屏 screen_on 后不回调Activity的onResume
解决方法
- 需要添加 FLAG_SHOW_WHEN_LOCKED 的 window-flag。移除锁屏界面。
int flags = WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES
| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
getWindow().addFlags(flags);
- 遇到了加了 FLAG_SHOW_WHEN_LOCKED 仍然不会回调 onResume,也就是没有移除锁屏界面
通过代码跟踪,发现了如下代码逻辑。
原因:1. 由于 FLAG_DISMISS_KEYGUARD 和 FLAG_SHOW_WHEN_LOCKED 属性是相互冲突的
FLAG_SHOW_WHEN_LOCKED
一个特殊的flag,使得window可以在锁屏状态下显示,这个flag会使得window比keyguard或其他锁屏界面具有更高的层级可以配合FLAG_KEEP_SCREEN_ON使用,点亮屏幕,在显示keyguard window之前显示你的window.可以配合FLAG_DISMISS_KEYGUARD使用来自动解锁没密码的keyguards这个flag只能应用在最顶层的全屏window上,用人话说就是可以让window显示在锁屏界面上
FLAG_DISMISS_KEYGUARD
当使用的是无密码的锁屏界面,显示此window会使锁屏界面被自动解锁
PhoneWindowManager.java
@Override
public void applyPostLayoutPolicyLw(WindowState win, WindowManager.LayoutParams attrs,
WindowState attached) {
...
if (!mAppsThatDismissKeyguard.isEmpty() &&
mDismissKeyguard == DISMISS_KEYGUARD_NONE) {
if (DEBUG_LAYOUT) Slog.v(TAG,
"Setting mDismissKeyguard true by win " + win);
mDismissKeyguard = (mWinDismissingKeyguard == win
&& mSecureDismissingKeyguard == mKeyguardSecure)
? DISMISS_KEYGUARD_CONTINUE : DISMISS_KEYGUARD_START;
mWinDismissingKeyguard = win;
mSecureDismissingKeyguard = mKeyguardSecure;
mForceStatusBarFromKeyguard = mShowingLockscreen && mKeyguardSecure;
} else if (mAppsToBeHidden.isEmpty() && showWhenLocked
&& (win.isDrawnLw() || win.hasAppShownWindows())) {
if (DEBUG_LAYOUT) Slog.v(TAG,
"Setting mHideLockScreen to true by win " + win);
mHideLockScreen = true;
mForceStatusBarFromKeyguard = false;
}
...
}