没有合适的资源?快使用搜索试试~ 我知道了~
第六章_Android进程间通信.pdf
需积分: 10 7 下载量 190 浏览量
2011-04-06
15:15:37
上传
评论
收藏 557KB PDF 举报
温馨提示
试读
13页
详细的介绍Android进程间通信,对于intent,Activity如何使用非常详尽
资源推荐
资源详情
资源评论
第六章 Android 进程间通信
这篇文章讲介绍 Android 框架层提供的一些通信机制 Broadcast、Intent、Content Provider,
主要用于应用程序开发时提供跨进程或应用程序内部的通信,优点是接口简单,使用方便,
但使用时可能有一些局限性,比如性能和返回数据。这些机制底层可能依赖 Binder、ASH 机
制,对于库和框架层的开发人员来说也会更多的用到底层的机制,这些内容会放在另一篇
《Android 内核驱动》中介绍。
6.1 Broadcast Receiver
什么是 Broadcast
在 android 中,通过广播(broadcast)可以通知其他广播接受者某个事件发生了。比如电源
不足,信号不好等。首先,我们看一个简单的 demo,该 demo 实现了一个自定义 broadcast。
发送端这个 activity 中创建了一个按钮,当按钮被按下的时候通过 sendBroadcast()发送一个
broadcast。
public class BroadcastTest extends Activity {
public static final String NEW_LIFEFROM_DETECTED =
“com.android.broadcasttest.NEW_LIFEFROM”;
public void onCreate(Bundle savedInstanceState) {
……
Button btn0 = (Button)findViewById(R.id.btn0);
btn0.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent it = new Intent(NEW_LIFEFROM_DETECTED);
sendBroadcast(it);
}
});
}
……
}
接收端在 onReceive()中实现了当接收到 broadcast 所做的动作。
Public class MyBroadcastReceiver extends BroadcastReceiver {
……
Public void onReceive(Context context, Intene intent){
// TODO
}
……
}
在 receiver 的 action 中定义了该 receiver 能够接受的广播,Manifest.xml 定义部分:
<receiver android:name=”.MyBroadcastReceiver”>
<intent-filter>
<action android:name=”com.android.broadcasttest.NEW_LIFEFROM” />
</intent-filter>
</receiver>
Android 中是如何实现 Broadcast 机制
Broadcast 机制是基于一种注册方式的,Broadcast Receiver 将其特征描述并注册在系统中。
根据注册时机,可以分为两类,网上有人称之为冷注册和热注册。
冷注册,就是 Broadcast Receiver 的相关信息写在配置文件中,系统会负责在相关事件
发生的时候及时通知到该 Broadcast Receiver。这种模式适合于这样的场景:某事件发生
-> 通知 Broadcast -> 启动相关处理应用。比如,监听来电、邮件、短信之类的,都隶
属于这种模式。
热注册,顾名思义,注册这样的事情都是由应用自己来处理的,通常是在 OnResume 事
件中通过 registerReceiver 进行注册,在 OnPause 等事件中通过 unregisterReceiver 反注
册,通过这种方式使其能够在运行期间保持对相关事件的关注。比如,一款优秀的词典
软件,可能会有在运行期间关注网络状况变化的需求,使其可以在有廉价网络的时候优
先使用网络查询词汇,在其他情况下,首先通过本地词库来查词。而这样的监听,只需
要在其工作状态下保持就好,不运行的时候,管你是天大的网路变化,与我何干。其模
式可以归结为:启动应用 -> 监听事件 -> 发生时进行处理。
前面的 Demo 中用的就是冷注册。热注册的 code 如下:
OnCreate 时,声明一个 BroadcastReceiver。
BroadcastReceiver mReceiver=new BroadcastReceiver(){
Public void onReceive(Context context,Intent intent){
//收到 Broadcast 会跑到这里
}
}
OnResume 时,通过 registerReceiver 注册。
IntentFilter mfilter=new IntentFilter();
mfilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver,mfilter);
OnPause 时,通过 unregisterReceiver 反注册。
unregisterReceiver(mReceiver);
registerReceiver, unregisterReceiver 的内部实现,可以参考
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java。
除了接收消息的一方有多种模式,发送者也有很重要的选择权。通常,发送者有两类:
系统本身,Android 定义了一组的 Standard Broadcast Actions,称为系统 Broadcast 消息,
参考 http://androidappdocs.appspot.com/reference/android/content/Intent.html。
自定义应用通过的接口 Context.sendBroadcast 或 Context.sendOrderedBroadcast 也可以
发送 Broadcast。前者发出的称为 Normal broadcast,所有关注该消息的 Receiver,都有
机会获得并进行处理;后者放出的称作 Ordered broadcasts,顾名思义,接受者需要按
资排辈,排在后面的能否收到广播,需要看前面的处理方式。
需要注意的是,当 Broadcast Receiver 接收到相关的消息,在 OnReceive 中不要执行很消耗时
间的操作,通常把消耗时间的操作放到一个 Service 中,在 OnReceive 中启动该 Service。
虽然 Broadcast 整个逻辑不复杂,却是足够有用和好用,它统一了 Android 的事件广播模型,
更多 Broadcast Receiver 相关内容,可以参考:
http://androidappdocs.appspot.com/reference/android/content/BroadcastReceiver.html。
6.2 Intent
什么是 Intent
Intent 是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的
组件。通过 Intent,你的程序可以向 Android 表达某种请求或者意愿,Android 会根据意愿的
内容选择适当的组件来完成请求。比如,有一个 Activity 希望打开网页浏览器查看某一网页
的内容,那么这个 Activity 只需要发出 WEB_SEARCH_ACTION 给 Android,Android 就会根据
Intent 的请求内容,查询各组件注册时声明的 IntentFilter,找到网页浏览器的 Activity 来浏览
网页。
Android 的三个基本组件——Activity,Service 和 Broadcast Receiver——都是通过 Intent 机制
激活的,不同类型的组件有不同的传递 Intent 方式:
要激活一个新的 Activity,或者让一个现有的 Activity 做新的操作,可以通过调用
Context.startActivity()或者 Activity.startActivityForResult()方法。
要 启 动 一 个 新 的 Service , 或 者 向 一 个 已 有 的 Service 传 递 新 的 指 令 , 调 用
Context.startService()方法或者调用 Context.bindService()方法将调用此方法的上下文对
象与 Service 绑定。
Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这
三个方法可以发送 Broadcast Intent。发送之后,所有已注册的并且拥有与之相匹配
IntentFilter 的 BroadcastReceiver 就会被激活。
Intent 一 旦发出 ,Android 都 会准确找 到相匹配 的一个 或多个 Activity, Service 或者
BroadcastReceiver 作响应。所以,不同类型的 Intent 消息不会出现重叠,即 Broadcast 的 Intent
消息只会发送给 BroadcastReceiver,而决不会发送给 Activity 或者 Service。由 startActivity()
传递的消息也只会发给 Activity,由 startService()传递的 Intent 只会发送给 Service。
Intent 的构成
要在不同的 activity 之间传递数据,就要在 intent 中包含相应的内容,一般来说数据中最基
剩余12页未读,继续阅读
资源评论
yin4130796
- 粉丝: 5
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功