一、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都有它的生命周期。在横竖屏切换的过程中,如果开发者不能正确处理,则会导致可见性问题或数据丢失等问题。通过禁止横屏模式和状态保存等方式,可以避免这些问题。