Android 横竖屏切换的处理 (转载)

Android 中,缺省情况下屏幕的切换动会销毁当前的Activity,并且重启Activity。当然这种缺省的处理方式可能不符合我们的要求。 可以有多种选择改变这种处理方式。

 

一种方式是在销毁Activity前保存数据,在Activity再次Create的时候载入配置。onSaveInstanceState 负责在销毁Activity之前保存数据。

 

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

if (dataString != null) {
outState.putString("data", dataString);
}
}

onCreate(Bundle savedInstanceState) 负责恢复数据

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataString = savedInstanceState.getString("data");
}

 

onRetainNonConfigurationInstance() 和 getLastNonConfigurationInstance() 可以实现类似的功能。 前者用来保存数据,后者用来恢复数据,不过只限于Activity被销毁后马上被恢复的情况。

 

更常用的方式是阻止Activity的销毁和重新启动。需要首先在AndroidManifest.xml中给相应的Activity加一个属性。

android:configChanges="keyboardHidden|orientation"

然后再程序中截获 onConfigurationChanged(Configuration newConfig) 函数并且自己加以处理,这时候屏幕方向的切换不会重新启动Activity。必要的时候可以根据屏幕方向的不同重新布置布局。

public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
setupLandScapeViews();
}
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
setupPortraitViews();
}

}

如果不希望改变屏幕的显示方式,比如游戏中希望保持一种方式显示,可以在Activity中加一句

android:screenOrientation="portrait"

这样的话屏幕方向变化不会再改变显示方式和重启Activity。

 

 

现在讨论一下两种保存方式的不同:

程序运行的时候,onCreate()然后运行到onResume,一旦进行屏幕的横竖切换,就会转到onPause(),然后onDestroy(),然后程序会再次的onCreate(),然后再次的onResume()。横竖屏切换会执行onDestroy()。

关于转屏,与activity状态的保存
比较onSaveInstanceState() 与 onRetainNonConfigurationInstance()在不同需求中的用法
针对Android平台,不论出于哪种目的,都或多或少需要在多个Activities中的跳转操作,其中包括为了获得某些系统资源和必要信息,而通过启动(startActivity()&startActivityForResult() )Child Activity来提供一个选择器或者作为用户输入信息的介质。这期间父级Activity将暂时性失去焦点,从而在这之前先通过 onSaveInstanceState() 方法临时存储一些必要的信息,当父级的Activity重新成为当前焦点后,系统将触发 onRestoreInstanceState() 恢复失去焦点前的原有数据!onRetainNonConfigurationInstance()也具有相同的目的来处理类似的请求,其主要是由于旋转设备而更改显示模式,进而触发这个方法的调用。 那么在遇到某些特定需求时,特别是针对设备旋转后所导致的显示模式发生变化后,应该依据什么条件来判断应用哪种方式才能更好的满足需要呢?做出选择之前有必要分别了解两种方法的各自特点。

onSaveInstanceState() 在当前的Activity中通过新的Intent启动其它Activities之后,它将通过这个方法自动保存自身的数据,当再次出返回时可以通过 onRestoreInstanceState()复原数据。另外一种情况也将调用这个方法,当旋转设备后屏幕显示模式发生改变时。需要注意的一点是整个过程完全由系统控制,无法通过onSaveInstanceState()返回一个自定义的数据。 另外,onSaveInstanceState()在所有Activity destroying过程中被调用,它仅仅是为了在重新回到这个特定的Activity之后,依据Activity state重新创建一个与之前状态完全相同的Activity。例如:当我们启动某些Connection时,State并不能依然保存这个连接状态。
所以当调用onSaveInstanceState后,所有当前的connection将一同销毁。当第二次通过 onRestoreInstanceState()找回之前的连接设置并重新建立新的连接实体。如果大家有更多的发现,或者有不用于以上的验证结果,非常感谢能参与这个话题的讨论。onRetainNonConfigurationInstance() 当Device configuration发生改变时,将伴随Destroying被系统调用。通过这个方法可以像onSaveInstanceState()的方法一样保留变化前的Activity State,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含Activity Instance本身。新创建的Activity可以继承大量来至于Parent Activity State信息。 用这个方法保存Activity State后,通过getLastNonConfigurationInstance()在新的Activity Instance中恢复原有状态。

 


