我几周来一直试图找到解决这个问题的正确方法,但我仍然找不到任何东西。
基本上,我尝试做的是从正在运行的服务(监视某些事件)创建一个警告对话框。即使手机已锁定,警告对话框也应始终显示在其他所有内容之上。我正在寻找类似于有人给你打电话或闹钟响起的事情。
我发现的最佳解决方案如下:
WindowManager mWindowManager = (WindowManager)
mContext.getSystemService(Context.WINDOW_SERVICE);
LayoutInflater layoutInflater = (LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = layoutInflater.inflate(R.layout.layout_alert, null);
mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.RGBA_8888);
mWindowManager.addView(mView, mLayoutParams);
在清单中:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
问题是,如果我使用TYPE_SYSTEM_ALERT
,那么对话框总是按我的意愿显示,但我无法在视图中的按钮上接收任何触摸事件。另一方面,如果我使用TYPE_PRIORITY_PHONE
,那么我确实会收到所有触摸事件 - 但警报并未显示在锁定屏幕上方。