Android 横竖屏切换对Activity生命周期的影响

文章转载自http://blog.youkuaiyun.com/hzw19920329/article/details/51345971

       前面我们分析过Activity的生命周期(见:android—–Activity生命周期),但是在现实应用中我们可能会对手机进行横竖屏切换,那么这样的切换对Activity的生命周期有什么影响呢?

       先来看看实例:

  1. public class Activity1 extends Activity{  
  2.     public Button mButton;  
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_lifecycle);  
  7.         System.out.println(”Activity1—–>onCreate”);  
  8.     }  
  9.   
  10.     @Override  
  11.     protected void onDestroy() {  
  12.         super.onDestroy();  
  13.         System.out.println(”Activity1—–>onDestroy”);  
  14.     }  
  15.   
  16.     @Override  
  17.     protected void onPause() {  
  18.         super.onPause();  
  19.         System.out.println(”Activity1—–>onPause”);  
  20.     }  
  21.   
  22.     @Override  
  23.     protected void onRestart() {  
  24.         super.onRestart();  
  25.         System.out.println(”Activity1—–>onRestart”);  
  26.     }  
  27.   
  28.     @Override  
  29.     protected void onResume() {  
  30.         super.onResume();  
  31.         System.out.println(”Activity1—–>onResume”);  
  32.     }  
  33.   
  34.     @Override  
  35.     protected void onStart() {  
  36.         super.onStart();  
  37.         System.out.println(”Activity1—–>onStart”);  
  38.     }  
  39.   
  40.     @Override  
  41.     protected void onStop() {  
  42.         super.onStop();  
  43.         System.out.println(”Activity1—–>onStop”);  
  44.     }  
  45.       
  46.     @Override  
  47.     protected void onRestoreInstanceState(Bundle savedInstanceState) {  
  48.         super.onRestoreInstanceState(savedInstanceState);  
  49.         System.out.println(”Activity1—–>onRestoreInstanceState”);  
  50.     }  
  51.       
  52.     @Override  
  53.     protected void onSaveInstanceState(Bundle outState) {  
  54.         super.onSaveInstanceState(outState);  
  55.         System.out.println(”Activity1—–>onSaveInstanceState”);  
  56.     }  
  57.       
  58.     @Override  
  59.     public void onConfigurationChanged(Configuration newConfig) {  
  60.         super.onConfigurationChanged(newConfig);  
  61.         if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)  
  62.         {  
  63.             System.out.println(”现在是横屏转竖屏”);  
  64.         }else if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)  
  65.         {  
  66.             System.out.println(”现在是竖屏转横屏”);  
  67.         }  
  68.     }  
  69. }  
public class Activity1 extends Activity{ 
public Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle);
System.out.println(“Activity1—–>onCreate”);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    System.out.println("Activity1----->onDestroy");
}

@Override
protected void onPause() {
    super.onPause();
    System.out.println("Activity1----->onPause");
}

@Override
protected void onRestart() {
    super.onRestart();
    System.out.println("Activity1----->onRestart");
}

@Override
protected void onResume() {
    super.onResume();
    System.out.println("Activity1----->onResume");
}

@Override
protected void onStart() {
    super.onStart();
    System.out.println("Activity1----->onStart");
}

@Override
protected void onStop() {
    super.onStop();
    System.out.println("Activity1----->onStop");
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    System.out.println("Activity1----->onRestoreInstanceState");
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    System.out.println("Activity1----->onSaveInstanceState");
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        System.out.println("现在是横屏转竖屏");
    }else if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        System.out.println("现在是竖屏转横屏");
    }
}

}

       横竖屏切换涉及到的是Activity的android:configChanges属性,而与其android:launchMode属性没有关系;

       android:configChanges可以设置的属性值有:

       (1)orientation:消除横竖屏的影响

       (2)keyboardHidden:消除键盘的影响

       (3)screenSize:消除屏幕大小的影响

       当我们设置Activity的android:configChanges属性为orientation或者orientation|keyboardHidden或者不设置这个属性的时候,Logcat输出如下:

       刚刚启动Activity的时候:

       Activity1—–>onCreate
       Activity1—–>onStart
       Activity1—–>onResume

       模拟器中按下Ctrl+F11或者Ctrl+F12由竖屏切换到横屏:

       Activity1—–>onPause
       Activity1—–>onSaveInstanceState
       Activity1—–>onStop
       Activity1—–>onDestroy
       Activity1—–>onCreate
       Activity1—–>onStart
       Activity1—–>onRestoreInstanceState
       Activity1—–>onResume

       模拟器中按下Ctrl+F11或者Ctrl+F12由横屏切换到竖屏:

       Activity1—–>onPause
       Activity1—–>onSaveInstanceState
       Activity1—–>onStop
       Activity1—–>onDestroy
       Activity1—–>onCreate
       Activity1—–>onStart
       Activity1—–>onRestoreInstanceState
       Activity1—–>onResume

       当我们设置Activity的android:configChanges属性为orientation|screenSize或者orientation|screenSize|keyboardHidden,Logcat输出如下:

       刚刚启动Activity的时候:

       Activity1—–>onCreate
       Activity1—–>onStart
       Activity1—–>onResume
       模拟器中按下Ctrl+F11或者Ctrl+F12由竖屏切换到横屏:
       现在是竖屏转横屏

       模拟器中按下Ctrl+F11或者Ctrl+F12由横屏切换到竖屏:

       现在是横屏转竖屏

       可以发现在设置了orientation|screenSize属性之后,在进行横竖屏切换的时候调用的方法是onConfigurationChanged,而不会重新加载Activity的各个生命周期;

       还有一点需要注意的是在进行横竖屏切换的时候在调用onStop之前会调用onSaveInstanceState来进行Activity的状态保存,随后在重新显示该Activity的onResume方法之前会调用onRestoreInstanceState来恢复之前由onSaveInstanceState保存的Activity信息;

       当然在显示中我们可以屏蔽掉横竖屏的切换操作,这样就不会出现切换的过程中Activity生命周期重新加载的情况了,具体做法是,在Activity中加入如下语句:

      android:screenOrientation=”portrait” 始终以竖屏显示 
       android:screenOrientation=”landscape” 始终以横屏显示

       如果不想设置整个软件屏蔽横竖屏切换,只想设置屏蔽某个Activity的横竖屏切换功能的话,只需要下面操作:

       Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);以竖屏显示

       Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);以横屏显示


     


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值