如何在Android中创build始终顶级的全屏叠加活动

我希望能够创build一个总是在Android的显示前面的活动。 它不应该收到任何input,只需将其传递给下面的任何应用程序即可。 就像一个HUD。

我能够研究,我需要将底层窗口types设置为TYPE_SYSTEM_ALERT,但它看起来像Android忽略我的代码 – 即使我从清单删除android.permission.SYSTEM_ALERT_WINDOW权限没有抛出exception。 (需要使用这种窗口types)。 当我尝试在对话框上使用ALERTtypes时,它工作正常,但是我无法使对话变成全屏透明的实体。 这是我的代码,也许有一些简单的缺失。

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); getWindow().setBackgroundDrawableResource(android.R.color.transparent); getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.main); } 

在xml清单中必须在外部启用半透明设置,否则它也不起作用。

  <item name="android:windowIsTranslucent">true</item> 

Solutions Collecting From Web of "如何在Android中创build始终顶级的全屏叠加活动"

 final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); WindowManager wm = (WindowManager) getApplicationContext() .getSystemService(Context.WINDOW_SERVICE); ViewGroup mTopView = (ViewGroup) App.inflater.inflate(R.layout.main, null); getWindow().setAttributes(params); wm.addView(mTopView, params); 

我发现被接受的答案(由小老鼠)并不适合我。 也许它适用于较旧的API级别? 我正在使用API​​级别24。

这个特别的答案曾经build议:

 final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT ); 

这有一个问题。 WindowManager.LayoutParams的构造函数如下所示:

在这里输入图像说明

因此, WindowManager.LayoutParams.FLAG_FULLSCREEN标志被用作int wint h显式值 。 这不好! 您的视图的尺寸设置为1024 * 1024 – 所以它不会填满屏幕。 即使您明确地设置了布局的宽度和高度以匹配设备的尺寸:当屏幕方向改变时,它们不会更新。 我们需要一个不同的方法


我发现全屏覆盖的正确构造是这样的:

 final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_FULLSCREEN, PixelFormat.TRANSLUCENT ); 

这意味着我们不再明确指定宽度和高度。 布局完全取决于我们的旗帜。

是的, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN仍然是一个必需的标志; 如果你想绘制诸如状态栏等装饰,就有必要了。

在API级别> = 19时,应该使用WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY而不是TYPE_SYSTEM_ALERT 。 这是我刚才写的一个说明,遗憾的是我一直无法find引用来证实我为什么这么想,所以拿一小撮盐。


奖金备注(如果你正在阅读这个文件,你可能试图做一个全屏覆盖):

您的清单将需要这些权限( 在这里解释):

 <uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 

我的理解是SYSTEM_ALERT_WINDOW是需要的实际权限,但是ACTION_MANAGE_OVERLAY_PERMISSION也是必需的:它允许您在运行时请求用户授予SYSTEM_ALERT_WINDOW特权。

我在这里提供了我的工作API级别24应用程序的源代码,创build一个全屏叠加。

看看这个

在你的AndroidManifest.xml文件中提到它

 <activity android:name=".MyActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /> 

如果你想让你的活动全屏和透明也

看看这个

 <activity android:name=".MyActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />