system/build.prop
找到
ro.build.type
这一行, 把=号后面的user改成userdebug,保存后重启. 给wm 应用配置分屏模式
在清单文件的 或 节点中设置该属性,启用或禁用多窗口显示:
//设置为true ,该activity支持分屏,默认为true
android:resizeableActivity="true"
在AndroidManifest
中的布局属性
对于 Android N,
清单文件元素支持以下几种属性,这些属性影响 Activity 在多窗口模式中的行为,我们先看看下面的代码.
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalSize="450dp" />
activity>
这些布局属性会对多窗口带来什么影响呢?看看下面. android:defaultWidth
以自由形状模式启动时 Activity 的默认宽度。 android:defaultHeight
以自由形状模式启动时 Activity 的默认高度。 android:gravity
以自由形状模式启动时 Activity 的初始位置。 android:minimalSize
分屏和自由形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。
例如,以下节点显示了如何指定 Activity 在自由形状模式中显示时 Activity 的默认大小、位置和最小尺寸:
unresizable
属性. Intent intent = new Intent(this, UnresizableActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
清单xml中配置unresizable
属性.
<activity
android:name="com.android.multiwindowplayground.activities.UnresizableActivity"
android:resizeableActivity="false"
android:taskAffinity="" />
startActivity(new Intent(this, MinimumSizeActivity.class));
清单xml中配置unresizable
属性.
<activity
android:name="com.android.multiwindowplayground.activities.MinimumSizeActivity"
android:launchMode="singleInstance"
android:taskAffinity="">
<layout
android:defaultHeight="500dp"
android:defaultWidth="750dp"
android:gravity="top|end"
android:minimalWidth="500dp"
android:minimalHeight="500dp" />
activity>
<activity
android:name=".CustomConfigurationChangeActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:launchMode="singleInstance"
android:taskAffinity=""/>
如果上面配置的参数有所变化,我们可以在onConfigurationChanged()
方法中监听到.
如下:
//重写Activity中的onConfigurationChanged方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT) {
//TODO 竖屏,需要处理的事情
}
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {
//TODO 横屏,需要处理的事情
}
super.onConfigurationChanged(newConfig);
}
注意: 可能会监听不了参数的变化,别忘记加上权限
有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。 发生这种变化时,Android 会重启正在运行的 Activity(先后调用 onDestroy()
和 onCreate()
)。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。
首先这个变化的过程是这样的,如果你没有在activity的属性中配置’android:configChanges=”keyboardHidden| orientation’那么默认是会走横竖屏的,也就是说会走,销毁Activity->创建Activity.
由于重启整个Activity,如果数据量比较大的情况下,用户体验会十分差(例如网络请求,复杂View的绘制,动画的渲染等),所以解决这种体验我们可以通过下面两种方式:
- 通过onSaveInstanceState()
与onRestoreInstanceState()
保存变动前的对象.
Android 会在销毁 Activity 之前调用 onSaveInstanceState(),以便您保存有关应用状态的数据。 然后,您可以在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态。
除了知道上面的不同的配置下,效果会不一样
之外,我们是不是还要注意一个问题,我们知道Activity的横竖屏会影响它的生命周期,那么对于多窗口来说,是否也会有这样的影响呢?
下面是Goodle官方的说明.
在多窗口模式中,在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的顶级 Activity 将暂停。
注:在多窗口模式中,用户仍可以看到处于暂停状态的应用。 应用在暂停状态下可能仍需要继续其操作。 例如,处于暂停模式但可见的视频播放应用应继续显示视频。 因此,我们建议播放视频的 Activity 不要暂停其 onPause() 处理程序中的视频。 应暂停 onStop() 中的视频,并恢复onStart() 中的视频播放。
也就是说多窗口模式不会更改Activity的生命周期,但是在对一些需要使用到onPause()方法的为了更好体验,需要做小变动.