如何创建Android中总是顶全屏覆盖活动如何创建Android中总是顶全屏覆盖活动(How to

2019-05-13 11:34发布

我希望能够创建活动,始终是在Android系统显示前面。 应该没有收到输入,只是把它传递到任何应用程序旁边下方。 有点像HUD。

我可以研究,我需要设置下面的窗口类型TYPE_SYSTEM_ALERT但它看起来像Android这样无视我的代码 - 也不例外,即使我删除清单android.permission.SYSTEM_ALERT_WINDOW许可抛出。 (它是需要使用此窗口类型)。 当我试图在对话框中使用的警报类型,它的工作好,但我不能让对话为全屏幕透明的实体。 这里是我的代码,也许有一些简单的缺失。

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>

Answer 1:

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);


Answer 2:

我发现, 公认的答案(由tmouse)并没有完全为我工作。 也许它的工作对旧的API级别? 我使用API​​级24。

这个特别的答案曾建议:

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是一个必需的标志依然; 如果你想装饰画对诸如状态栏是必要的。

WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY应当被用来代替TYPE_SYSTEM_ALERT在API级别> = 19。 这是一个注解我写的前一阵子,可惜我已经无法找到引用来证实为什么我认为,所以采取与少许盐。


奖金注释(如果你正在读这篇文章,你可能试图使一个全屏叠加):

你的清单将需要这些权限(说明这里 ):

<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的应用程序,创建了一个全屏幕重叠。



Answer 3:

看看这个

提到它在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" />


文章来源: How to create always-top fullscreen overlay activity in Android