[size=medium]
默认情况下,Activity在Configuration变化(比如设备横竖屏切换)时,会执行onDestory()周期函数,然后onCreate(),重新创建Activity。之所以这样是因为这样可以让Activity动态适应Configuration,比如横屏时使用横屏的layout,drawable等resources,竖屏时使用竖屏的layout,drawable等resources。重启Activity可能导致大量数据的重新获取,网络连接的重新建立等问题,用户体验非常差。Android Dev guide给出两种解决方案
1)在Configuration变化时,保持数据不变
2)你自己处理,而不是重启Activity

下面分别详细介绍一下这两种方法
1)在Configuration变化时,保持数据不变。需要注意的是我们不应该保存那些依赖Activity的数据,比如Drawable,Adapter,View或者任何与Context相关联的数据。因为上一个Activity已经没有了,如果你还要保持这些资源的引用,可能导致资源泄露。使用方法如下:

重写Activity.onRetainNonConfigurationInstance(),保存数据[/size]

@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}

[size=medium]
在onCreate()中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据[/size]

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

final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
...
}


[size=medium]2)你自己处理,而不是重启Activity。这种方法相对简单一些,缺点是动态适应差。比如横竖屏切换时需要你自己写代码来使用不同的layout等resource,语言设置的动态改变等,不推荐。使用方法如下:
在AndroidManifiest.xml中为当前的Activity设置android:configChanges[/size]

          android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">

[size=medium]
重写Activity.onConfigurationChanged(),做一些相应的动作,如果没有则可以不用重写[/size]

@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();
}
}

[size=medium]
详情请参考:[url]http://developer.android.com/guide/topics/resources/runtime-changes.html[/url]
[/size]

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android数据存储访问——文件存储
  4. 安卓基础知识
  5. Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储
  6. Android心得4.5--SQLite数据库--事务处理、ListView列表显示
  7. Jsp读取数据库返回json数据,Android客户端接收json
  8. Android中hw_get_module函数分析
  9. Android(安卓)学习记录一:Activity

随机推荐

  1. Android开发者指南(1) ―― Android Debu
  2. 第三节 布局
  3. 像网易,新浪新闻android客户端的数据是怎
  4. Android(安卓)开发之 Drawable系列
  5. Gradle sync failed: Connection refused
  6. VMware实现Android x86 8.1 从安装到使用
  7. android 如何动态设置View的margin和padd
  8. Android 通过java代码实现EditText输入限
  9. android中自定义控件的属性
  10. android listView EditText获取焦点