我正在创建一个锁屏应用程序。我一直在寻找和尝试一些技巧,但仍然找不到最好的方法。我之前使用的方法是使用TYPE_SYSTEM_ERROR
。它运作良好。它会阻止导航和status bar
进行任何触摸。它还会在我的应用程序后面运行任何其他应用程序,包括关闭电源选项对话框。
不幸的是我认为这很糟糕,因为当应用程序冻结或没有响应时,用户无法做任何事情,只能强行重启他/她的手机。
我一直在寻找并分析Play商店中现有的一些锁屏应用。他们使用不同的方式锁定手机,但我找到了一个我认为可以遵循的应用程序。它使导航和状态栏覆盖应用程序。导航和状态栏仍然可以点击,但它都在锁定屏幕后面打开。当我尝试打开关机对话框时,NavigationBar
仍覆盖锁定屏幕。
我改变了我的应用程序以遵循这种方法。我可以让酒吧覆盖我的锁定屏幕,但我仍然无法:
<击> 1。让其他应用程序在我的锁定屏幕后面运行(锁定屏幕总是在顶部)
2.当出现关机对话框和用户移动到家时,NavigationBar
会保持叠加状态。在我的情况下,NavigationBar
推高了屏幕,我的屏幕看起来很丑(一些组件移动到错误的位置)和Dialog
被解除后的,它不会移回原来的位置。 它已修复,但当我触摸主页按钮并仍在搜索修复此问题时,我发现了类似的问题。
以下是我的代码片段(已更新):
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
} else {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
mOverlay = (RelativeLayout) inflater
.inflate(R.layout.main, (ViewGroup) null);
mOverlay.setFitsSystemWindows(false);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
mWindowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mOverlay, params);
这里是我要关注的PlayStore
应用的截图: