一、Activity理解
1、定义:
直译为活动,是Android定义四大应用组件之一,也是最重要的用的最多的;
用来提供一个能让用户操作并与之交互的界面
一个应用有多个界面也就是包含多个Activity
打电话、发短信、拍照、发邮件等功能都是通过Activity来做的
2、Activity生命周期
3、配置Activity
Android应用要求所有应用程序的组件(Activity、Service、ContentProvider、BroadcastReceiver)都必须进行显示的配置,只要为<application.../>元素添加<Activity.../>子元素即可配置Activity;通常需要指定如下几个属性:
name:指定该Activity的实现类的类名;
icon:指定该Activity对应的图标;
label:指定该Activity的标签;
exported:指定该Activity是否允许被其他应用程序调用(true允许被调用);
launchMode:指定该Activity的加载模式;
此外,通常还需要指定一个或多个<intent-filter.../>元素,该元素用于指定该Activity可响应的Intent(意图)。
二、启动、关闭Activity
1、启动Activity
一个Android应用程序通常都会包含很多Activity,但只有一个Activity会作为程序的入口;当应用程序运行时将会自动启动并执行该Activity,其他Activity通常由入口Activity启动或者由入口Activity启动的Activity启动。
Activity启动其他Activity有如下两个方法:
startActivity(Intent intent); 启动其他Activity;
startActivityForResult(Intent intent,int requestCode); 以指定的请求码启动Activity,而且程序将会获取新启动的Activity返回的结果(通过重写onActivityResult(...)方法来获取)。
2、关闭Activity
finish() 结束当前Activity;
finishActivity(int requestCode) 结束以startActivityForResult(Intent intent,int requestCode)方法启动的Activity。
三、使用Bundle在Activity之间交换数据
当一个Activity启动另一个Activity时常常会有一些数据需要传过去,这就要用到Intent,只要将需要交换数据放入Intent中即可。Intent提供了多个重载的方法来“携带”额外的数据:
putExtras(Bundle data) 向Intent中放入需要“携带”的数据包;
Bundle getExtras() 取出Intent中所携带的数据包;
putExtra(String name,Xxx value) 向Intent中按键值对的形式存入数据;
getXxxExtra(String name) 从Intent中按key取出指定类型的数据;
注意:使用putExtra(String name,Xxx value)方法时,如果该Intent对象中已经携带了Bundle对象,则该方法直接向Intent所携带的Bundle中存入数据;如果还没有携带Bundle对象,该方法会先为Intent创建一个Bundle,再向Bundle中存入数据。
上述方法中的Bundle就是一个简单的数据携带包,该Bundle对象包含了多个方法来存入/取出数据:
putXxx(String key,Xxx data) 向Bundle中放入Int、Long等各种类型的数据;
putSerializable(String key,Serializable data) 向Bundle中放入一个可序列化的对象;
getXxx(String key) 从Bundle中取出Int、Long等各种类型的数据;
getSerializable(String key,Serializable data) 从Bundle中取出一个可序列化的对象;
在练习的过程中出现找不到Activity对应的实现类,在配置文件中配置name属性时连同包名一起写上即可,如下:
代码片段:
四、启动其他Activity并返回结果
获取被启动Activity所返回的结果:
.当前Activity需要重写onActivityResult(int requestCode,int resultCode,Intent intent),当被启动的Activity返回结果时,该方法将会被触发。
.被启动的Activity需要调用setResult()方法设置处理结果。
五、Activity的回调机制
回调机制的第一种是现实方式是典型的命令者模式。
六、Activity生命周期
当Activity处于android应用中运行时,它的活动状态由Android以Activity栈的形式管理,当前活动的Activity位于栈顶;随着不同应用的运行,每个Activity都有可能从活动状态转入非活动状态。
归纳起来分为四种状态:
运行状态:当前Activity位于前台,用户可见,可以获得焦点(可见可操作);
暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点(可见但不可操作);
停止状态:该Activity不可见,失去焦点(不可见,但对象存在);
销毁状态:该Activity结束或Activity所在的进程被结束(对象不存在)。
七、Activity加载模式
为什么要为Activity指定加载模式?
Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用的入口Activity(即,<intent-filter>中配置为MAIN和LAUNCHER的Activity);只有最上面的任务栈的栈顶的Activity才能显示在窗口中。
Activity的加载模式就是负责管理实例化、加载Activity的方式,并可以控制Activity与Task之间的加载关系。
1、standard:标准模式(默认加载模式)
每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例 ,并将该Activity添加到当前Task栈中(这种模式不会启动新的Task,新的Activity将会被添加到原有的Task中); 不同Activity实例的hashCode值有差异,但它们所在的Task ID(可以通过调用Activity的getTaskId()来获取它所在的Task的ID)总是相同的--表明这种加载模式不会使用全新的Task; 当用户单击手机的返回键时系统会逐一从Activity栈顶删除Activity实例。
2、singleTop:Task栈顶单例模式
当目标Activity已经位于栈顶,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例;
当目标Activity存在但不位于栈顶,系统会重新创建目标Activity的实例并将它加载到栈顶;
3、singleTask:Task内单例模式
使用这种加载模式的Activity在同一个Task内只有一个实例;
.如果要启动的目标Activity不存在,系统会将会创建目标Activity的实例并将它加载到栈顶;
.当目标Activity已经位于栈顶,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例;
.当目标Activity存在但不位于栈顶,系统将会把位于该Activity上面的所有Activity移除Task栈,从而使得当目标Activity转入栈顶。
4、singleInstance:全局单例模式
在这种加载模式下,系统保证无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来加载该Activity实例。
.如果要启动的目标Activity不存在,系统会将会创建一个全新的Task,在创建目标Activity的实例,并将它加入到新的Task栈顶。
.当目标Activity存在,无论位于哪个应用程序中、位于哪个Task中,系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。
注意:使用这种加载模式加载的Activity实例总是位于Task栈顶,且该Task只包含该Activity。
八、Activity与Servlet
1、Servlet
狭义:是一个interface,我们的Servlet类都必须实现此接口
广义:是一种服务器端组件,,用来处理客户端/浏览器提交的请求并返回一个响应界面。
九、组件
必须实现特定的接口或继承特定的类
需要在配置文件中配置其全类名
它的对象不是通过new来创建,而是系统自动创建的
它的对象有一定的生命周期,它的类中有对应的生命周期回调方法
十、面试问题:
1、哪些地方用到了反射
1>、配置文件中配置全类名
2>、布局文件定义标签
3>、显示意图 Intent(Context context,Class c)