Activity简介
Activity是Android的四大组件之一,同时它也是Android应用中最常见的组件之一。一个应用通常会有多个Activity,它主要负责与用户进行交互,并向用户呈现出应用此时的状态,不同的Activiy呈现给用户不同的操作体验。其实每当我们打开一个Android的app,我们都会接触到它。他其实就相当于一个屏幕,上面承载着我们所能看到和接触到的不同的组件。
Activity创建三步曲
那么我们如何在项目中创建Activity呢? 其实每当我们新建一个项目的时候,ide都会帮我们创建一个MainActivity,如果我们还想创建新的Activity,最简单的方式就是通过ide直接new一个Activity。但还是得了解Activity具体的创建过程。
手动创建分为三步 :
第一步就是新建一个类继承于Activity或者其子类 ;
第二步就是在AndroidMainifest进行声明注册,(四大组件的使用都需要在清单文件中进行配置。)只需要在<application></application>中添加<activity../>子元素即可配置。下图是创建项目时帮我们注册好的MainActivity的配置以及我现在新建的DemoActivity的配置。
在配置过程中我们可能会经常接触到的一些属性:
name:
该Activity的类名label:
该Activity的标签,相当于标题,也就是当你打开应用时,该Activity上方的ActionBar显示的标题就是通过这个设置的icon:
该Activiy对应的图标exported:
指定该Activity是否允许被其它的应用调用launchMode:
指定Activity的启动模式,下边会讲
至于<intent-filter…/>其实就是一个过滤器。一种根据某一个intent当中action、data以及category等属性,对适合接收这个intent组件进行匹配和筛选的机制,主要用于使用隐式intent来启动activity的时候。 在上图中的MainActivty里面的categoy标签中LAUNTCHER其实就是将该Activiy置为打开应用时最先启动的界面。也就是我们打开此app时最先看到的就页面。
第三步就是创建layout并在该类中的onCreate通过setContentView设置
这样子就创建好一个Activity了,当然实际开发如果你不习惯这样也可以直接通过file来new一个Activity,这样配置和layout都会帮你弄好。但是具体创建过程还是要了解的。
Activity生命周期
当Activity被部署在应用当中后,在应用程序的运行过程中,Activity会不断在不同的状态中进行切换,在切换的过程中其实就是在对Activty中特定的方法进行回调。而这些特定的方法其实就是Activity的生命周期中不同的状态。熟悉Activity生命周期是很有必要的,只有熟悉其生命周期,你才能游刃有余的在不同状态中进行不同的操作,让用户体验感更好。
上图我们可以看到Actvity类中定义了七个回调方法:
onCreate :
onCreate在整个生命周期只会调用一次,也就是开始启动的时候,第一次创建的时候进行调用。只有执行了onDestroy再打开这个Activity才会再次调用onCreate。一般在此阶段我们通常会进行一些初始化的操作,像设置layo文件或者对控件进行绑定等等;onStart :
此时用户已经可以看到界面了,但界面此时并没焦点,用户还不能进行操作; 此方法是在Activity由不可见变为可见时调用;onResume :
此时Activity有焦点,用户可以开始进行操作。此方法是在和用户进行交互时调用;onPause :
此时界面还是可见的,但又再次失去了焦点。 此方法在准备去启动或者恢复另一个Activity时调用;onStop :
此时原来的Activity已经看不见了,进入到了后台。此方法是在原来的Activity完全不可见时调用的;onRestart :
当用户再次启动原来的Activity,是之进入前台时调用;onDestroy :
此时Activity被销毁。该方法在Activity被销毁之前调用;比如说我们在退出应用或者进行屏幕翻转时都会调用此状态;
上面七种方法是不需要我们去自己实现的,它是在Activity进入到相应状态时自动进行回调。而我们只需要通过重写相应的方法在相应的状态中进行你想要的操作即可。下面我们通过几张图片来更加清晰的认识Activity生命周期。
上图中我在MainActivity中重写七个方法(下面还有个onRestart的没有截图到)并在执行到不同状态时打出相应的log。此时我启动应用,我们可以来看下日志。
我们可以看到,当我们启动应用时,会调用onCreate
、onStart
、onResume
。也就是MainActivity经过了创建-->可见-->可用这三个过程。此时当我们点击Demo按钮(我设置一个跳转界面的点击事件)此时会跳转到一个新的Activity。
通过上图可以看到,当从MainActivity跳转到一个另一个Activity后,MainActivity会调用onPause
、onStop
。但并不会调用onDestroy,因为此时MainActivity此时还并没有被销毁。接下来我们点击返回键,返回到MainActivity中。
当我们返回到MainActivity后,此时MainActivity会调用onRestart
、onStart
、onResume
。此时我们我们再点击返回键退出该应用。
这时我们已经退出了应用,MainActivity也随之销毁了。
==熟悉生命周期,可以在特定的状态中进行操作== 例如:假如我们现在做一个社交app,我希望在发信息的时候,若输完后没发出去,那么就是一条草稿,假如现在我不小心退出应用(这里指的是按返回键退出--onDestroy),那么再进入时此草稿还存在。这个操作其实就可以通过在Destroy中先进行数据的保存,然后在onCreate的时候取回数据。
Activity启动模式
在上面讲创建Activity时,第二步在清单文件进行配置时,里面有一个launchMode的属性,这个属性就是用来配置该、对应Activity的启动模式。在项目中我们应该根据特定的需求为不同的Activity设置恰当的启动模式。
启动模式一共有四种:
standard : 标准模式,也是默认的加载模式。
singleTop : Task栈顶单例模式
singleTask : Task内单例模式
singleInstance : 全局单例模式
任务栈(Task Stack):其实就是一个栈,里面放着Activity,正在使用的Activity放在栈顶,当返回时,就出栈。
接下来来对上面的四种启动模式进行详细讲解:
standard
标准模式 ; 如果不进行配置,默认都是该模式。在该模式下,当启动一个新的Activity时,这个新的Activity就会进入到栈顶,当点击返回键时,这个Activity就会出栈,其实就相当于典型的出入栈操作。在这个模式下,如果我们多次打开同一个Activity,那么这个Activity也会多次入栈,也就是会重复入栈。 例如 : 我现在将刚刚上面的图中的demo按钮的事件设成跳转到当前界面 : startActivity(new Intent(MainActivity.this,MainActivity.class)); 那么此时当我连续点击四次按钮之后,那么其实此时就会有五个MainActivity在栈中,需要点击五次返回键才能退出该应用。singleTop
栈顶单例模式 ; 通过名字我们就大致可以看出,这是用来防止栈顶进行重复创建。在这个模式下,若要启动的Activity已经在栈顶,则直接使用栈顶的该Activity,而不会像标准模式那样去重复创建。当然如果要启动的Activity并不位于栈顶的话,那么此Activity就会进入到栈顶。singleTask
栈内单例模式 ; 通过名字其实我们也可以看出,这个模式是用来防止在栈内中创建重复的Activity。在singleTop中我们可以防止栈顶的重复创建,但是在栈中还是允许有重复的Activity。而如果将启动模式设置成singleTask之后,这时就不允许栈中有重复的Activity了。 例如 : 假入现在我们将Activity1设置成了singleTask启动模式,那么就会有三种情况; 第一种就是此时栈中没有Activity1,那么它就会进入到栈顶; 第二种就是当栈顶就是Activity1时,此时就和singleTop是一样的,会直接使用栈顶的Activity1; * 第三种就是当栈里有这个Activity1,但它并不位于栈顶,此时也不会创建,而是把Activity1以上的Activity,全部出栈,直到Activity1在顶部。singleInstance
全局单例模式 ; 这个模式和上面三种比起来它是最特别也是逼格最高的,上面三种模式都是在同一个任务栈中进行的,而这个模式它会启动一个新的任务栈。将一个Activity指定为singleInstance模式,那么当你启动这个Activiy时会使用一个新的任务栈来管理它。 例如 : 我现在创建了一个启动模式设置为singleInstance的Activity2,跳转到这个Activity2时, ①如果是第一次跳转,那么会创建一个独立栈,并将这个独立栈提前 ②如果不是第一次,那么就直接将第一次创建的独立栈提前
返回的时候, ①如果独立栈在前,那么先将独立栈里的Activity出栈。②如果独立栈在后,先把前面的那个任务栈(就是设置了上面三种启动模式的Activity任务栈)里的所有已创建的Activity出栈,再去到独立栈里的将独立栈里的Activity出栈。
其实关于Activity还有一块非常重要的也是非常常用的知识点就是不同Activity之间的跳转和数据传递。但因为关系到Intent的知识,所以就放到下次和Intent一起写吧。