Android运行时改变的处理(Handling Runtime Changes)
2013-04-19 15:49
441 查看
参考自: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()获取保留的对象实例。
代码如下:
注意:在返回数据对象实例时,不能返回与Context相关的Drawable,Adapter或View等,不然将会导致内存泄露
二. 自己处理这些设置变换。
自己处理设置变换非常复杂,一般这是最后的选择。
为了声明将要自个处理这些设置变换,你需要在manifest文件中相应的<Activity>元素上添加上android:configChanges参数,例如下面所示:
然后,覆盖onConfigrationChanges()方法,并在其中处理设置变换。如下面代码所示
注意:上面的Configuration的实例包含有所有的设置,而不但只有改变后的设置
设备的一些参数会在运行时改变,如屏幕方向、键盘弹出和语言更改。当这些改变发生时,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的实例包含有所有的设置,而不但只有改变后的设置
相关文章推荐
- Android应用资源---处理运行时改变(Handing Runtime Changes)
- Android应用资源---处理运行时改变(Handing Runtime Changes)
- Android之Handling Runtime Changes(处理运行时更改)
- Android 资源之处理运行时更改(Handling Runtime Changes)
- Handling Runtime Changes(处理运行时变化)
- 处理运行时系统设置变化(Handling Runtime Changes)
- Android开发者指南(21) —— Handling Runtime Changes
- Handling runtime changes(二)自己处理Configuration change
- Android---Handling Runtime Changes
- 第三部分:Android 应用程序接口指南---第三节:应用程序资源---第三章 处理运行时改变
- Android Handling Runtime Changes
- Android Handling Runtime Changes
- Android 开发指南 翻译7 Application Resources: Handling Runtime Changes(未完...)
- 006_Handling Runtime Changes处理运行时配置改变 翻译学习
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- java.lang.RuntimeException: 将消息发送到死的线程上处理程序的处理程序 (android.os.Handler)
- android处理运行时的变更(较大数据的保存)
- Android 6.0 运行时权限处理问题