参考自: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()获取保留的对象实例。
代码如下:
@Override public Object onRetainNonConfigurationInstance() { final MyDataObject data = collectMyLoadedData(); return data; }注意:在返回数据对象实例时,不能返回与Context相关的Drawable,Adapter或View等,不然将会导致内存泄露
@Override public 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()方法,并在其中处理设置变换。如下面代码所示
@Override public 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的实例包含有所有的设置,而不但只有改变后的设置