文档章节

Android:处理运行时变化

daveztong
 daveztong
发布于 2014/11/06 21:25
字数 717
阅读 19
收藏 0
在Activity创建和销毁这个过程中,相信大家都知道可以使用 onSaveInstanceState() 和 onRestoreInstanceState() 来保存和恢复App的状态,为用户提供较好的体验,当保存量较少的数据的时候,这个是个不二的选择,但是可能会遇到要保存的数据量较大的时候,界面切换是就会有些迟钝的感觉,会给用户带来不好的体验。官方文档给出的解决办法是:
  1. 保留一个持有之前界面状态的数据对象
  2. 由我们自己来处理这个运行时的变化

保留一个持有之前界面状态的数据对象

onSaveInstanceState()会对你存入的数据进行序列化和反序列化,所以会消耗较多的内存,如果你给他的数据量大了,就更加消耗内存。看文档给出的解决方案是给当前的Activity附上一个Fragment,再在这个Fragment中存放你要恢复Activity状态的数据。通过相应的设置,这个Fragment在Activity被销毁的时候仍然能够保留,所以当Activity被重新创建时,可以取得这个Fragment获取之前的状态数据。 这个特殊的Fragment需要做一下几件事:
  • 继承Fragment,声明一个存放数据的对象
  • 当Fragment被创建的时候调用setRetainInstance(true) ,这个是个关键
  • 将Fragment添加至Activity
  • 使用 FragmentManager 去获取这个Fragment当Activity被重新创建的时候
官方示例:
  • 持有数据的Fragment:
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;
    }
}
  • 目标Activity
public class MyActivity extends Activity {

    private RetainedFragment dataFragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // find the retained fragment on activity restarts
        FragmentManager fm = getFragmentManager();
        dataFragment = (RetainedFragment) fm.findFragmentByTag(“data”);

        // create the fragment and data the first time
        if (dataFragment == null) {
            // add the fragment
            dataFragment = new DataFragment();
            fm.beginTransaction().add(dataFragment, “data”).commit();
            // load the data from the web
            dataFragment.setData(loadMyData());
        }

        // the data is available in dataFragment.getData()
        ...
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // store the data in the fragment
        dataFragment.setData(collectMyLoadedData());
    }
}
 警告:这里保存的对象不能是与上下文关联的,如果是与Context关联的,之前被销毁的Activity的views,resources都不能被GC,就会造成内存的泄露。

自己来处理这个运行时的变化

如果自己来控制配置变化的话需要对在manifest中对Activity进行相应的设置,常遇到的就是方向的改变和键盘事件,具体可见 android:configChanges : 低于API LEVEL13的情况:
<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">
API LEVEL13后要方向改变除了orientation还有个screensize:
<activity
            android:screenOrientation="sensor"
            android:configChanges="orientation|screenSize|keyboardHidden"/>
当方向发生变化时,会回调onConfigurationChanged这个方法,这里就可以自己来处理这些变化。

© 著作权归作者所有

daveztong
粉丝 4
博文 93
码字总数 21482
作品 0
成都
程序员
私信 提问
Android 处理运行时更改

原文 http://developer.android.com/guide/topics/resources/runtime-changes.html 处理运行时更改 一些设备配置在运行过程中可能会发生改变(例如屏幕横向布局、键盘可用性和语言)。当这样...

阿酷
2011/11/16
538
0
Android应用资源---处理运行时改变(Handing Runtime Changes)

某些设备配置能够在运行期间进行改变(如屏幕的方向、键盘可用性、语言等)。当这样的改变发生时,Android会重启正在运行的Activity(onDestroy()回调之后,紧跟着调用onCreate()回调方法)。...

长平狐
2012/10/16
90
0
[Android学习笔记八] 使用VideoView屏幕方向发生变化,视频方向自动切换

一个Activity主要用来做播放视频使用,并且是全屏播放的话,主要采用横屏(Landscape orientation 显示宽度大于高度)显示视频,那么可以指定Activity的属性android:screenOrientation="land...

secondriver
2018/06/26
0
0
AndroidManifest.xml文件详解(activity)(二)

android:configChanges 这个属性列出了那些需要Activity进行自我处理的配置变化。当在运行时配置变化发生的时候,默认情况下,这个Activity会被关掉并重启,但是用这个属性声明一个配置,就会...

长平狐
2012/10/16
329
0
Android Fragments 详细使用

Fragments 诞生初衷 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的...

的书法上的
2014/06/30
117
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
26分钟前
3
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部