您的位置:首页 > 移动开发 > Android开发

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

2017-09-14 16:01 501 查看
文章转载自http://blog.csdn.net/hzw19920329/article/details/51345971

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

先来看看实例:

[java] view plain copy print?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
 
4000
; 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(”现在是竖屏转横屏”);
}
}
}
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);以横屏显示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息