当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]当屏幕旋转时,这个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无疑是最省事的。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

上海2025年7月31日 /美通社/ -- CreateAI(OTC:TSPH)明日将携游戏及AI工具领域的最新成果亮相第二十二届ChinaJoy,于N3馆-07展台全面展示以《金庸群侠传》为代表的IP游戏,及Breat...

关键字: AI CHINAJOY CREATE AN

加州圣地亚哥和北京2025年7月25日 /美通社/ -- CreateAI(OTC:TSPH)今日宣布,公司与枕刀歌动画团队联合出品的《绣春刀》短片在Collision Awards中一举斩获三枚金奖和一枚银奖,与Wal...

关键字: CREATE AI SI IO

杭州2025年7月18日 /美通社/ -- 7月11日-12日,全中国乃至全球的优秀设计师都汇聚到了阿里巴巴全球总部,共赴一年一度的D20全球设计院长峰会。 从去年关注"AI时代的设计",今年阿里设...

关键字: AI 阿里巴巴 CAN CREATE

北京 2025年5月7日 /美通社/ -- CreateAI(OTC:TSPH)今日正式发布《多模态生成技术在动画制作领域的应用与发展白皮书》(以下简称"报告")。该报告系统性解析2D/3D动画工业化生产全流程,并深入...

关键字: CREATE 多模 AI 模型

北京2024年12月3日 /美通社/ -- 今年10 月 21 日至 24 日,IBM TechXchange 2024在美国拉斯维加斯举行,这是全球开发者和技术爱好者的年度...

关键字: IBM CHANGE 智能体 TE

威富公司(VF Corporation)发布最新《Made for Change可持续发展及责任报告》。该报告以"顺势而为,把握时机"(Seizing the Momentum)为主题,分享了威富公司在"科学减碳目标"(...

关键字: 可再生能源 CHANGE FOR 可持续发展

《财富》杂志(Fortune)公布了2022年财富改变世界(Fortune Change the World)榜单,其中列出了50多家公司,这些公司今年通过盈利战略和运营对社会或环境产生了重要影响。榜单包括54家公司:北...

关键字: 美团 FOR CHANGE DEVELOPMENT

(全球TMT2022年8月29日讯)为庆祝成立60周年,Halla集团将更名为HL(Higher Life)。自38年前的1984年推出Halla品牌以来,Halla集团一直沿用这个公司名称至今。HL将被用作该集团的新...

关键字: GROUP HIGHER HOLDING CHANGE

美国进口商和出口商面临最高的运输费用 中国大陆8个主要港口的滞港费和滞箱费增幅惊人达到79%,从2020年的390美元增加到2021年的700美元,但仍远低于美国...

关键字: CHANGE AI BSP REPORT

(全球TMT2022年7月14日讯)联合国记者协会(UNCA)邀请世界各地的媒体提交关于联合国、联合国机构和实地行动的第26届联合国记者协会年度最佳印刷媒体、广播电视媒体及网络媒体报道的参赛作品。参赛作品提交截止日期为...

关键字: TE BSP CARD CHANGE
关闭