这个方法最大的好处是:
* 当Activity曾经通过某个网络资源得到一些图片或者视频信息,那么当再次恢复后,
无需重新通过原始资源地址获取,可以快速的加载整个Activity状态信息。
* 当Activity包含有许多线程时,在变化后依然可以持有原有线程,无需通过重新创建进程恢复原有状态。
* 当Activity包含某些Connection Instance时,同样可以在整个变化过程中保持连接状态。
下边是需要特别注意的几点:
* onRetainNonConfigurationInstance()在onSaveInstanceState()之后被调用。
* 调用顺序同样介于onStop() 和 onDestroy()之间。
接下来将通过一个例子来简单了解onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()的
用法。 这个例子将首先启动一个包含两个按钮的Activity。其中一个按钮用于调用本地通讯录,
并将所选择的某一项作为返回值传给当前 Activity。另外一个按钮的作用是查看当前所选择的通讯信息。
正常的流程是当第一次启动程序后,第二个查看信息按钮是不可用状态。当通过Pick按钮确定选择并返回某
一通讯录内容时,查看信息按钮的状态切换为可操作状态。然后当改变设备的Configuration时,
可以注意到即便是 Activity通过onCreate()重新构建,但是之前所保证的UI属性依然保持最后一次操作的状态。

为了保存图片资源和网络连接,即使使用,还是onRetainNonConfigurationInstance()比较好。


转载于:https://www.cnblogs.com/joey-home/archive/2012/02/17/2356228.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这种秀恩爱你见过吗?

1 棒棒哒,做的好2 程序员的日常3 一群单身鱼都看呆了4 最佳COS5 自拍达喵6 为什么你们能长这么大?懵逼了7 请用一个词形容这张图你点的每个赞,我都认真当成了喜欢

Layui宣布下线,不自禁的感叹一下,回忆啊

