Android运行时改变的处理(Handling Runtime Changes)

来源:互联网 发布:windows自带一键还原 编辑:程序博客网 时间:2024/05/16 19:12

参考自:http://developer.android.com/guide/topics/resources/runtime-changes.html#top

设备的一些参数会在运行时改变,如屏幕方向、键盘弹出和语言更改。当这些改变发生时,Android会重启正在运行的Activity。为了合适地处理这个重启时间,一般需要在onSaveInstanceState()来保存应用状态的相关的数据,并在onRestoreInstaneState()里面回复应用的状态。

但是,如果你需要在重启时保存回复大量的数据时,上面的这个方法就不划算了。在这种情况下,Android提供了两种解决的方法:

1.在设置变化导致重启时,保留与状态相关的对象。

2.避免重启,自己处理这些设置的变化。

一. 在设置变化时保留状态相关对象。

需要两个步骤:

1.重载onRetainNonConfigurationIntance()方法,返回需要好留的对象实例(发生在onStop()和onDestroy()之间)。

2.在Activity重启时,调用getLastNonConfigurationInstance()获取保留的对象实例。

代码如下:

@Overridepublic Object onRetainNonConfigurationInstance() {    final MyDataObject data = collectMyLoadedData();    return data;}
注意:在返回数据对象实例时,不能返回与Context相关的Drawable,Adapter或View等,不然将会导致内存泄露

@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();    if (data == null) {        data = loadMyData();    }    ...}
二. 自己处理这些设置变换。

自己处理设置变换非常复杂,一般这是最后的选择。

为了声明将要自个处理这些设置变换,你需要在manifest文件中相应的<Activity>元素上添加上android:configChanges参数,例如下面所示:

<activity android:name=".MyActivity"          android:configChanges="orientation|keyboardHidden"          android:label="@string/app_name">
然后,覆盖onConfigrationChanges()方法,并在其中处理设置变换。如下面代码所示

@Overridepublic void onConfigurationChanged(Configuration newConfig) {    super.onConfigurationChanged(newConfig);    // Checks the orientation of the screen    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();    }}
注意:上面的Configuration的实例包含有所有的设置,而不但只有改变后的设置


原创粉丝点击