Activity为我们提供一个可进行交互的窗口。当activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上。
开发应用时我们需要继承Activity或者是它的子类。
Activity的生命周期:
下图已经清楚的展示出Activity的生命周期了,我们结合下图再进行一些解释。
全生命周期:onCreate()->onDestroy()
在onCreate()中初始化Activity所能使用的全局资源和状态,在onDestroy()中释放这些资源。
可视生命周期:onStart()->onStop()以及onRestart()
这个过程是界面从可见到不可见的过程,但并不是全程都是允许交互的。onStart()一般用于初始化或启动与界面更新相关的资源,onStop()一般用于暂停和停止与更新界面相关的线程、计时器和服务。
活动生命周期:onResume()->onPause()
该过程中Activity在屏幕的最顶层,并且能够与用户发生交互。该周期的两个函数会频繁地被使用,所以这两个方法中应该尽量是简单、高效的代码。
另外两个方法:onRestoreInstanceState()和onSaveInstanceState()
不属于?命周期的事件回调函数,但可以?于保存和恢复Activity的界?临时信息
onSaveInstanceState()会将界?临时信息保存在Bundle中,onCreate()和onRestoreInstanceState()都可以恢复这些保存的信息。
简化的办法是使?onCreate() 恢复,但有些特殊的情况下还是需要使?onRestoreInstanceState()函数恢复 :
■ 必须在界?完全初始化完毕后才能进?的操作
■ 或需要由?类来确定是否采?缺省设置等
Activity的配置:
四大组件都是需要我们显式配置的。Activity就在<application…/>里面加个<activity…/>。
我们着重讲一下Activity配置时候常用的几个属性:
name:指定该Activity的实现类的类名。
icon:图标。
label:标签。
exported:是否允许被其他应用调用。
launchMode:启动模式,可选项有standard、singleTop、singleTask、singleInstance。
下面着重说下Activity的启动模式(launchMode)。
以前总是以为Activity有一个Activity栈,Activity们就这样FILO,原来是自己太na?ve。
standard:每次启动Activity都会产生新的实例,并加到栈中。
singleTop:与standard类似,不同的是,当启动的Activity刚好处于栈顶时,不产生新的实例,而是直接复用栈顶的这个实例。
singleTask:有与前面两个相同的处理方式,不同的是,当要启动的Activity不处于栈顶的时候但是处于栈中的时候,会移出这个Activity实例上面的所有实例,把需要启动的Activity置于栈顶。
singleInstance:每次启动新的Activity都会产生实例并放在一个新的栈中,每次启动存在的Activity都会直接复用存在的实例。
Activity的跳转:
启动Activity的方法有:(先说显式启动,隐式启动后面会介绍)
startActivity(Intent intent)和startActivityForResult(Intent intent,int requestCode)
第二个方法的第二个参数requestCode为请求码,用于标识启动请求的来源。
记得要在配置文件配置Intent,虽然大多数时候都不需要我们自己去做。
关闭Activity的方法:
finish()和finishActivity(int requestCode)
这两个方法分别于前面两个启动方法相对应。
在关闭Activity的方法被调用前我们常常还会用到下面这个函数:
void setResult( int ResultCode, Intent data)
参数:
结果码ResultCode:表明?Activity的返回状态 ,通常为为Activity.RESULT_OK或 Activity.RESULT_CANCELED,也可以是自己定义的其他整型。
返回值data:?Activity需要返回的数据传递。
子Activity关闭时,我们可以在父Activity中通过重写public void onActivityResult (int requestCode, int resultCode, Intent data)方法来接受子Activity的请求码、返回状态和数据。
Activity之间的数据传递:
Intent充当信使为我们传递数据,我们只需要把需要传递的数据放到Intent上就好了。Intent存取数据的方法:
putExtras(Bundle data)
Bundle getExtras()
putExtra(String key,Xxx value):其实会隐式地产生一个Bundle。
Xxx getXxxExtra(String key)
Bundle可以理解为一个数据包,用来装各种各样的数据,除了在这里,我们在使用Message在同一个Activity的不同线程传递数据时,也会用到Bundle。
Bundle存取数据的方法:
putXxx(String key,Xxx data)
getXxx(String key)
putSerializable(String key,Serializable data) :Serializable指一个可序列化对象,比如一个类的实例。
getSerializable(String key)
隐式启动Activity
应用场景比如你要打开一个文档,但你的手机中有一个或者好几个可以打开文档的应用,这时系统会自动为你匹配可以打开文档的应用,你选择一个来打开文档,就是隐式地启动了一个Activity。
应用本身没有指定启用那个Activity,而是由系统来决定。这种做法很好的降低了组件之间的耦合度、提高了组件的可复用性。
系统会自动匹配合适的Activity,其中的匹配机制是依靠Android系统中的Intent过滤器(Intent Filter)来实现的。
这部分的内容较复杂,我们下一篇博客单独来介绍。