简单唠唠 其实对于前端的信息好久没关注了,一堆后端的Bug要撸,实在没有时间;由于浏览器收藏的东西比较多,于是就想抽点时间归归类,方便查询信息;趁这个机会就挨个点进去瞅一遍(随便摸摸鱼&#…

《C语言及程序设计》程序填空——字符数组与字符串处理

返回&#xff1a;贺老师课程教学链接 1、编写一函数&#xff0c;由实参传来一个字符串&#xff0c;统计此字符串中字母、数字、空格和其它字符的个数&#xff0c;在主函数中输入字符串以及输出上述的结果。请将下面的程序补充完整。#include<stdio.h> #include<string…

csv文件设置每个cell大小_Python对文本文件和Excel的处理机制

有头发且有趣的码农万里挑一~ 96有料叔 | 一位有故事的程序猿读取文件内容的方式直接一次性读取文件内容按行读取文件内容将读取的文件内容形成一个列表直接一次性读取文件内容open()需要手动释放资源&#xff0c;最后使用close()with open() as…使用with … as…&#xff0c;…

给图片添加水印

许久没写代码了&#xff0c;许久没上博客园了&#xff0c;许久没有写博文了。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using Syste…

idea2020.2.2怎么创建web项目_创建Vue3.0的项目

1. 查看Vue的环境版本Vue -V如果版本低于4.0&#xff0c;则需要升级Vue的版本npm install -g vue/cli2. 创建Vue 3.0的项目3. VS Code 的环境配置安装Extension&#xff1a;ESLint&#xff0c; Vetur。VS Code基于ESLint的Auto Save功能&#xff0c;可以很好的格式化代码&#…

揭秘奢侈品代工厂内幕:千元以上的大牌墨镜,成本甚至不过百!

▲ 点击查看纵观全球没有哪个国家像中国这样几乎所有领域都在发力世界能研发高铁的国家&#xff0c;不超过十个&#xff0c;中国在列&#xff1b;世界能建造军舰的国家&#xff0c;不超过十个&#xff0c;中国在列&#xff1b;世界能研发第五代隐身战机的国家&#xff0c;不超过…

Dapr牵手.NET学习笔记:状态管理进阶(一)

在上一篇文章中说到&#xff0c;dapr默认的状态是不可能跨appid的&#xff0c;也就是只能在相同的应用内访问自己设置的状态数据&#xff0c;dapr支持三种状态的共享配置&#xff1a;appid&#xff0c;nam&#xff0c;none&#xff0c;是通过修改components下的statestore.yaml…

[WP] 关于页面切换动画 记录

1 app.xmal.cs 部分修改如下 private void InitializePhoneApplication() {if (phoneApplicationInitialized)return;// Create the frame but dont set it as RootVisual yet; this allows the splash// screen to remain active until the application is ready to r…

ext 浅谈类的实例

打开ext的API&#xff0c;如下找到Class这个选项将鼠标移到config那里可以看到有以下属性&#xff1a;好了&#xff0c;让我们开始进入主题&#xff1a;首先&#xff0c;来讲讲如何自定义一个类&#xff0c;在ext中&#xff0c;创建一个类其实与其他语言差不多&#xff0c;只是…

GAE 随机获取实体

有时我们需要随机地获取数据记录&#xff08;实体&#xff09;&#xff0c;比如博客程序中的“随机文章”的实现。 目前 GAE 并没有 API 可以直接获取随机实体&#xff0c;要实现这样的需求我们只能自己想办法了 :-) 在 stackoverflow 上也有人提过该问题&#xff0c;总结如下&…

构造函数怎么在主函数调用_C++ 虚基类及其派生类构造函数(学习笔记:第7章 12)...

虚基类及其派生类构造函数[1]建立对象时所指定的类称为最远派生类。虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。在整个继承结构中&#xff0c;直接或间接继承虚基类的所有派生类&#xff0c;都必须在构造函数的成员初始化表中为虚基类的构造函…

打得了橄榄球大联盟,进得了麻省理工,无论是四肢还是头脑都同样发达,这才叫猛男!...

全世界只有3.14 % 的人关注了爆炸吧知识今天小天就介绍一位同样在学术界、体坛都很生猛的猛男吧约翰尤索 (John Urschel) 关于约翰尤索一直有“学霸”“学神”这些词伴随着他然而尤索却说他从来都没认真听过老师讲课尤索出生在加拿大温尼伯父亲是医生&#xff0c;母亲是律师很小…

如何使用 EF Core 按周 对数据分组?

咨询区 Aza&#xff1a;在 Entity Framework 6 中&#xff0c;我可以用 SqlFunctions.DatePart() 函数来实现&#xff0c;参考如下代码&#xff1a;var byWeek data.GroupBy(x > SqlFunctions.DatePart("week", x.Date));现在的问题是, Entity Framework Core 中…

忍着疼痛奔跑,带着泪光微笑!

忍着疼痛奔跑&#xff0c;带着泪光微笑转瞬&#xff0c;毕业已近四年&#xff0c;回顾&#xff0c;还在路上。头几年&#xff0c;有着一颗爱玩的心&#xff0c;秉着“人这一辈子不能对不起自己”的谬论&#xff0c;一直随着自己的性子&#xff0c;想做什么就做什么&#xff0c;…

加菲猫语录,只准笑不准学

&#xff0d;今天我要做俯卧撑今天先俯卧&#xff0c;明天再撑。 &#xff0d;&#xff0d;真不愿意起来&#xff0c;尤其我还病了&#xff0c;可我还得带病坚持吃饭。 &#xff0d;&#xff0d;肚子大不可怕&#xff0c;可怕的是肚子里没有好东西。或者说&#xff0c;没有好…

python 什么是原类_Python 什么是元类(metaclasses)?

1.什么是类 在理解元类之前&#xff0c;我们必须先掌握Python中的类(class)。 和大多数语言一样&#xff0c;Python中的类知识用来描述如何“生成一个对象”&#xff1a;但是&#xff0c;在Python中&#xff0c;类不仅能用来描述如何生成一个对象&#xff0c;类本身也是对象。 …

mysql连接指定时区_MySQL创建JDBC连接时区问题

报错内容&#xff1a;ErrorCode0SQLState01S00The server time zone value is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zon…

听说这是和女朋友住一起后的现象之一

1 被人叫醒时的你&#xff01;2 分享一只软糯香甜的香蕉。。3 到底选哪根好呢&#xff1f;4 大叔你的手机壳怎么肥四&#xff1f;&#xff1f;5 听说这是和女朋友住一起后的现象之一6 爱国主义教育培养了一群吃货&#xff01;7 今天做做题吧&#xff01;&#xff08;本视频来源…

PDF 补丁丁 (修改PDF书签;拆分、合并、制作PDF;提取图片) 0.3.0.8 正式版

PDF 补丁丁 0.3.0.8 正式版 新版本已经发布&#xff0c;请到博客首页下载。 软件简介 PDF补丁丁是一个用于修改PDF文件信息的工具。它具有以下功能&#xff1a;■ 修改文档&#xff08;带“*”号部分功能需通过高级补丁修改功能实现&#xff09;&#xff1a; ● 修改文档属性…