Android 项目必备(四十二)-->Android 多窗口模式
Posted Kevin-Dev
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 项目必备(四十二)-->Android 多窗口模式相关的知识,希望对你有一定的参考价值。
简介
-
自由窗口模式:
该模式类似于常见的桌面操作系统, 应用界面的窗口可以自由的拖动和修改大小。 -
分屏模式
该模式可以在手机上使用, 该模式将屏幕一分为二, 同时显示两个应用界面。 -
画中画模式:
该模式主要用于TV, 在该模式下视频播放的窗口可以一直在最顶端显示。(视频小窗口)
详细请查看:Android 文档
准备
1. Manifest 新增属性
-
android:resizeableActivity="false"
这个属性可以放置于 application 和 activity 的标签下, 作用在对应的区间里面。这个属性表示 application 或者 activity 在分屏或者 freeform 的模式启动, true 代表支持, false 代表不支持。 -
android:supportsPictureInPicture= "false"
这个属性可以放置于 activity 的标签下, 这个属性表示 activity 是否支持画中画模式, true 代表支持, false 代表不支持。
2. 多窗口 API
isInMultiWindowMode()
: 查询是否处于多窗口模式isInPictureInPictureMode()
:查询是否处于画中画模式Activity.onMultiWindowModeChanged()
多窗口模式变化时进行通知(进入或退出多窗口)onPictureInPictureModeChanged()
画中画模式变化时进行通知(进入或退出画中画模式)enterPictureInPictureMode()
调用这个接口进入画中画模式,如果系统不支持,这个调用无效setLaunchBounds()
在系统已经处于Freeform模式时,可以通过这个参数来控制新启动的Activity大小,如果系统不支持,这个调用无效。
实现
1. 效果图
2. 实现
- 在清单文件中申请权限
<uses-permission android:name="android.permission.INTERNET"/>
- 添加属性
<application
...
android:resizeableActivity="true"
android:usesCleartextTraffic="true"
...>
- 代码
public class MainActivity extends AppCompatActivity
private static final int WINDOWING_MODE_FREEFORM = 5;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_open_one).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
showWindows("com.kjd.airecognition","com.kjd.airecognition.WebActivity");
);
findViewById(R.id.btn_open_two).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
showWindows("com.kjd.gesturedemo","com.kjd.gesturedemo.PieActivity");
);
private void showWindows(String packageName,String classPath)
//获取屏幕高宽
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int screenWidth = metric.widthPixels;
int screenHeight = metric.heightPixels;
Intent intent = new Intent();
intent.setClassName(packageName,classPath);
intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
ActivityOptions activityOptions = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M)
activityOptions = ActivityOptions.makeBasic();
//设置为freeform模式
try
Method method = ActivityOptions.class.getMethod("setLaunchWindowingMode", int.class);
method.invoke(activityOptions, WINDOWING_MODE_FREEFORM);
catch (Exception e)
e.printStackTrace();
//freeform模式下自由窗口的大小
int freeformWidth = 1200;
int freeformHeight = 800;
//居中显示
int left = screenWidth / 2 - freeformWidth / 2;
int top = screenHeight / 2 - freeformHeight / 2;
int right = screenWidth / 2 + freeformWidth / 2;
int bottom = screenHeight / 2 + freeformHeight / 2;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
activityOptions.setLaunchBounds(new Rect(left,top,right,bottom));
Bundle bundle = activityOptions.toBundle();
startActivity(intent,bundle);
以上是关于Android 项目必备(四十二)-->Android 多窗口模式的主要内容,如果未能解决你的问题,请参考以下文章
ReactNative进阶(四十二):面试必备:2021 ReactNative经典面试题总结(含答案)
Android 项目必备(四十一)-->Android 开发实战经验总结
Android 项目必备(四十一)-->Android 开发实战经验总结