- 什么是Intent
Android中提供了Intent机制来协助应用间的交互与通讯。不仅可用于应用程序之间,也可用于应用程序内部的activity,service和broadcast receiver之间的交互。
- Intent各个组成部件
1、component(组件):目的组件
2、Action(动作):用来表现意图的行动
3、category(类别):用来表现动作的类别
4、data(数据):表示与动作要操纵的数据
5、type(数据类型):对于data范例的描写
6、extras(扩展信息):扩展信息
7、Flags(标志位):期望这个意图的运行模式
Intent分为直接Intent(直接指定组件的名称)和间接Intent
直接查找法(通过组件名称)
public void componentClick(View v){
Intent intent=new Intent();
ComponentName componentName=new ComponentName(this,Main2Activity.class);
intent.setComponent(componentName);
}
间接查找法(使用action属性和category属性)
public void actionClick(View v){
Intent intent=new Intent();
intent.setAction("com.example.action.SEE"); //setAction(一个自定义的动作)
intent.addCategory("com.example.category.SEECATEGORY");//匹配一个类别
startActivity(intent);
}
priority优先级正数为同一优先级,只对负数起作用。自定义动作后要定义一个category(类别)。
当两个优先级相同时,又用户做选择要使用哪个Activity
使用间接法(data属性与action属性配合使用)
public void dataClick(View v){
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri data= Uri.parse("http://www.baidu.com");
intent.setData(data);
startActivity(intent);
}
data与action组合使用是最常见的使用方法。
如果要同时使用data和type,必须使用一下方法,匹配时必须两者同时匹配才能通过
intent.setDataAndType(data,"text/html");
<data android:scheme="http" android:host="www.baidu.com" android:mimeType="text/html"></data>
- 加载activity的四种模式
standard模式:默认模式,以这种模式加载必定会构造一个新的Activity实例放到目标Task的activity栈顶,不管当前task的栈顶是什么情况。
singleTop:这种模式与standard模式类似,区别在于加载activity会多个判断步骤。判断需要加载的新activity与当前task栈顶的activity是不是同一个,相同的话就不再构造新的activity,并调用这个activity的newInstance()方法,不相同就还是会构造新的activity放到栈顶。
singleTask:这种模式下,会创建一个新的task来加载这个activity,并且这个task中只允许存在一个Activity的一个实例(以后可以加载其他Activity的实例)。
singleInstance:这种模式下,会创建一个新的task并且这个task中只能存在一个需要加载的这个Activity实例,即除了这个activity之外,不允许其他activity。
可以在清单文件中activity的launchMode中设置该activity的加载模式
图解standard模式
点击一次ActivityA按钮,会重新创建一个ActivityA进入栈,点击ActivityB按钮会创建一个ActivityB进入栈,所以是不断的重新创建Activity。
图解singleTop模式
修改了Activity的launchMode为singleTop
当此时的Activity为ActivityB时,即栈顶为ActivityB,点击按钮不会创建一个新的ActivityB出来,但是,如果是一下情况
点击ActivityB按钮,不会去调用下面的B,而是重新创建一个ActivityB放入栈顶,如图
图解singleTask模式
修改ActivityB的launchMode为singleTask,当这种情况下,点击ActivityB按钮,发现栈内已经有ActivityB时,会把ActivityB之上的Activity清除出栈。
图解singleInstance模式
修改ActivityB的launchMode为singleInstance,此时点击ActivityB按钮是,会新建一个Task,如图,
此时显示的是ActivityB,点击ActivityA按钮后,会返回之前的task并创建一个ActivityA,过程如下
点击返回,会先返回任务栈里的所以Activity,再切换到ActivityB,再返回就退出。