一、什么是activity
activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能。它是 android 应用程序的基本功能单元。activity 本身是没有界面的。所以activity类创建了一个窗口,开发人员可以通过setcontentview(view)接口把ui放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowisfloating的主题集合),或者嵌入到其他的activity(使用activitygroup)。activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道,
二、activity生命周期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class activity extends applicationcontext {
protected void oncreate(bundle savedinstancestate);
protected void onstart();
protected void onrestart();
protected void onresume();
protected void onpause();
protected void onstop();
protected void ondestroy();
}
|
相信不少朋友也已经看过这个流程图了,也基本了解了activity生命周期的几个过程,我们就来说一说这几个过程。
1.启动activity:系统会先调用oncreate方法,然后调用onstart方法,最后调用onresume,activity进入运行状态。
2.当前activity被其他activity覆盖其上或被锁屏:系统会调用onpause方法,暂停当前activity的执行。
3.当前activity由被覆盖状态回到前台或解锁屏:系统会调用onresume方法,再次进入运行状态。
4.当前activity转到新的activity界面或按home键回到主屏,自身退居后台:系统会先调用onpause方法,然后调用onstop方法,进入停滞状态。
5.用户后退回到此activity:系统会先调用onrestart方法,然后调用onstart方法,最后调用onresume方法,再次进入运行状态。
6.当前activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前activity,而后用户退回当前activity:再次调用oncreate方法、onstart方法、onresume方法,进入运行状态。
7.用户退出当前activity:系统先调用onpause方法,然后调用onstop方法,最后调用ondestory方法,结束当前activity。
由图可知:
在一个activity正常启动过程中,这些方法调用的顺序是oncreate -> onstart -> onresume;在activity被kill掉的时候方法顺序是onpause -> onstop -> ondestroy,此为一个完整的lifecycle。那么对于中断处理(比如电话来了),则是onpause -> onstop,恢复时onstart -> onresume;如果当前应用程序的是一个theme为translucent(半透明) 或者dialog 的activity那么中断就是onpause ,恢复的时候onresume。
那么对于”other app need memory”,就是我们手机在运行一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,至少要保证一些功能(比如电话),所以资源不足的时候也就有可能被kill掉。
方法在系统中的作用及我们应该做什么:
oncreate:在这里创建界面,做一些数据的初始化工作;
onstart: 到这一步变成“用户可见不可交互”的状态;
onresume:变成和用户可交互的,(在activity栈系统通过栈的方式管理这些activity,即当前activity在栈的最上端,运行完弹出栈,则回到上一个activity);
onpause:到这一步是可见但不可交互的,系统会停止动画等消耗cpu的事情。从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在onresume里读出来。
onstop:变得不可见 ,被下一个activity覆盖了
ondestroy:这是activity被kill前最后一个被调用方法了,可能是其他类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isfinishing()来判断它,如果你有 一个progress dialog在线程中运行,请在ondestroy里把他cancel掉,不然等线程结束的时候,调用dialog的cancel方法会抛异常。
onpause,onstop,ondestroy,三种状态下 activity都有可能被系统kill 掉。
三、activity之间的通信
在 android 中,不同的 activity 实例可能运行在一个进程中,也可能运行在不同的进程中。因此我们需要一种特别的机制帮助我们在 activity 之间传递消息。android 中通过 intent 对象来表示一条消息,一个 intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 intent 对象,消息“目的地”是必须的,而内容则是可选项。
intent负责对操作的动作、动作涉及数据、附加数据进行描述,android则根据此intent的描述,负责找到对应的组件,将 intent传递给调用的组件,并完成组件的调用。因此,intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
在应用中,我们可以以两种形式来使用intent:
直接intent:指定了component属性的intent(调用setcomponent(componentname)或者setclass(context, class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
间接intent:没有指定comonent属性的intent。这些intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此intent的组件。
对于直接intent,android不需要去做解析,因为目标组件已经很明确。
android需要解析的是那些间接intent,通过解析,将 intent映射给可以处理此intent的activity、intentreceiver或service。intent解析机制主要是通过查找已注册在androidmanifest.xml中的所有intentfilter及其中定义的intent,最终找到匹配的intent。
四、activity 的intent filter
intent filter 描述了一个组件愿意接收什么样的 intent 对象,android 将其抽象为 android.content.intentfilter 类。在 android 的 androidmanifest.xml 配置文件中可以通过 <intent-filter >节点为一个 activity 指定其 intent filter,以便告诉系统该 activity 可以响应什么类型的 intent。
当使用 startactivity(intent) 来启动另外一个 activity 时,如果直接指定 intent 对象的 component 属性,那么 activity manager 将试图启动其 component 属性指定的 activity。否则 android 将通过 intent 的其它属性从安装在系统中的所有 activity 中查找与之最匹配的一个启动,如果没有找到合适的 activity,应用程序会得到一个系统抛出的异常。这个匹配的过程如下:
五、activity的栈式管理
android针对activity的管理使用的是栈,就是说某一个时刻只有一个activity处在栈顶,当这个activity被销毁后,下面的activity才有可能浮到栈顶,或者有一个新的activity被创建出来,则旧的activity就被压栈沉下去了。activity是android程序的表现层。程序的每一个显示屏幕就是一个activity。正在运行的activity处在栈的最顶端,它是运行状态的。
当在程序中调用 activity.finish()方法时,结果和用户按下 back 键一样:它告诉 activity manager该activity实例可以被“回收”。随后 activity manager 激活处于栈第二层的 activity ,把原 activity 压入到栈的第二层,从 running 状态转到 paused 状态。
六、activity的加载模式
standard、singletop、singletask、singleinstance(其中前两个是一组、后两个是一组),默认为standard
standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。
singletop:也是发送新的实例,但不同standard的一点是,在请求的activity正好位于栈顶时(配置成singletop的activity),不会构造新的实例
singletask:和后面的singleinstance都只创建一个实例,当intent到来,需要创建设置为singletask的activity的时候,系统会检查栈里面是否已经有该activity的实例。如果有直接将intent发送给它。
singleinstance:
首先说明一下task这个概念,task可以认为是一个栈,可放入多个activity。比如启动一个应用,那么android就创建了一个task,然后启动这个应用的入口activity,那在它的界面上调用其他的activity也只是在这个task里面。那如果在多个task*享一个activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个activity是开启google地图的,当按下home键退回到主菜单又启动google地图的应用时,显示的就是刚才的地图,实际上是同一个activity,实际上这就引入了singleinstance。singleinstance模式就是将该activity单独放入一个栈中,这样这个栈中只有这一个activity,不同应用的intent都由这个activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的home键,如果按下了返回键,则无效。
七、activity的跳转
activity跳转,无返回结果
这是最简单的activity跳转方式。从一个activity启动另一个activity,直接startactivity(new intent(当前activity.this, 下一activity.class))。
activity跳转,返回数据/结果
需要返回数据或结果的,则使用startactivityforresult (intent intent, int requestcode),requestcode的值是自定义的,用于识别跳转的目标activity。跳转的目标activity所要做的就是返回数据/结果,setresult(int resultcode)只返回结果不带数据,或者setresult(int resultcode, intent data)两者都返回!而接收返回的数据/结果的处理函数是onactivityresult(int requestcode, int resultcode, intent data),这里的requestcode就是startactivityforresult的requestcode,resultcode就是setresult里面的resultcode,返回的数据在data里面。
** 注意,在setresult后,要调用finish()销毁当前的activity,否则无法返回到原来的activity,就无法执行原来activity的onactivityresult函数,看到当前的activity没反应。
八、实例讲解activity切换
android中每个activity通常描述了一个屏幕上的所有画面(窗口级别的activity除外),因此通常手机屏幕两个界面(准确些说是整个屏幕)之间的切换就涉及到了activity的切换.
假定有两个activity,分别是activity01和activity02,现在activity01页面中有一个按钮,点下之后会切换到activity02.并且在activity切换时,activity01给activity02传递了一个参数. (intent可以在切换activity时使用,且能传递数据.)
怎么做呢?大体思路为:
1.在activity01中设置一个可触发的空间,并添加一个触发器
2.在activity01的触发器添加listener
3.在listener的接口实现中,设置一个intent,让这个intent能够将activity01和activity02绑定起来,并且通过putextra将要传输的值放到intent对象中存储
3.listener接口实现结尾,通过activity01启动调用这个intent对象,通过调用来切换到activity02
4.在activity02中,使用getintent来获取上下文切换中使得自己启动了的那个intent对象实例
5.通过获取到的intent对象实例,使用起getstringextra来获取先前putextra的值.
当然,后面如果对intent更加了解时,就需要按实际情况挑选更合适的存储数据及获取数据的函数了.
以下是实现的演示:
最后附上关键部分代码:
activity01中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
button.setonclicklistener( new button.onclicklistener() { //更准确点应该是view.onclicklistener
public void onclick(view v)
{
/* 新建一个intent对象 */
intent intent = new intent();
intent.putextra("name","leipei");
/* 指定intent要启动的类 */
intent.setclass(activity01.this, activity02.class);
/* 启动一个新的activity */
activity01.this.startactivity(intent);
/* 关闭当前的activity */
activity01. this .finish();
}
});
|
activity02中:
1
2
|
string name=intent.getstringextra( "name" );
textview2.settext( "activity01传过来的值为:" +name);
|
以上就是小编整理的关于activity所涉及到的知识点,希望对大家的学习有所帮助,还有许多遗漏的知识,小编会继续完善补充的,希望大家持续关注。