Intent及intent-filter总结与使用
2016-10-04 11:52
204 查看
Android中提供了Intent机制来协助应用间的交互与通讯, Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意图”。
Intent是一种运行时绑定(runtimebinding)机制,它能在程序运行的过程中连接两个不同的组件。
1、使用startActivity() 或startActivityForResult(),传入一个intent来启动一个activity。setResult(),传入一个intent来从activity中返回结果。
public voidback(View view) {
Intentintent = getIntent();
// Intentinten = new Intent();
intent.putExtra("message","这是回传");
setResult(101,intent);
finish();//必须销毁
}
2、将intent对象传给startService()来启动一个service或者传消息给一个运行的service。将intent对象传给bindService()来绑定一个service。
3、将intent对象传给sendBroadcast(), sendOrderedBroadcast(),或者sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。
intent中包含的属性:Component,Action,Category,Date,Type,Extra,Flag这7个属性
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
分为显式意图和隐式意图:
一、显式意图:明确指定Intent的目标组件。 一般用于同一应用程序之间的跳转。
1)Component :意图所要启动的组件
ComponentName有三种构造器:
(1)ComponentName(Context,Class)
(2)ComponentName(Context,String)
(3)ComponentName(Stringpackage,String clz)
其中用来表示类名的字符串必须使用全类名.
包名只是用来区分android应用程序的。
也可以启动不同android应用程序的activity
intent.setComponent(component);
2)intent.setClass()
3)new Intent(Context,Class)
缺点:不能调用其他应用中的Activity。
/*****************************显示意图 *******************************/
//显式意图,即指定了要跳转的组件
//Intent intent = new Intent();
//ComponentName component = new ComponentName(this,
//MyActivity.class);//①
//intent.setClass(this, MyActivity.class);//②
//intent.setComponent(component);
//Intent i = new Intent(this, MyActivity.class);//③
//startActivity(intent);
二、隐式意图:没有明确指定组件名的Intent为隐式意图,
Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般用于不同应用程序之间的跳转。
Android系统使用IntentFilter来寻找与隐式相关的组件。
(1)Action动作
用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。在AndroidManifest.xml 的Activity 定义时,可以在其 <intent-filter >节点指定一个 Action列表用于标识 Activity 所能接受的“动作”。
(2)Category
为Action增加额外的附加条件(用来表现动作的类别),一般将action和category结合使用
Intent:只能包含一个Action,可以有多个Category在java代码中有多个action后者会覆盖前者,因此是没意义的
Activity:可以配置多种Action,可以配置多个Category,类别越多,动作越具体,意图越明确
a)每一个通过 startActivity() 方法发出的隐式Intent都至少有一个 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一个隐式Intent的 Activity 都应该包括"android.intent.category.DEFAULT"category,不然将导致 Intent 匹配失败
b)一个<intent-filter>至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。若Intent请求的Action和<intent-filter>中的某一个<action>匹配,那么该Intent就通过这条<intent-filter>的动作测试。
c)如<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这个<intent-filter>匹配
e)当Intent请求中包含并所有的Category与组件中某个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试
(3)Data 向Action属性提供操作的数据,Data属性接受一个Uri对象。
URI 通用资源标识符:在网络中或者本地如何找到一个唯一的资源的标识符
URL 统一资源定位符:把一个地址作为唯一的资源的标识符,
URN 统一资源命名符
格式:协议://地址:端口号/资源路径
一般情况下Activty可以有多个action,多个category,但是只能有一个data.
并且配置data之前需要先有action.
(4)Type 为Action属性提供操作的数据的数据类型
注意:在java代码中
1)Intent中不能单独设置Type,需要结合Action和Data一起使用
2)默认Data与Type不可以同时使用,后设置的属性会覆盖前设置的属性,可以使用setDataAndType()同时设置两个属性。
代码及常用action用法:
/***************************** 隐式意图 ************************************/
Intentintent = new Intent();
//是actvity的动作,配合意图过滤器AndroidManifest.xml
//<intent-filter>
//<action android:name="banwxf" />//可以有多个
//<category android:name="android.intent.category.DEFAULT" />//必须存在
//</intent-filter>
//如果配置了相同action的activity不止一个则会让你选择一个activity(可以设置优先级priority)
//当Intent匹配成功的组件有多个时,显示优先级高的组件,如果优先级相同,显示列表让//用户自己选择,优先级从-1000至1000,并且其中一个必须为负的才有效
intent.setAction("banwxf");//如果多条则,后者覆盖前者。没有意义
intent.addCategory("banwxf");//是action的附加条件,可以有多条该语句,但是只要满足其中的一个就可以
//intent只能包含一个action但是可以有多个category,但至少要有一个category
//<data android:scheme="banwxf"
//android:host="127.0.0.1"
//android:port="8888"
//android:path="/sa"/>
//data属性不需要写全,只能有一个data。用之前必须要有action
//如何将字符串转换为uri对象
Uriuri = Uri.parse("banwxf://127.0.0.1:8888/sa");// 此uri一定需要写全"scheme://host:port:path"
//intent.setData(uri);
//intent.setType("***/***");
//注意:data和type不能分开设置
intent.setDataAndType(uri,"abc/def");
startActivity(intent);
}
publicvoid myWeb(View view) {
//通过action掉用系统程序
Intentintent = new Intent();
intent.setAction(Intent.ACTION_VIEW);//ACTION_VIEW是一个引用,显示指定的对象
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
//播放音乐
publicvoid myMusic(View view) {
//通过action掉用系统程序
Intentintent = new Intent();
intent.setAction(Intent.ACTION_VIEW);//ACTION_VIEW是一个引用,显示指定的对象
//intent.setData(Uri.parse("file:///sdcard/muc.mp3"));
intent.setDataAndType(Uri.parse("file:///sdcard/muc.mp3"),"audio/mp3");
startActivity(intent);
}
//打电话
publicvoid call(View view) {
//通过action掉用系统程序
Intentintent = new Intent();
//intent.setAction(Intent.ACTION_CALL);//直接拨号
intent.setAction(Intent.ACTION_DIAL);//跳转到拨号界面
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
//写在程序
publicvoid delete(View view) {
//通过action掉用系统程序
Intentintent = new Intent();
intent.setAction(Intent.ACTION_DELETE);//删除程序
intent.setData(Uri.parse("package:com.example.mycompont"));//指定要卸载的应用
startActivity(intent);
}
Intent是一种运行时绑定(runtimebinding)机制,它能在程序运行的过程中连接两个不同的组件。
1、使用startActivity() 或startActivityForResult(),传入一个intent来启动一个activity。setResult(),传入一个intent来从activity中返回结果。
public voidback(View view) {
Intentintent = getIntent();
// Intentinten = new Intent();
intent.putExtra("message","这是回传");
setResult(101,intent);
finish();//必须销毁
}
2、将intent对象传给startService()来启动一个service或者传消息给一个运行的service。将intent对象传给bindService()来绑定一个service。
3、将intent对象传给sendBroadcast(), sendOrderedBroadcast(),或者sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。
intent中包含的属性:Component,Action,Category,Date,Type,Extra,Flag这7个属性
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
分为显式意图和隐式意图:
一、显式意图:明确指定Intent的目标组件。 一般用于同一应用程序之间的跳转。
1)Component :意图所要启动的组件
ComponentName有三种构造器:
(1)ComponentName(Context,Class)
(2)ComponentName(Context,String)
(3)ComponentName(Stringpackage,String clz)
其中用来表示类名的字符串必须使用全类名.
包名只是用来区分android应用程序的。
也可以启动不同android应用程序的activity
intent.setComponent(component);
2)intent.setClass()
3)new Intent(Context,Class)
缺点:不能调用其他应用中的Activity。
/*****************************显示意图 *******************************/
//显式意图,即指定了要跳转的组件
//Intent intent = new Intent();
//ComponentName component = new ComponentName(this,
//MyActivity.class);//①
//intent.setClass(this, MyActivity.class);//②
//intent.setComponent(component);
//Intent i = new Intent(this, MyActivity.class);//③
//startActivity(intent);
二、隐式意图:没有明确指定组件名的Intent为隐式意图,
Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般用于不同应用程序之间的跳转。
Android系统使用IntentFilter来寻找与隐式相关的组件。
(1)Action动作
用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。在AndroidManifest.xml 的Activity 定义时,可以在其 <intent-filter >节点指定一个 Action列表用于标识 Activity 所能接受的“动作”。
(2)Category
为Action增加额外的附加条件(用来表现动作的类别),一般将action和category结合使用
Intent:只能包含一个Action,可以有多个Category在java代码中有多个action后者会覆盖前者,因此是没意义的
Activity:可以配置多种Action,可以配置多个Category,类别越多,动作越具体,意图越明确
a)每一个通过 startActivity() 方法发出的隐式Intent都至少有一个 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一个隐式Intent的 Activity 都应该包括"android.intent.category.DEFAULT"category,不然将导致 Intent 匹配失败
b)一个<intent-filter>至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。若Intent请求的Action和<intent-filter>中的某一个<action>匹配,那么该Intent就通过这条<intent-filter>的动作测试。
c)如<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这个<intent-filter>匹配
e)当Intent请求中包含并所有的Category与组件中某个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试
(3)Data 向Action属性提供操作的数据,Data属性接受一个Uri对象。
URI 通用资源标识符:在网络中或者本地如何找到一个唯一的资源的标识符
URL 统一资源定位符:把一个地址作为唯一的资源的标识符,
URN 统一资源命名符
格式:协议://地址:端口号/资源路径
一般情况下Activty可以有多个action,多个category,但是只能有一个data.
并且配置data之前需要先有action.
(4)Type 为Action属性提供操作的数据的数据类型
注意:在java代码中
1)Intent中不能单独设置Type,需要结合Action和Data一起使用
2)默认Data与Type不可以同时使用,后设置的属性会覆盖前设置的属性,可以使用setDataAndType()同时设置两个属性。
代码及常用action用法:
/***************************** 隐式意图 ************************************/
Intentintent = new Intent();
//是actvity的动作,配合意图过滤器AndroidManifest.xml
//<intent-filter>
//<action android:name="banwxf" />//可以有多个
//<category android:name="android.intent.category.DEFAULT" />//必须存在
//</intent-filter>
//如果配置了相同action的activity不止一个则会让你选择一个activity(可以设置优先级priority)
//当Intent匹配成功的组件有多个时,显示优先级高的组件,如果优先级相同,显示列表让//用户自己选择,优先级从-1000至1000,并且其中一个必须为负的才有效
intent.setAction("banwxf");//如果多条则,后者覆盖前者。没有意义
intent.addCategory("banwxf");//是action的附加条件,可以有多条该语句,但是只要满足其中的一个就可以
//intent只能包含一个action但是可以有多个category,但至少要有一个category
//<data android:scheme="banwxf"
//android:host="127.0.0.1"
//android:port="8888"
//android:path="/sa"/>
//data属性不需要写全,只能有一个data。用之前必须要有action
//如何将字符串转换为uri对象
Uriuri = Uri.parse("banwxf://127.0.0.1:8888/sa");// 此uri一定需要写全"scheme://host:port:path"
//intent.setData(uri);
//intent.setType("***/***");
//注意:data和type不能分开设置
intent.setDataAndType(uri,"abc/def");
startActivity(intent);
}
publicvoid myWeb(View view) {
//通过action掉用系统程序
Intentintent = new Intent();
intent.setAction(Intent.ACTION_VIEW);//ACTION_VIEW是一个引用,显示指定的对象
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
//播放音乐
publicvoid myMusic(View view) {
//通过action掉用系统程序
Intentintent = new Intent();
intent.setAction(Intent.ACTION_VIEW);//ACTION_VIEW是一个引用,显示指定的对象
//intent.setData(Uri.parse("file:///sdcard/muc.mp3"));
intent.setDataAndType(Uri.parse("file:///sdcard/muc.mp3"),"audio/mp3");
startActivity(intent);
}
//打电话
publicvoid call(View view) {
//通过action掉用系统程序
Intentintent = new Intent();
//intent.setAction(Intent.ACTION_CALL);//直接拨号
intent.setAction(Intent.ACTION_DIAL);//跳转到拨号界面
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
//写在程序
publicvoid delete(View view) {
//通过action掉用系统程序
Intentintent = new Intent();
intent.setAction(Intent.ACTION_DELETE);//删除程序
intent.setData(Uri.parse("package:com.example.mycompont"));//指定要卸载的应用
startActivity(intent);
}
相关文章推荐
- 使用Intent 的用法startActivity,使用intent-filter描述Activity的特征,使用setActiony设置action
- Android 系统应用调用,intent的使用总结
- 对于TabHost中setContent()使用Intent的一点总结
- Intent-filter的使用
- 【Android 开发教程】使用Intent-Filter
- tag, dialog,popupwindow intent-filter的使用
- android IntentFilter 使用之 data过滤
- Android 系统应用调用,intent的使用总结
- Android开发中Intent的使用总结
- Intent 使用总结
- Android 系统应用调用,intent的使用总结帖(转自android专区)
- intent方法使用总结
- 使用IntentFilter的拨号程序
- 【android中级】Android 系统应用调用,intent的使用总结
- Android的Intent与Intent Filter使用
- 使用Intent filter 匹配相应的Activity or services
- Android 系统应用调用,intent的使用总结帖
- Android Intent Filter简单使用
- 使用Intent和IntentFilter进行通信
- Intent使用总结(传递,打开Activity方式)