Activity的详解

android种四大组件之一Activity

Activity是用户可见的 一种活动   有7个生命周期方法   分别是:

1.oncreate() //这个方法是在Activity被创建的时候调用,并且只执行一次,所以一些初始化的操作可以放在这个方法里面

2.onstart() //这个方法时用户从不可见变为可见时调用

3.onresume()//这个是当用户可见的时候,调用这个方法 

4.onpause()//这个方法是当跳转到另外一个Activity,调用这个方法

5.onstop()//这个方法是当Activity不可见的时候,调用这个方法

6.ondestroy()//这个方法是当Activity销毁的时候调用

7.onrestart()//当重新启动Activity的时候调用


 下面来详细说下从一个Activity跳转到另外一个Activity  这两个Activity的生命周期方法是怎么运行的

 这里说到Activity之间的跳转,我们就不得不说下    Intent(意图)   通过这个意图可以实现两个Activity之间的跳转

 Intent : 有分为两种  

 一种是显示意图,它的实现方式是:

 Intent  i=new Intent();里面有两个参数   第一个参数是 你当前的Activity  第二个参数是 你需要跳转的Activity   主要:你要跳转的Activity.class 如

Intent  i=new  Intent(this,NextActivity.class);

因为这样可以比较直观的看出来,你需要跳转到哪个Activity  所以称为显示意图 

另外一种是隐示意图 ,它的实现方式是:

Intent i=new Intent();这里面有一个参数   就是你注册Activity的时候,<intent-filter> <action name="xxxxx"></intent-filter> action里面的一个字符串  

<intent-filter><category >  <data></intent-filter>  intent-filter里面还有这两个参数  category里面有个默认的值,你也可以自己设值,但是默认的那个值你不能去掉 ,设值通过

 i.addcategory("");这里面也是一个字符串,这里设值了,记得要去注册的那里添加上

data里面的值,用于更精确地指定当前Activity能够响应什么类型的数据。(<data>标签中主要可以配置以下内容)

1.   android:scheme    用于指定数据的协议部分,比如 http

2.   android:host     用于指定数据的主机名部分,比如 www.baidu.com

3.  android:port  用于指定数据的端口部分,一般紧随主机名之后

4.  android:path   用于指定主机名跟端口之后的部分,如一段网址跟在域名之后的内容

5.  android:mimeType  用于指定可以处理的数据类型,允许使用通配符的方式进行指定 

注意:只要他们这些标签指定的内容和Intent中携带的完全一致时,当前Activity才能够响应该Intent 

隐示意图还有写系统自带的  比如  Intent  i=new  Intent(Intent.ACTION_VIEW);  i.setData("http://www.baidu.com"); 这样就可以打开网页了 

说了这么久还没说 怎么启动呢  其实很简单  用 startActivity(i)  里面放意图就可以了 

这里只是说单纯的跳转  Intent  还可以传值过去  有两种方法 

第一种是不带返回值的传值:(startActivity)

用 i.putExtra()这个是很多方法的重载  里面可以传 int  String boolean等等   这是通过键值对的方式传值的  第一个参数是 键,第二个参数才是你要传递的 值 

在另外一个Activity接受就可以了  用  getIntent()方法得到  一个Intent , 在通过 i.getxxxExtra()  这个xxx表示你传递过来的数据类型   

第二种是带返回值的传值:(startActivityForresult) 

传过去跟上面差不多,但是要注意的是 startActivityForresult()这个里面有两个参数了  第一个还是一个Intent  第二个是一个值,接受回传过来值的时候,用来区分是传给哪个Activity的 ,里面是要给 int 类型的

注意 :    从另外一个Activity传值回来的过程是 :也是用一个Intent()来携带数据  这里是通过 setResult()里面是两个参数,一个是意图,另外一个也是主Activity(没跳转之前的Activity)用来区分是哪个Activity传递过来的值   在setResult()方法后面 一定要 finish() 销毁当前Activity

在主Activity(没跳转之前的Activity) 就不是通过 getIntent()了    需要重写 onActitityResult() 里面有三个参数  

第一个参数 : 就是主Activity启动时候的那个数值 startActivityForresult(i,数值)

