android多窗口注意事项--附页面重启保存数据

多窗口从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());
    }
}
复制代码

转载于:https://juejin.im/post/5c9b87c95188251c0a47334d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值