Activity简介
Activity组件是用户能够与之交互的部分,每一个Activity组件都必须在AndroidManifest.xml文件里的<application>元素中用<activity>进行声明,<activity>元素有很多属性,必须含有的属性是android:name,表示这个Activity类的名字。
Activity的启动与被启动
我们知道,在Android中,应用程序可以通过Intent对象启动其它应用程序的组件,那么被启动的组件是如何接收到这个消息的呢?没错,这就是<activity>里的<intent-filter>元素的作用啦,不管这个组件是主动启动还是被动启动,都是通过<intent-filter>来实现的。每个应用程序都有一个主动启动的主入口,在主入口的<activity>中声明即可:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
当然,如果你不希望你的组件被其它应用程序启动,就不需要声明<intent-filter>了,在自己的应用程序中可以用显式的Intent启动,如下代码所示:
Intent intent = new Intent(this, ActivityToBeActivated.class);
startActivity(intent);
如果你的应用程序要启动其它应用程序的组件并有返回结果(如获取联系人信息),可以用startActivityForResult(Intent intent, int requestCode)方法,并重写onActivityResult(int requestCode, int resultCode, Intent data)方法,data里就存有返回的结果。
Activity的关闭
要关闭当前的Activity,只需调用该Activity的finish()方法,也可以用finishActivity(int requestCode)来关闭通过startActivityForResult(Intent intent, int requestCode)启动的Activity。大部分情况下你都不需要自己关闭Activity,系统会自动管理。
Activity的生命周期
Activity的整个生命周期包括三个状态:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Intent intent = new Intent(this, ActivityToBeActivated.class);
startActivity(intent);
- 运行状态(Resumed):用户看得到并且可以与之交互。
- 暂停状态(Paused):用户看得到但不可以与之交互,比如弹出一个对话框时后面的那个变得有点透明的Activity,这时Activity还算活着(存在于内存中,包括状态和成员变量和成员函数等,仍与窗口管理器绑定),但在系统内存极低的情况下还是有可能被杀掉的。
- 停止状态(Stopped):用户看不到也不可以与之交互,这时Activity也还活着,但也活不久了(与暂停状态一样存在于内存中,但不与窗口管理器绑定),系统随时都可能杀掉它以释放内存资源。
与Activity生命周期相关的七个函数:
- onCreate(Bundle savedInstanceState):完整生命周期开始,当Activity刚被创建时被调用,应该在这里进行初始化(定义布局、初始化全局变量、创建新线程等)。
- onRestart():当Activity进入停止状态后又重新启动时会被调用。
- onStart():可见生命周期开始,在用户看到Activity前调用。
- onResume():前台生命周期开始,在开始跟用户交互前调用,在整个生命周期中,前台生命周期是切换得比较频繁的,为了用户体验,这部分应该尽量精简。
- onPause():前台生命周期结束,当要启动其它Activity前调用,应该在这里保存数据(因为之后Activity都可能被杀掉)和停止动画等比较消耗CPU的功能,而且这个函数应该尽快结束(因为在这个函数结束前用户都看不到被用户启动的其它Activity)。
- onStop():可见生命周期结束,在Activity对用户不可见时调用。
- onDestroy():完整生命周期结束,应该在这里释放资源(释放内存、关闭线程等)。
关于Activity的完整的生命周期,引用官网的一张图片来说明:
Activity状态的恢复
注意到与生命周期相关的七个函数中,只有一个是带有参数的,对了,就是onCreate(Bundle savedInstanceState),这个参数是一个Bundle对象,那么这个参数是干什么用的呢?这个参数就是用来恢复Activity状态信息的,在Activity的整个生命周期中,用户可能会启动其它Activity,然后原来的Activity就会进入停止状态,而在这个状态下Activity是有可能被系统杀掉的,如果用户这时回到原来的Activity时,用户期待原来的Activity还是他启动其它Activity前的状态,这就涉及到Activity状态的恢复啦。
说到恢复状态信息,那当然在这之前要有一个保存状态信息的过程(不然哪来的数据呢),可以重写onSaveInstanceState(Bundle outState)方法来实现这一功能,这里的outState就是你用来保存状态的和恢复状态时传给onCreate(Bundle savedInstanceState)方法的savedInstanceState对象。默认的onSaveInstanceState(Bundle outState)会调用布局里的每一个拥有ID的View对象的onSaveInstanceState()方法,以保存每一个View对象的状态,这里要注意一点,只有拥有android:id属性的View对象的状态才会被保存。还有,系统并不保证onSaveInstanceState(Bundle outState)方法一定会被调用(比如用户主动关闭该Activity),如果被调用,那就一定是在onStop()之前,也有可能在onPause()之前。
测试你的应用程序有没有实现好状态恢复的一个好方法是旋转屏幕,当屏幕方向改变时,系统会杀掉当前的Activity后又重新启动。
关于Activity的状态的恢复,同样用官网的一张图片说明:
Activity的切换
当在Activity A中启动Activity B,整个流程如下:
- 调用A的onPause()
- 调用B的onCreate()、onStart()、onResume()
- 调用A的onStop()
所以有什么数据需要保存的话,应该在A的onPause()中实现。
Demo下载地址