目前大多数手机都支持重力感应随之而来的就是屏幕方向改变的问题。对应普通开发者来说屏幕的随意改变也会带来困扰。在Google自带的doc里可以看到,如果设备的配置(Resources.Configuration中进行了定义)发生改变,那么所有用户界面上的东西都需要进行更新以适应新的配置。因为Activity是与用户交互的最主要的机制,它包含了处理配置改变的专门支持。除非你特殊指定,否则当配置发生改变(比如屏幕方向、语言、输入设备等等的改变)时你当前的activity都将被销毁,这销毁是通过一个正常的activity生命周期过程进行的。如果activity之前正在前景画面,当这个实例的onDestroy()调用完成后将会启动这个activity的一个新的实例,并将前面那个实例中所保存的内容传递给新的实例。因为任何的应用资源(包括layout文件)都有可能由于任何配置值改变。

因此处理配置改变的唯一安全的方法就是重新获取所有的资源,包括layout、绘图资源(原文drawables)、字符串资源。由于activity已经如何保存自己的状态并从这些状态中重建自身,所以activity 重新启动自身来获得新的配置将是一个非常便利的途径。

在一些特殊的情况中你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置android:configChanges属性来实现这点。你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activity的onConfigurationChanged(Resources.Configuration)方法。

如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明),你的activity仍然要被重新启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。

①在AndroidManifest.xml中设置Activity的android:configChanges属性

在屏幕方向改变的时候,如果没有处理,程序会自动重启。对应一些需要保存用户数据的应用中必须处理这种情况。

<activity android:name=".AndroidLight"
                  android:label="@string/app_name"
                  android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

指定了屏幕方向改变和键盘隐藏时通知程序。不会重新启动activity,而会调用activity的onConfigurationChanged(Resources.Configuration)方法。在程序中可以添加处理事件

@Override
 public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);
   Log.d(TAG," == onConfigurationChanged");
   processLayout();//自定义函数处理配置改变事件
 }

②可在AndroidManifest.xml中设置Activity的android:screenOrientation属性

<activity android:name=".AndroidLight"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

这样指定屏幕方向为竖屏。屏幕就不会自动旋转了。横屏的值时landscape。

关于android:configChanges和android:screenOrientation的取值,可参看节选的博客

节选自http://ghostfromheaven.iteye.com/blog/967629

http://blog.sina.com.cn/s/blog_67aaf44401015zj6.html

最新文章

  1. 基于hexo+github搭建一个独立博客
  2. IScroll5兼容IE修改
  3. Hive metastore三种配置方式
  4. JQuery 实现两列等高并自适应高度
  5. POJ2774 (后缀数组)
  6. 带有静态方法的类(java中的math类)
  7. Ibatis中常见错误解决方案
  8. C#集合u
  9. Day9 summary
  10. VS2008下使用 CMFCPropertyGridCtrl 转载
  11. iTween基础之Look(使对象面朝指定位置)
  12. HDU4745 - Two Rabbits(区间DP)
  13. PAT (Advanced Level) 1077. Kuchiguse (20)
  14. Flex移动应用程序开发的技巧和窍门(一)
  15. docker 发布到私有docker registry
  16. mysql的学习笔记(二)
  17. springboot整合mybatis的多数据源解决办法
  18. Web Storage和cookie
  19. cookie的存入和取出
  20. 6种纯css实现loading效果

热门文章

  1. Android 之 AndroidManifest.xml 详解(一)
  2. linux 用户管理,用户权限管理,用户组管理
  3. uni-app 如何引入全局方法或变量?
  4. Java从零开始学零(Java简介)
  5. 线性表 顺序存储 链式存储 ---java实现
  6. SettingsPLSQLDeveloper
  7. ActiveMQ基本介绍
  8. dojo之配置dojoconfig
  9. C# 关闭显示器(显示)
  10. permission denied make_sock could not bind to address 81问题解决