运行时配置改变

安卓针对语言、位置、硬件的运行时改变,会重启正在运行的activity. 这会强制Activty的资源被重新评估,然后为当前新配置选择最合适的资源值。

但是有时候这种默认的行为会让某些APP困扰,也许根本不准备做任何改变,典型的屏幕的横竖屏的切换。你可以自定义自己的回应方式,通过检测然后反馈。

那么Activity如何监听这种运行时的配置改变呢?

答:增加android:configChanges属性到mainfest的结点上,然后指定你想要监听的配置改变信息。(也就意味着被你监听的,系统就不自作主张了,你自己决定)

下面列出一些你能监听指定的配置改变项:
1.mcc、mnc----- SIM卡被检测到它的移动国家码和移动网络码发生改变。

2.locale  用户改变了当前设备的语言

3.keyboardHidden  键盘,d-pad,或者其它输入设备曝光或者隐藏

4.keyboard 键盘的类型发生改变;比如你的手机有一个12键的小型键盘,然后突然变成一个完整的键盘,或者一个额外的键盘插入。

5.fontScale  用户改变了字体大小

6.uiMode  当全局的UI模式发生改变  这主要发生在如果你切换 car(座机模式) 模式,或者切换白天和夜间模式等等。

7.orientation  不解释了

8.screenLayout  屏幕的布局发生改变。  典型的发生在不同的屏幕被激活。

9.screenSize 这属性是API level 12才引入的,发生在可用的屏幕大小发生改变,比如横竖屏切换

10. smallestScreenSize 这属性是API level 12才引入的, 发生在物理屏幕尺寸发生改变,比如你的设备连接到其外接设备并显示。

 

在某些情况会同时出发多个事件,比如当用户划出一个键盘,很多设备会同时监听到keyboardHidden和orientation2个事件,要是post-Honeycomb MR2连接到额外的设备上,会触发screenSize ,smallestScreenSize,screenLayout,orientation事件。

 

那么说了这么多,mainfest文件中该如何配置呢? 看下面这段例子

<activity 
     android:name=”.MyActivity” 
     android:label=”@string/app_name” 
     android:configChanges=”screenSize|orientation|keyboardHidden”>  列出你要监听的事件      <intent-filter > 
       <action android:name=”android.intent.action.MAIN” /> 
       <category android:name=”android.intent.category.LAUNCHER” /> 
     </intent-filter> 
  </activity>

声明了之后activity中会出发onConfigurationChanged事件,重写这个事件,然后通过传递来的Configuration对象进行自我处理。

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
       super.onConfigurationChanged(newConfig);        // [ ... Update any UI based on resource values ... ] 
       if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
         // [ ... React to different orientation ... ] 
       }        if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) { 
         // [ ... React to changed keyboard visibility ... ] 
       } 
     }

再次注意:任何你不监听的配置发生改变都会造成activity的重启。