【发布时间】:2014-05-13 16:15:47
【问题描述】:
我需要在任何正在运行的应用程序之上显示一个系统覆盖窗口。它工作正常,但只有当我的应用程序的活动处于前台时。这是我使用的代码:
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_DIM_BEHIND |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.CENTER | Gravity.TOP;
params.dimAmount = 0.3f;
wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
mainAlertView = View.inflate(ctx, R.layout.system_alert_view, null);
wm.addView(mainAlertView, params);
添加到 WindowManager 的视图包含我在运行时添加子视图的空 LinearLayout:
mainAlertLayout.addView(childView);
清单 xml 已定义 SYSTEM_ALERT_WINDOW 权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
当我的活动在前台运行时,这一切都运行良好。一旦我切换到任何其他应用程序或主屏幕,就不会显示任何覆盖。我调试了代码,它确实在运行 wm.addView(),并且它没有抛出任何异常。我也玩过 LayoutParams 标志(删除了 KEEP_SCREEN_ON 和相关等),但没有任何区别。
Android 4.4.2 固件
【问题讨论】:
-
我记得当我尝试做这些事情时,据我所知,
Context必须是应用程序上下文。我不能成为活动。你在用什么? -
"ctx" 包含主要活动 getApplicationContext() 调用返回的任何内容
-
那是应用程序上下文。祝你好运。
-
TYPE_SYSTEM_ALERT 而不是 TYPE_SYSTEM_OVERLAY?
-
我不需要警报。我需要一个始终在顶部的半透明覆盖窗口。 TYPE_SYSTEM_OVERLAY 正是我所需要的,它工作正常......只要我的活动在前台
标签: android android-layout layoutparams