多窗口从Android7.0就有api提供支持了。 不过7.0会存在不是占据全屏的情况
注意以下几点常识:
activity优先级由高到低排列如下:
1.获取焦点的可见activity,即onresume 2.可见但暂停的activity,即onpause 3.不可见的activity
注:在多窗口模式中,用户仍可以看到处于暂停状态的应用。 应用在暂停状态下可能仍需要继续其操作。 例如,处于暂停模式但可见的视频播放应用应继续显示视频。 因此,我们建议播放视频的 Activity 不要暂停其 onPause() 处理程序中的视频。 应暂停 onStop() 中的视频,并恢复 onStart() 中的视频播放。
永远只有1个窗口的activity是处于onresume状态。
一个activity由一个窗口到另一个窗口,页面大小都要进行重绘,区分于横竖屏的切换。只是更换尺寸。
配置
在清单的 或 节点中设置该属性,启用或禁用多窗口显示:
android:resizeableActivity=["true" | "false"]
复制代码
涉及相关API
ActivityOptions
提供两个新函数以支持多个显示器:
setLaunchDisplayId()
指定 Activity 在启动后应显示在哪个显示器上。
getLaunchDisplayId()
返回操作组件的当前启动显示器。
复制代码
adb
对 adb shell 进行了扩展,以支持多个显示器。shell start 命令现在可用于启动操作组件,并指定操作组件的目标显示器:
adb shell start <activity_name> --display <display_id>
复制代码
若涉及到保存状态,一般两种:
1.Android 会在销毁 Activity 之前调用 onSaveInstanceState(),以便您保存有关应用状态的数据。 然后,您可以在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态
2.保留 Fragment(推荐)
第一种,存储在bundle中。需要序列化和反序列化,消耗性能。且不能保存大数据,如位图等。大数据存储会丢失数据。
第二种注意:尽管您可以存储任何对象,但是切勿传递与 Activity 绑定的对象,例如,Drawable、Adapter、View 或其他任何与 Context 关联的对象。否则,它将泄漏原始 Activity 实例的所有视图和资源。 (泄漏资源意味着应用将继续持有这些资源,但是无法对其进行垃圾回收,因此可能会丢失大量内存。)
第二种方案如下:
public class RetainedFragment extends Fragment {
// data object we want to retain
private MyDataObject data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(MyDataObject data) {
this.data = data;
}
public MyDataObject getData() {
return data;
}
}
复制代码
public class MyActivity extends Activity {
private RetainedFragment retainedFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
retainedFragment = (RetainedFragment) fm.findFragmentByTag(“data”);
// create the fragment and data the first time
if (retainedFragment == null) {
// add the fragment
retainedFragment = new RetainedFragment();
fm.beginTransaction().add(retainedFragment, “data”).commit();
// load the data from the web
retainedFragment.setData(loadMyData());
}
// the data is available in retainedFragment.getData()
...
}
@Override
public void onDestroy() {
super.onDestroy();
// store the data in the fragment
retainedFragment.setData(collectMyLoadedData());
}
}
复制代码