第二个参数  :  在另外一个Activity传回来时候的那个数值setResult(i, 数值) 

第三个参数 :就是传过来的意图 intent

扯了这么多终于要回归主题了,Activity跳转之间的生命周期方法是怎样的呢  

Activity总共有 4中活动状态 

1. 运行状态  当Activity位于栈顶的时候,这时的Activity就处于运行状态 

2. 暂停状态  当Activity不处于栈顶,但是仍然可见的时候,这时Activity就处于暂停状态。这里有人估计就要有疑问的,不处于栈顶怎么还会可见呢?比如说弹出一个对话框(dialog) 不完全遮挡时,就是处于这种状态,下面回详细说明。

3.停止状态  当Activity不位于栈顶,也不可见的时候,这时Activity就处于停止状态。

4.销毁状态  当一个Activity从栈中移除后就处于销毁状态 

Activity的生存期

这图可以比较直观的显示出Activity的生命周期 

Activity的详解





又分为3中生存期   1 完整生存期  2.可见生存期  3.前台生存期  说到这里可能就有人有疑问了,怎么又是4中活动状态,3中生存期的   其实看Activity生命周期方法的调用还是要看生存期的。

这里分别 用Activity (A 和 B 和 C(这是一个DialogActivity ,可以看成一个Activity)来代替) 

A跳转B

A ---->oncreate() -->onstart() -->onresume()-->onpause()

B----->oncreate()-->onstart()-->onresume()

A------>onstop()

B返回A时 

B--->onpause()

A---->onrestart()---->onstart()--->onresume()

B---->onstop()--->ondestroy()


A跳转C 

A---->oncreate()--->onstart()--->onresume()---->onpause()

B---->oncreate()--->onstart()--->onresume()

C返回A时 

C---->onpause()

A--->onresume()

C---->onstop()---->ondetroy()

发现onpause()跟onstop()的区别在于,如果跳转到对话框的时候,那么onpause()能执行,onstop()并不会执行   

这里还要补充一点的是,如果当一个Activity进入停止状态时,是有可能被系统回收的,当A跳转到B ,当我从B中返回是,发现内存不足,A被回收了,显示还是会正常的显示,但是不会调用onrestart()这个方法了 ,它会直接创建一个,通过oncreate()这个方法,如果我A中还有要用的数据的时候,那怎么办呢? 如果出现这种情况,用户的体验是非常不要的。 这里Activity提供了一个回掉方法  onSaveInstanceState(),这个方法会在Activity被回收之前调用,可以通过这个方法来解决被回收时临时数据得不到保存的问题  

onSaveInstanceState()这里面有一个参数 Bundle 提供了一些列的方法用来保存数据   

然后你在oncreate()方法中取出来就可以了    oncreate()方法也有一个Bundle

说到这里Activity的周期方法就说完了,Activity之间跳转生命周期方法怎么执行的也差不多了。下面说下Activity的4中启动模式 


1.standard   (设置启动模式在注册Activity的launchMode里面的)

这个是Activity默认的启动模式,在不进行显示指定的情况下,所有的Activity都会自动使用这种模式    使用这种方式启动   当跳转的时候会一直创建  

Activity的详解


2. singleTop 

 启动Activity时,如果发现栈的栈顶已经是这个活动了,则认为可以直接使用它,不会再创建Activity实例了,如果不在栈顶的时候,还是会创建 


Activity的详解

3.singleTask  

启动Activity时,系统会检查栈中是否存在这个Activity,如果存在就直接使用,并且把这个Activity上面的所有Activity都清除出去,如果发现没有就创建。


 Activity的详解

4.singleInstance 

启动Activity时,会启用一个新的栈来管理这个活动(主要 实现其他程序和我们自己的程序可以共享这个Activity的实例)







Activity的详解




说到这里基本就差不多了还有个随时可以退出的办法 不用你跳转几次就返回几次 

可以定义一个 Activity管理类  把这些放在一个集合当中   在通过 添加跟移除和移除全部的方法,这里就不写代码的实现了。。


希望对别人有点帮助,写的不对的地方勿喷,欢迎大神指点出来。。。。