目录
2.1 Activity 中 Intent Filter 的匹配过程:
2.2 Intent由以下各个组成部分:Intent分为直接 Intent 和间接 Intent
1. 什么是Intent
Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity,service(服务)和broadcast receiver(广播接收器)之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。
Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
2. Intent 的相关属性
2.1 Activity 中 Intent Filter 的匹配过程
2.2 Intent由以下各个组成部分:Intent分为直接 Intent 和间接 Intent
2.2.1、component(组件):目的组件
通过组件名称直接查找组件
// 全写:
Intent intent = new Intent();
ComponentName componentName = new ComponentName(this,MainActivity5_1.class);
intent.setComponent(componentName);
// 简写:
Intent intent = new Intent(this,MainActivity5_1.class);
// 显示
startActivity(intent);
2.2.2、Action(动作):用来表现意图的行动
通过Action属性间接查找组件。
通过属性查找组件时需要在配置文件对应的Activity中添加过滤器,并设置命名及分组类别(必须写分组类别)。
当有多个Activity具有相同的命名时,会去询问用户进行选择。除非某个Activity的过滤器设置了priority属性且值为负数。
// 全写
Intent intent = new Intent();
intent.setAction("com.jiinng.action.MY_ACTION");
// 简写
Intent intent = new Intent("com.jiinng.action.MY_ACTION");
// 显示
startActivity(intent);
<!-- 对应Activity的过滤器 -->
<intent-filter>
<action android:name="com.jiinng.action.MY_ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
2.2.3、category(类别):用来表现动作的类别
通过category查找与action大致相同
intent.addCategory("android.intent.category.DEFAULT");
2.2.4、data(数据):表示与动作要操纵的数据
Data属性是Android要访问的数据,和action和Category声明方式相同,也是在<intent-filter>中。例如:
<activity android:name="FourthActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<data android:scheme="http" android:path="www.google.com"/>
</intent-filter>
</activity>
若多个组件匹配成功显示优先级高的,相同显示列表。
一般配合action使用(此组合是最常用的方法)。当action的属性值为android.intent.action.VIEW时,则会打开相应的网站。
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri data = Uri.parse("http://www.google.com");
intent.setData(data);
startActivity(intent);
2.2.5、type(数据类型):对于data范例的描写,表示数据的类型
不能单独设置type
// intent.setData(data); // 会把type设置为null
// intent.setType(); // 会把data设置为null
// 要使用data和type,必须使用以下方法,匹配时必须两者同时匹配才能通过
intent.setDataAndType(data,"text/html");
2.2.6、extras(扩展信息):扩展信息
与Activity中的相似。
2.2.7、Flags(标志位):期望这个意图的启动模式
一个程序启动后系统会为这个程序分配一个task供其使用,另外同一个task里面可以拥有不同应用程序的activity。那么,同一个程序能不能拥有多个task?这就涉及到加载activity的四种模式:standard、singleTop、singleTask、singlelnstance。
可以在AndroidManifest.xml中ctivity标签的属性launchMode中设置该activity的加载模式。简述下这四种模式的区别:
standard模式 | 默认的模式,以这种模式加载必定会构造一个新的 Activity 实例放到目标task中的 activity 栈顶,不管当前task的栈顶是什么情况。 |
singleTop模式 | 这种模式与 standard 模式类似,区别在于加载 activity 会多个判断步骤。判断需要加载的新 activity 与当前 task 栈顶的 activity 是不是同一个,相同的话就不再构造新的 activity ,并调用这个 activity i的newInstance()方法,不相同就还是会构造新的 activity 放到秩顶。 |
singleTask模式 | 这种模式下,会 创建一个新的 task 来加载这个 activity,并且这个 task 中只允许存在一个 Activity 的一个实例(以后可以加载其他activity 的实例)。如果 activity 之前已经存在,会把该 Activity 之上的所有 Activity 清除,显示当前Activity。 |
singlelnstance模式 | 新创建一个任务栈,放入新创建的Activity,该任务栈只允许存在一个Activity实例,如果已存在,那么会切换到该任务栈。 |
3. Intent 的应用
3.1 显示网页
Uri uri=Uri.parse("http://www.baidu.com");
Intent it=new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);
3.2 拨打电话
如果直接拨打需在配置文件中添加
<uses-permission android:name="android.permission.CALL_PHONE" />
Uri uri=Uri.parse("tel:xxxxxx");
// 1. 打开拨号面板
Intent it=new Intent(Intent.ACTION_DIAL,uri);
// 2. 直接拨打电话
Intent it=new Intent(Intent.ACTION_DIAL,uri);
startActivitylit);
3.3 调用发送短信程序
Intent it=new Intent(Intent. ACTION_VIEW);
it. putExtra("sms_body","The SMS text");
it. setType("vnd.android-dir/mms-sms"); // 此句固定写法
startActivity(it);
3.4 发送短信
Uri uri=Uri. parse("smsto:0800000123");
Intent it = new Intentl(Intent.ACTION_SENDTO,uri);
it. putExtra("sms_body","The SMS text");
startActivitylit);
3.5 播放多媒体
Uri uri=Uri.parse("file:///sdcard/spng.mp3");
Intent it=new Intent(Intent.ACTION_VIEW,uri);
// it.addFlags(it.FLAG_ACTIVITY_NEW_TASK);// 非必须选项
it.setDataAndType(uri,"audio/mp3");
context.startActivity(it);
3.6 uninstall 程序
Uri uri=Uri.parse("package:com.vince.hello"); // 卸载的包名:package:com.vince.hello
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);
3.7 安装 apk
Uri uri=Uri. fromFile(file);
Intent intent =new Intent(Intent. ACTION_VIEW);
intent. setDataAnd Type(uri,"application/vnd. android. package-archive"); // type是固定的
startActivity(intent);