平行页面状态接口:
- 判断当前是否运行在平行视界状态
String config = context.getResources().getConfiguration().toString();
boolean isInMagicWindow = config.contains("hw-magic-windows");
context为Activity的context
- 获取Activity实际显示的窗口大小
推荐使用:
context.getResources().getDisplayMetrics()
context为Activity对应的上下文句柄,每个Activity应该严格使用自己的context来进行布局,而不是使用application的context。
- 获取Activity的窗口布局方向
context.getResources().getConfiguration().orientation
注:不推荐使用width > height的方法来判Activity为横屏布局。
窗口显示
- 以Activity组件为单位的窗口分离显示
平行视界中窗口在左右两边拆分显示以Activity组件为基本单位,应用窗口需以Activity来实现和启动,才能做到左右窗口独立分离显示。例如,ActivityA在左半边显示,如果想让其点开的新窗口在右半边显示,那么新窗口必须以Activity方式实现,如果只是打开一个Activity窗口上的子布局或者非Activity实现的子窗口(ViewGroup/Fragment/PopUpWindow/Dialog等),新窗口是无法拆分在右半边显示的。
- 指定Activity全屏显示
平行视界状态下,Activity希望以全屏来显示,有三种方法:
- 方法一:动态全屏显示,Activity首先以平行视界非全屏显示,调用Activity类的如下接口申请横屏方向可进入全屏显示状态:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
在此状态下,调用Activity类申请竖屏方向即可退出全屏状态:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
- 方法二:提供需全屏显示的Activity和包名
例如:“com.cmcc.example.AActivity”
- 方法三:在“AndroidManifest.xml”文件中将Activity的方向配置为横屏,此方法中,Activity会一直以全屏状态显示
android:screenOrientation = “landscape”
或
android:screenOrientation = “sensorLandscape”
Activity布局
- Activity大小切换时不重启适配
强烈建议应用在Activity窗口大小切换时不重启适配,在android:configChanges属性增加screenSize|screenLayout|orientation|smallestScreenSize,并在Activity的onConfigurationChanged回调中更新宽高刷新子布局。
- 避免Activity子布局的缺省重用
平行视界下,左右Activity同时显示,左右显示的两个Activity中不能同时存在单实例的公共布局模块。
- 布局自适应
应用复写onConfigurationChanged()方法,通过该方法的Configuration参数获得窗口高度等信息,并对界面布局做相应调整,如切换布局、调整控件位置和间距等。
@Override
public void onConfigurationChanged(Configuration newConfig) {
// 以dp为单位的窗口大小
super.onConfigurationChanged(newConfig);
Log.i("test", "newConfig.screenHeightDp:" + newConfig.screenHeightDp
+ ", newConfig.screenWidthDp" + newConfig.screenWidthDp);
}
平行视界模式下,应用通过如下接口获取到的是应用窗口实际宽高大小:
context.getResources().getDisplayMetrics()
context.getWindowManager().getDefaultDisplay().getMetrics(outMetrics)
// context为Activity对应的context对象。
Activity生命周期
- 左右Top Activity同时以muti-resume运行
平行视界双窗口状态下,右边Top Activity始终为resumed状态,左边Top Activity为resumed或者paused状态,系统默认应用支持multi-resume,如果应用希望不支持multi-resume,可以在应用AndroidManifest.xml中增加meta-data字段来关闭:
meta-data android:name="android.allow_multiple_resumed_activities" android:value="false"
注意:multi-resume关闭后,应用在其它多窗口状态下也不会再支持multi-resume子特性,同时可能存在Activity失去焦点后音视频播放停止的问题,所以建议应用在关闭multi-resume后,在Activity的onStop而不是onPause中停止音视频的播放。
音视频播放
- 支持左右两边Activity同时播放,用户具有绝对的控制权
左右两个Activity可以同时播放,用户主动点击播放/暂停按钮可以控制任意一个窗口的音视频播放状态。
- 避免左右两个Activity共用一个播放器
左右两个Activity同时显示,建议两边使用的播放器资源相互独立,互不影响。
SDK适配备注:
提供activity的全路径信息标注全屏or分屏
注意onConfigChange后的ui变化并适配
大屏模式下功能的完整性,dialog适配