移动平台应用软件开发 Intent( 意图 ) 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年
为什么引入 Intent Android 应 用程序的四 大组件 Activities Services Content Providers Broadcast Receivers 解决 Android 应用的各项组件之间的通讯 Activity Service Intent Broadcast Receiver Content Provider
Intent 的工作过程 l Intent 中包含对其他组件的意图描述信息, 如要执 行的动作 涉及的数据等 l Android 根据 Intent 描述, 找到相应的组件, 并将 Inten t 传递给调 用组件, 完成组件的调 用 l Intent 在这 里起到 一个媒介的作 用, 专 门提供组件互相调 用的相关信息 l Intent 对象主要包含 : 组件名称 动作 数据 类别 附加信息和标志位 6 大部分
Intent 的属性及操作方法 组成属性设置属性方法获取属性方法 动作 Action setaction() getaction() 数据 Data setdata() getdata() 分类 Category addcategory() 类型 Type settype() gettype() 组件 Component setcomponent() setclass() setclassname() 扩展信息 Extra putextra() getcomponent() getxxxextra() 获取不同数据类型的数据, 如 int 类型则使用 getintextra(), 字符串则使用 getstringextra() getextras() 获取 Bundle 包
组件名称 ( Component Name) Component 属性明确指定 Intent 的 目标组件的类名称 显式意图 : 如果 Component 这个属性有指定的话, 将直接使 用它指定的组件 隐式意图 : Component 这个属性没有指定 Android 框架会根据 Intents 中包含的其它属性的信息, 比如 action data/type category 进 行查找, 最终找到 一个与之匹配的 目标组件 // 创建 一个 Intent 对象 Intent intent = new Intent(); // 指定 Intent 对象的 目标组件是 Activity2 intent.setclass(activity1.this, Activity2.class);
动作 (Action) 用于描述 Intent 要完成的动作, 对要执 行的动作进 行 一个简要描述 Intent 类定义了 一系列 Action 属性常量, 用来标识 一套标准动作, 如 ACTION_CALL( 打电话 ) ACTION_EDIT( 编辑 ) 等 ACTION_MAIN Android.Intents.action.MAIN, 这个值在每个 AndroidManifest.xml 文档中都可以看到 它标记当前 Activit y 作为 一个程序的 入 口 自 己可以定义 自 己的 Action
Action 属性常量 Action 常量 ACTION_CALL ACTION_ANSWER ACTION_SEND ACTION_SENDTO ACTION_VIEW ACTION_EDIT ACTION_MAIN ACTION_SYNC ACTION_BATTERY_LOW ACTION_HEADSET_PLUG ACTION_SCREEN_ON ACTION_TIMEZONE_CHAN GED 行为描述打电话, 即直接呼叫 Data 中所带电话号码接听来电由用户指定发送方式进行数据发送操作根据不同的 Data 类型, 通过对应的软件发送数据根据不同的 Data 类型, 通过对应的软件显示数据显示可编辑的数据应用程序的入口同步服务器与移动设备之间的数据警告设备电量低插入或者拔出耳机打开移动设备屏幕移动设备时区发生变化 使用组件 ( 分类 ) Activity Broadcast
Data 属性 Data 属性常量 Data 属性 说明 示例 tel:// 号码数据格式, 后跟电话号码 tel://123 mailto:// 邮件数据格式, 后跟邮件收件人地址 mailto://dh@163.com smsto:// 短息数据格式, 后跟短信接收号码 smsto://123 content:// 内容数据格式, 后跟需要读取的内容 content://contacts/people/1 file:// 文件数据格式, 后跟文件路径 file://sdcard/mymusic.mp3 geo://latitude,longitude 经纬数据格式, 在地图上显示经纬度所指定的位置 geo://180,65 Action 和 Data 一般匹配使 用, 不同的 Action 由不同的 Data 数据指定 Action 属性 Data 属性 描述 ACTION_VIEW content://contacts/people/1 显示 _id 为 1 的联系人信息 ACTION_EDIT content://contacts/people/1 编辑 _id 为 1 的联系人信息 ACTION_VIEW tel:123 显示电话为 123 的联系人信息 ACTION_VIEW http://www.google.com 在浏览器中浏览该网页 ACTION_VIEW file:///sdcard/mymusic.mp3 播放 MP3
Intent i=new Intent(android.content.Intent.ACTION_DIAL,Uri.parse("tel://10086")); startactivity(i); Intent i=new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("content:/ /contacts/people/1")); startactivity(i); Intent i=new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("http:/ /www.ss.pku.edu.cn")); startactivity(i);
Extra 属性 Extra 属性 用于添加 一些附加信息, 例如发送 一个邮件, 就可以通过 Extra 属性来添加主题 (subject) 和内容 (body) 通过使 用 Intent 对象的 putextra() 方法来添加附加信息 将 一个 人的姓名附加到 Intent 对象中, 代码如下所 示 Intent intent = new Intent(); intent.putextra("name","zhangsan"); 通过使 用 Intent 对象的 getxxxextra() 方法可以获取附加信息 例如, 将上 面代码存 入 Intent 对象中的 人名获取出来, 因存 入的是字符串, 所以可以使 用 getstringextra() 方法获取数据 String name=intent.getstringextra("name");
Activity 栈 l 某 一个时刻只有 一个 Activity 处在栈顶 l Activity 创建, 压栈, 用户可交互 l Back, 退栈 l Activity 销毁, 退栈 失去焦点 Activity1(Active 状态 ) Activity2(Pause/Stop/Kill 状态 ) Activity3(Pause/Stop/Kill 状态 ) Activity4(Pause/Stop/Kill 状态 ) 重新激活 Activity 的状态与它在栈中的位置关系
Activity 之间使用 Intent
启动 一个新的 Activity, 实现多个 Activity 间的切换定义并实例化 一个 Intent 调 用 startactivity() 方法启动新的 Activity button0=(button)findviewbyid(r.id.button0); button0.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { // TODO Auto-generated method stub Intent intent=new Intent(Activity.this,Other_Activity_Test.class); startactivity(intent); } });
Intent 传递数据 getintent()----- 获取 一个 Intent; putextra()------ 发送 Intent 消息内容 getextra()--- 得到 Intent 消息内容 Intent 发起端 Intent intent = new Intent(Activity.this,OtherActivity.class); intent.putextra( name, zhang ); intent.putextra( age,22); startactivity(intent); Intent 接收端 Intent intent = this.getintent(); String name = intent.getstringextra( name ); int age = intent.getintextra( age,0);
Q&A 本讲结束!