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 定义时,可以在其
(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)一个
c)如
e)当Intent请求中包含并所有的Category与组件中某个IntentFilter的
(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
//
//
//
//
//如果配置了相同action的activity不止一个则会让你选择一个activity(可以设置优先级priority)
//当Intent匹配成功的组件有多个时,显示优先级高的组件,如果优先级相同,显示列表让//用户自己选择,优先级从-1000至1000,并且其中一个必须为负的才有效
intent.setAction("banwxf");//如果多条则,后者覆盖前者。没有意义
intent.addCategory("banwxf");//是action的附加条件,可以有多条该语句,但是只要满足其中的一个就可以
//intent只能包含一个action但是可以有多个category,但至少要有一个category
//
//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); }