Activity为我们提供一个可进行交互的窗口。当activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上。
开发应用时我们需要继承Activity或者是它的子类。

Activity的生命周期:

下图已经清楚的展示出Activity的生命周期了,我们结合下图再进行一些解释。

Android 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)来实现的。


这部分的内容较复杂,我们下一篇博客单独来介绍。