您的位置 首页 芯闻

旋转屏幕导致Activity重建

当屏幕旋转时,这个Configuration就发生了改变,因此当前显示的Activity需要被重建,Activity对象会被终止,它的onPause()、onStop()和onDestroy()方法依

当屏幕旋转时,这个Configuration就发生了改动,因而当时显现的Activity需求被重建,Activity目标会被停止,它的onPause()、onStop()和onDestroy()办法顺次触发,然后一个新的Activity目标被创立,onCreate()办法被触发。假定屏幕旋转前,用户正在手机上填写一个注册表单,假设处理不妥,用户会发现旋转后的表单变成空白的了,严重影响运用体会。

要处理这个问题有三种办法:

办法1:制止旋转屏幕

毫无疑问,这是最懒的办法了,相当于回避了本文提出的问题,办法如下看看就好:

android:screenOrientation=portrait

android:label=@string/app_name>

办法2:旋转后康复现场

已然Activity会被毁掉,那么咱们就能够运用前文介绍过的“耐久化/康复现场”办法来处理。即在onPause()里将用户当时现已输入的内容保存到数据库或Preference,在onCreate()办法里读取并填充到表单中,这也是官方引荐的办法。

需求弥补一点,假设Activity重建需求消耗很多资源或需求拜访网络导致时刻很长,能够完成onRetainNonConfigurationInstance()办法将所需数据先保存到一个目标里,像下面这样:

@Overridepublic Object onRetainNonConfigurationInstance() { final MyDataObject data = collectMyLoadedData(); return data;

}

重建时,在onCreate()办法里经过getLastNonConfigurationInstance()办法取得之前保存的数据,如下所示:

@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.main); final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); if (data == null) {//表明不是因为Configuration改动触发的onCreate()

data = loadMyData();

}

}

办法3:手艺处理旋转

一般情况下Configuration的改动会导致Activity被毁掉重建,但也有办法让指定的Configuration改动时不重建Activity,办法是在AndroidManifest.xml里经过android:configChanges特点指定需求疏忽的Configuration姓名,例如下面这样:

android:configChanges=orientation|keyboardHidden

android:label=@string/app_name>

这样设置今后,当屏幕旋转时Activity目标不会被毁掉——作为代替,Activity的onConfigurationChanged()办法被触发,在这里开发者能够获取到当时的屏幕方向以便做必要的更新。已然这种情况下的Activity不会被毁掉,旋转后Activity里正显现的信息(例如文本框中的文字)也就不会丢掉了。

假设你的运用里,横屏和竖屏运用同一个layout资源文件,onConfigurationChanged()里乃至能够什么都不做。但假设横屏与竖屏运用不同的layout资源文件,例如横屏用res/layout-land/main.xml,竖屏用res/layout-port/main.xml,则必须在onConfigurationChanged()里从头调用setContentView()办法以便新的layout能够收效,这时尽管Activity目标没有毁掉,但界面上的各种控件都被毁掉重建了,你需求写额定的代码来康复界面信息。

@Overridepublic void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig);

// Checks the orientation of the screen

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

Toast.makeText(this, 横屏形式, Toast.LENGTH_SHORT).show();

} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

Toast.makeText(this, 竖屏形式, Toast.LENGTH_SHORT).show();

}

}

官方的Android开发文档不主张运用这种办法处理Configuration改动:

Note: Using this attribute should be avoided and used only as a last-resort. Please read Handling Runtime Changes for more information about how to properly handle a restart due to a configuration change.

最佳实践

考虑到旋转屏幕并不是使Activity被毁掉重建的仅有要素,依然引荐前文介绍过的办法:在onPause()里耐久化Activity状况,在onCreate()里康复现场,能够做到一举多得;尽管Google不引荐设置android:configChanges特点的办法,但假设你的Activity横向纵向共用同一个layout文件,办法3无疑是最省劲的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/299352.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部