Android横竖屏切换生命周期详解

发布时间:2023-05-20

一、Activity的生命周期

在Android中,Activity是一个非常基础的概念。一个应用程序可以有多个Activity,每个Activity都有它的生命周期。关于Activity的生命周期,Android官方文档中有很详细的介绍。在这里,我们简单介绍一下常见的生命周期方法:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @Override
    protected void onStart() {
        super.onStart();
    }
    @Override
    protected void onResume() {
        super.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
    }
    @Override
    protected void onStop() {
        super.onStop();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

Activity的生命周期方法可以分为以下几类:

1. 创建类方法

onCreate():当Activity第一次创建时调用。通常用来做一些创建初始化工作,比如声明UI和逻辑变量,绑定视图等。

2. 可见类方法

onStart():当Activity从不可见变为可见时调用。通常做一些重启一些资源和服务的工作。 onResume():当Activity开始与用户进行交互时调用。通常在这里开始动画,播放音乐和位置信息等。

3. 暂停类方法

onPause():当Activity即将变为不可见时调用。通常做一些资源释放和存储工作。 onStop():当Activity不再可见时调用。通常做一些存储和清理工作。

4. 销毁类方法

onDestroy():当Activity被销毁时调用。通常做一些资源释放工作。

二、横竖屏切换的生命周期

从Activity的生命周期中可以看出,当屏幕旋转时,Activity并没有结束,只是重新开始了自己的生命周期。需要注意的是,如果应用程序没有正确处理横竖屏切换的情况,可能会导致一些可见性的问题或重复创建视图等。下面我们来看一下横竖屏切换后Activity生命周期的变化:

1. 切换前

onPause()onStop()onDestroy()

2. 切换后

onCreate()onStart()onResume() 可以看到,切换后Activity经历了一个完整的生命周期,并且重新创建了UI等基础组件和资源。

三、如何处理横竖屏切换

为了避免横竖屏切换带来的问题,开发者需要对横竖屏切换进行正确处理。下面提供几种处理方式:

1. 禁止横竖屏切换

可以通过在AndroidManifest.xml文件中对Activity进行设置,禁止横屏模式:

<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="orientation|keyboardHidden"
    android:label="@string/app_name" >
</activity>

其中,screenOrientation属性设置为portrait表示禁止横屏模式,configChanges属性表示当屏幕方向发生变化时,不重组Activity以及不做出任何修改,仅仅通过onConfigurationChanged()进行回调通知。

2. 横竖屏切换时保存状态

Activity在横竖屏切换时,会重新创建UI等基础组件和资源。如果在这个过程中不对状态进行保存,则会导致UI显示不正确或数据丢失等问题。可以通过保存状态的方式来避免这个问题。 要保存Activity的状态,首先需要重写onSaveInstanceState()方法:

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putString("my_data_key", mData);
    super.onSaveInstanceState(outState);
}

onSaveInstanceState()方法中,可以将重要的数据保存在Bundle中。Bundle是一个键值对的映射,保存在其中的数据可以在Activity恢复时取回。再重写onCreate()方法,取回保存在Bundle中的数据:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        mData = savedInstanceState.getString("my_data_key");
    }
    setContentView(R.layout.activity_main);
}

onCreate()方法中,检查Bundle是否包含保存的数据,如果有,则取回。

四、总结

Android中,Activity是一个重要的组件,每个Activity都有它的生命周期。在横竖屏切换的过程中,如果开发者不能正确处理,则会导致可见性问题或数据丢失等问题。通过禁止横屏模式和状态保存等方式,可以避免这些问题。