我尝试用谷歌搜索它,但没有直接和/或明确的答案。
开发者网站的定义也不清楚:
应用程序用来与窗口管理器对话的界面。用于
Context.getSystemService(Context.WINDOW_SERVICE)
获得其中之一。
有简单的六年级英语的人可以解释它是什么吗?
即使我从一个移动到另一个,我如何使用它来创建一个通过多个活动保留的浮动对象?
我尝试用谷歌搜索它,但没有直接和/或明确的答案。
开发者网站的定义也不清楚:
应用程序用来与窗口管理器对话的界面。用于
Context.getSystemService(Context.WINDOW_SERVICE)
获得其中之一。
有简单的六年级英语的人可以解释它是什么吗?
即使我从一个移动到另一个,我如何使用它来创建一个通过多个活动保留的浮动对象?
Android WindowManager 是一个系统服务,它负责管理窗口的 z 顺序列表,哪些窗口是可见的,以及它们在屏幕上的布局方式。除其他外,它会在打开或关闭应用程序或旋转屏幕时自动执行窗口转换和动画。
每个活动都有一个窗口,用于在屏幕上显示其内容。当您在活动上调用 setContentView 时,它会将该视图附加到活动的默认窗口。默认窗口会填满屏幕,因此您的活动窗口会隐藏任何其他活动——WindowManager 将显示位于顶部的任何窗口。所以通常你不需要担心窗口——你只需创建一个活动,Android 会为你做剩下的事情。
但是如果你想做一些不寻常的事情,比如创建不填满屏幕的浮动窗口,你需要与 WindowManager 交互。如果要创建一个在其他应用程序面前可见的浮动窗口,则不能使用 Activity,因为当另一个应用程序进入前台时,您的 Activity 将停止,并且它的窗口将被隐藏或销毁。相反,您需要显示来自后台服务的窗口。例如:
WindowManager.LayoutParams p = new WindowManager.LayoutParams(
// Shrink the window to wrap the content rather than filling the screen
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
// Display it on top of other application windows, but only for the current user
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
// Don't let it grab the input focus
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
// Make the underlying application window visible through any transparent parts
PixelFormat.TRANSLUCENT);
// Define the position of the window within the screen
p.gravity = Gravity.TOP | Gravity.RIGHT;
p.x = 0;
p.y = 100;
WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
windowManager.addView(myView, p);
为此,您需要将以下权限添加到您的 AndroidManifest.xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
android api 版本 > 23,android.permission.SYSTEM_ALERT_WINDOW
需要请求运行时。此外,TYPE_SYSTEM_ERROR
在 android api 26 中不推荐使用一些类型。这是方法
public void showWindowManager() {
if (requestPermission()) {
return;
}
WindowManager.LayoutParams p =
new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
Build.VERSION.SDK_INT > Build.VERSION_CODES.O
? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
: WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater layoutInflater =
(LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
final View popupView = layoutInflater.inflate(R.layout.window_manager_layout, null);
windowManager.addView(popupView, p);
// dismiss windowManager after 3s
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
windowManager.removeView(popupView);
}
}, 3000);
}
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
showWindowManager();
}
}
}
public boolean requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
return true;
}
}
return false;
}
窗口管理器组织屏幕并处理应该去哪里以及应该如何分层。
这是一个很好的浮动对象的开源示例。 浮动对象示例