Intent详解
1、什么是Intent
Android提供了Intent机制来协助应用建的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity,service和broadcast receiver之间的交互,intent这个词本意是“目的、意向、意图”。
Intent是一种运行时绑定(runtime binding)机制,他能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或意愿,Android会根据意愿的内容选择适当的组件来响应。
对于像这三种组件发送intent有不同的机制:
使用Context.startActivity()或Activity.startActivityForResult(),传入一个intent来启动一个activity。
使用Activity.setResult(),传入一个intent来从activity中返回结果
将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。
将intent对象传给Context.bindService()来绑定一个service。
将intent对象传给Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则他们被传给broadcast receiver。
2、Intent的相关属性
intent由一下各个组成部分:
2.1component(组件):目的组件
Intent intent = new Intent(); ComponentName componentName = new ComponentName(this,PhoneNumberListActivity.class); intent.setComponent(componentName);
2.2Action(动作) :用来表现意图的行动
Action是一个用户定义的字符串,用于描述一个Android应用程序组件,一个Intent Filter可以包含多个Action。在AndroidManifest.xml的Activity定义时可以在其<intent-filter>节点指定一个Action列表,用于标识Activity所能接受的“动作”。
//需要在AndroidManifest.xml中添加intent-filter,为Activity时,必须加上category属性 <activity android:name=".PhoneNumberListActivity"> <intent-filter> <action android:name="action_MY_ACTION"></action> <category android:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> //代码 //间接法(通过Action属性) Intent intent = new Intent(); intent.setAction("action_MY_ACTION"); startActivity(intent);
如果有多个符合条件,则出现界面自己选择,可以设置优先级,android:priority="2",但是程序中必须有一个优先级为负数才能生效。
<activity android:name=".WelcomeActivity"> <intent-filter android:priority="-1"> <action android:name="action_MY_ACTION"></action> <category android:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> <activity android:name=".PhoneNumberListActivity"> <intent-filter android:priority="1"> <action android:name="action_MY_ACTION"></action> <category android:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity>
2.3category(类别):用来表现动作的类别
<activity android:name=".PhoneNumberListActivity"> <intent-filter android:priority="1"> <action android:name="action_MY_ACTION"></action> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="category.MY_CATEGORY"></category> </intent-filter> </activity> //间接法(通过Action属性) Intent intent = new Intent(); intent.setAction("action_MY_ACTION"); //添加类别 //在Activity的清单文件配置中,必须使用默认的类别android.intent.category.DEFAULT intent.addCategory("category.MY_CATEGORY"); startActivity(intent);
2.4data(数据): 表示与动作要操纵的数据
Data属性是Android要访问的数据,和action和category声明方式相同,也是在<intent-filter>中,多个组件匹配成功优先显示优先高的,优先级相同则显示列表。
<activity android:name=".PhoneNumberListActivity"> <intent-filter android:priority="1"> <action android:name="action_MY_ACTION"></action> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="category.MY_CATEGORY"></category> <data android:host="www.baidu.com" android:scheme="http"></data> </intent-filter> </activity> //间接法(通过Action属性) Intent intent = new Intent(); intent.setAction("action_MY_ACTION"); //data属性,一般与action配合使用 Uri data = Uri.parse("http://www.baidu.com"); intent.setData(data); startActivity(intent);
2.5type(数据类型):对于data范例的描写
如果Intent对象中既包含Uri又包含Type,那么,在<intent-filter>中必须二者都包含才能通过测试
Type属性则用于明确指定Data属性的数据类型或MIME类型,但是通常来说,当intent不指定data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。
//data属性,type Uri data = Uri.parse("http://www.baidu.com"); /** * intent.setData(data);//会把type设置为null * intent.setType(); //会把data设置为null * 要是用data与type,必须使用以下方法 */ intent.setDataAndType(data,"text/html"); startActivity(intent);
2.6extras(扩展信息):扩展信息
2.7Flags(标志位):期望这个意图的运行模式
Activity的四种模式:standard、singletop、singleTask、singleInstance,可以在AndroidManifest.xml中activity标签的属性launchMode中设置该activity的加载模式。
/** * Activity的四种启动模式: * standard:默认的模式,每次启动会新创建一个Activity对象 * singleTop:在当前任务栈中,判断站定是否为当前的Activity,如果是,则直接使用,不是则创建新的Activity放入栈顶 * singleTask:在当前任务栈中,判断站里是否存在Activity,如果不存在则创建新的Activity入栈, * 如果存在则会把该Activity清除出栈,显示当前Activity * singleInstance:新创建一个任务栈,放入新创建的Activity,该任务栈只允许存在一个Activity实例 */
也可以在代码中设置Activity的启动模式
Intent intent = new Intent(this, PhoneNumberListActivity.class); //设置Activity的启动模式 /** * Intent.FLAG_ACTIVITY_NEW_TASK:在新的任务栈中启动Activity */ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
Intent分为直接Intent和间接Intent
3、Intent应用
//显示网页 Uri uri = Uri.parse("http://www.baidu.com"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent);
//拨打电话,调用拨号程序,打开拨号面板 Uri uri = Uri.parse("tel:123456789"); Intent intent = new Intent(Intent.ACTION_DIAL,uri); startActivity(intent); //拨打电话,直接拨号 Uri uri = Uri.parse("tel:123456789"); Intent intent = new Intent(Intent.ACTION_CALL,uri); startActivity(intent); //注意:要是用这个必须在配置文件中加入 <uses-permission android:name="android.permission.CALL_PHONE" />
//调用发送短信的界面 Intent intent = new Intent(Intent.ACTION_VIEW); intent.putExtra("sms_body","The SMS text"); intent.setType("vnd.android-dir/mms-sms"); startActivity(intent); //发送短信 Uri uri = Uri.parse("smsto:0800000123"); Intent intent = new Intent(Intent.ACTION_SENDTO,uri); intent.putExtra("sms_body","The SMS text"); startActivity(intent);
//播放多媒体 Uri uri = Uri.parse("file:///sdcard/song.mp3"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK);//非必选项 intent.setDataAndType(uri,"audio/ma3"); startActivity(intent); //卸载程序 Uri uri = Uri.parse("package:包名"); Intent intent = new Intent(Intent.ACTION_DELETE,uri); startActivity(intent);
//安装apk Uri uri = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri,"application/vnd.android.package-archive"); startActivity(intent);