横竖屏切换时候Activity的生命周期变化
对于横竖屏幕的切换,Activity的不同生命周期的变化,自己亲自用真机调试测试了一下,总结如下:
Activity类:
package com.example.screenorientationchange; import android.support.v7.app.ActionBarActivity; import android.content.res.Configuration; import android.os.Bundle; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("-----------onCreate-----------------"); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); System.out.println("-----------onStart-----------------"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); System.out.println("-----------onRestart-----------------"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); System.out.println("-----------onResume-----------------"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); System.out.println("-----------onPause-----------------"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); System.out.println("-----------onStop-----------------"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); System.out.println("-----------onDestroy-----------------"); } @Override public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); System.out .println("-----------onConfigurationChanged-----------------"); } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); System.out.println("-----------onSaveInstanceState-----------------"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); System.out .println("-----------onRestoreInstanceState-----------------"); } }
当启动程序时,info信息里面打印出来的结果是(默认是竖屏)
当切换到横屏时打印信息如下,可以看到重新Create了一个Activity,
当再次切换回到竖屏时,打印信息如下(紫色横线下面),又再一次重新onCreate了一个Activity。
下面我们去AndroidMainifest.xml中配置一下android:configChanges=" "参数
先说一下android:configChanges=" "参数类型的代表含义:
"mcc" | 国际移动用户识别码所属国家代号是改变了----- sim被侦测到了,去更新mcc mcc是移动用户所属国家代号 |
"mnc" | 国际移动用户识别码的移动网号码是改变了------ sim被侦测到了,去更新mnc MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网 |
"locale" | 地址改变了-----用户选择了一个新的语言会显示出来 |
"touchscreen" | 触摸屏是改变了------通常是不会发生的 |
"keyboard" | 键盘发生了改变----例如用户用了外部的键盘 |
"keyboardHidden" | 键盘的可用性发生了改变 |
"navigation" | 导航发生了变化-----通常也不会发生 |
"screenLayout" | 屏幕的显示发生了变化------不同的显示被激活 |
"fontScale" | 字体比例发生了变化----选择了不同的全局字体 |
"uiMode" | 用户的模式发生了变化 |
"orientation" | 屏幕方向改变了 |
"screenSize" | 屏幕大小改变了 |
"smallestScreenSize" | 屏幕的物理大小改变了,如:连接到一个外部的屏幕上 |
修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation"
<activity android:name=".MainActivity" <span style="background-color: rgb(255, 255, 153);">android:configChanges="orientation"</span> android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
然后运行程序,可以看到打印信息跟没有配置之前是一模一样的。
然后重新修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation|screenSize"
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
打印结果如下:
此时没有重新create一个Activity,只是调用了onConfigurationChange方法,无论你怎么切换,只会调用这一个方法了。
总结:
1、不设置Activity的android:configChanges=""和设置为android:configChanges="orientation"时,两种情况结果是一样的。都重新oncreate
了一个Activity。(我是真机调试的,系统是4.1的, 版本设置是android:minSdkVersion="8" android:targetSdkVersion="21")。
在网上百度了一下,原因是这样的,自从Android3.2(API 13)系统之后,随着横竖屏的切换screen size也随着改变,所以,
在AndroidManifest.xml里设置MiniSdkVersion和TargetSdkVersion属性大于13的情况下,除了设置”orientation“还要设置”screensize“.
2、当设置android:configChanges="orientation|screensize"之后,横竖屏的切换就不再会重新调用各个生命周期,之后执行onConfigurationChanged方法。