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的生命周期
又分为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都会自动使用这种模式 使用这种方式启动 当跳转的时候会一直创建
2. singleTop
启动Activity时,如果发现栈的栈顶已经是这个活动了,则认为可以直接使用它,不会再创建Activity实例了,如果不在栈顶的时候,还是会创建
3.singleTask
启动Activity时,系统会检查栈中是否存在这个Activity,如果存在就直接使用,并且把这个Activity上面的所有Activity都清除出去,如果发现没有就创建。
4.singleInstance
启动Activity时,会启用一个新的栈来管理这个活动(主要 实现其他程序和我们自己的程序可以共享这个Activity的实例)
说到这里基本就差不多了还有个随时可以退出的办法 不用你跳转几次就返回几次
可以定义一个 Activity管理类 把这些放在一个集合当中 在通过 添加跟移除和移除全部的方法,这里就不写代码的实现了。。
希望对别人有点帮助,写的不对的地方勿喷,欢迎大神指点出来。。。。