- 浏览: 314920 次
- 性别:
- 来自: 益阳
文章分类
最新评论
-
duckbit:
楼主是否能把共享layout的例子发给我,有点没明白 谢谢额! ...
Android换肤apk -
天涯海角262253:
...
Androidpn里的Xmpp的理解 -
lbstudy:
Activity之间的切换动画 -
dumbnesslys:
楼主可不可以给个源码 ,就build.xml的 772774 ...
Ant自动打包 -
finaljava:
build.xml 这么复杂,看看这个吧http://angr ...
Ant自动打包
Activity与Service通信的方式有三种:
继承Binder类
这个方式只有当你的Acitivity和Service处于同一个Application和进程时,才可以用,比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信。
用例子来说明其使用方法:
1. 来看Service的写法:
public class LocalService extends Service { // 实例化自定义的Binder类 private final IBinder mBinder = new LocalBinder(); // 随机数的生成器 private final Random mGenerator = new Random(); /** * 自定义的Binder类,这个是一个内部类,所以可以知道其外围类的对象,通过这个类,让Activity知道其Service的对象 */ public class LocalBinder extends Binder { LocalService getService() { // 返回Activity所关联的Service对象,这样在Activity里,就可调用Service里的一些公用方法和公用属性 return LocalService.this; } } @Override public IBinder onBind(Intent intent) { return mBinder; } /** public方法,Activity可以进行调用 */ public int getRandomNumber() { return mGenerator.nextInt(100); } }
在Service里定义一个内部类,Binder的子类,通过这个类,把Service的对象传给Activity,这样Activity就可以调用Service里的公用方法和公用属性了,但这种方式,一定要在同一个进程和同一个Application里。
2. 再看相应Activity的代码:
public class BindingActivity extends Activity { LocalService mService; boolean mBound = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onStart() { super.onStart(); // 绑定Service,绑定后就会调用mConnetion里的onServiceConnected方法 Intent intent = new Intent(this, LocalService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); // 解绑Service,这样可以节约内存 if (mBound) { unbindService(mConnection); mBound = false; } } /** 用户点击button,就读取Service里的随机数 */ public void onButtonClick(View v) { if (mBound) { // 用Service的对象,去读取随机数 int num = mService.getRandomNumber(); Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show(); } } /** 定交ServiceConnection,用于绑定Service的*/ private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { // 已经绑定了LocalService,强转IBinder对象,调用方法得到LocalService对象 LocalBinder binder = (LocalBinder) service; mService = binder.getService(); mBound = true; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; }
这里就是通过IBinder来得到LocalService对象,再去调用其Public方法。
使用Messenger
上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger。
其实实现IPC的方式,还有AIDL,但推荐使用Messenger,有两点好处:
1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多
2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的。如果你的程序就是要多线程去访问Service,就可以用AIDL,不然最好使用Messenger的方式。
不过,其实Messenger底层用的就是AIDL实现的,看一下实现方式,先看Service的代码:
public class MessengerService extends Service { /** 用于Handler里的消息类型 */ static final int MSG_SAY_HELLO = 1; /** * 在Service处理Activity传过来消息的Handler */ class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SAY_HELLO: Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show(); break; default: super.handleMessage(msg); } } } /** * 这个Messenger可以关联到Service里的Handler,Activity用这个对象发送Message给Service,Service通过Handler进行处理。 */ final Messenger mMessenger = new Messenger(new IncomingHandler()); /** * 当Activity绑定Service的时候,通过这个方法返回一个IBinder,Activity用这个IBinder创建出的Messenger,就可以与Service的Handler进行通信了 */ @Override public IBinder onBind(Intent intent) { Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); return mMessenger.getBinder(); } }
再看一下Activity的代码:
public class ActivityMessenger extends Activity { /** 向Service发送Message的Messenger对象 */ Messenger mService = null; /** 判断有没有绑定Service */ boolean mBound; private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { // Activity已经绑定了Service // 通过参数service来创建Messenger对象,这个对象可以向Service发送Message,与Service进行通信 mService = new Messenger(service); mBound = true; } public void onServiceDisconnected(ComponentName className) { mService = null; mBound = false; } }; public void sayHello(View v) { if (!mBound) return; // 向Service发送一个Message Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0); try { mService.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onStart() { super.onStart(); // 绑定Service bindService(new Intent(this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); // 解绑 if (mBound) { unbindService(mConnection); mBound = false; } } }
注意:以上写的代码只能实现从Activity向Service发送消息,如果想从Service向Activity发送消息,只要把代码反过来写就可以了。
使用AIDL
这个方法略,如果知道上面两种方法,这个方法基本很少会用到。
评论
发表评论
-
浅析QQGame
2012-03-01 14:31 3529通过分析QQGame的项目,发现其存在两种方式: 1. 不安 ... -
opengl初探
2012-02-22 10:15 0android里的surfaceview Surfac ... -
onSaveInstanceState(Bundle outState)的调用时机
2012-02-15 11:10 3150Activity的方法onSaveInstanceState( ... -
Activity之间的切换动画
2012-02-15 10:53 22928从android系统2.1以后,android新增了方法:ov ... -
FLAG_ACTIVITY_NEW_TASK和affinity亲和力
2012-02-06 14:07 3616一直以为在intent里加了FLAG_ACTIVITY_N ... -
什么时候调用Dialog的dismiss()方法
2012-02-03 16:27 10068调用Dialog的dismiss()方法的方式: 1. 重写 ... -
引用主题属性
2011-12-28 18:09 2129文档里写的引用主题属性的方法如下: ?[<pac ... -
Intent的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT
2011-12-18 14:50 54809Activity的两种启动模式:FLAG_ACTIVITY_C ... -
Android换肤apk
2011-12-11 15:30 4208在android系统中,每 ... -
Androidpn的框架浅析
2011-12-11 13:47 11783开发部署方法: 1. ... -
Androidpn里的Xmpp的理解
2011-12-09 20:31 15064XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XM ... -
Log的tag的设置
2011-12-09 15:27 2455android输出日志的方法如下: int andro ... -
PopupWindow自适应布局
2011-12-04 18:24 13180Android自带的Menu菜单,常常无法满足我们的需求 ... -
Android程序换肤
2011-12-02 15:15 0Android的换肤功能,有多种方式,现在来说一下生成皮肤ap ... -
Ant自动打包2(打特殊厂商的包)
2011-11-29 15:08 4926由于公司内置的需要,我们的程序要针对不同的厂商打不同的ap ... -
Eclipse Indigo设置Courier New字体
2011-11-25 14:25 2192网上的教程如下: ... -
Fragment研究2
2011-11-24 10:43 6530几个类的结构的研 ... -
Ant自动打包
2011-08-23 15:56 39022Ant使用 在ant的官网http://ant. ... -
渐进式下载和流式下载有什么区别
2010-10-23 12:06 2328流式下载 下载边播放的BT软件,下载时必须要从电影的开头下 ... -
TableLaout样式
2010-10-12 10:41 1125要想用TableLaout来模仿九宫格的样式,其中有两个难点: ...
相关推荐
本篇文章将深入探讨在同一应用内,Activity如何与Service进行通信,以及相关知识点的详细说明。 首先,了解Service的基本概念。Service是Android中的一个组件,它可以长时间在后台运行,即使没有用户界面。Service...
在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发...Activity与Service通信的方式有三种: 继承Binder类 这个方式只有当你的Acitivity和Service处于同一个A
当涉及到多个Activity与同一个Service通信时,我们可以采用以下几种策略: 1. **BroadcastReceiver**: 创建一个BroadcastReceiver作为中介,Service通过发送BroadcastIntent更新数据,各个Activity注册这个Receiver...
Service的启动,Activity与Service之间数据传递,Binder利用bindService实现Service传递数据给Activity,Activity的成员Broadcast实现Service传递数据给Activity
5. 解绑Service:在不再需要与Service通信时,应调用`unbindService`解除绑定,以释放资源。 通过以上步骤,我们就完成了基于AIDL的Activity与Service之间的进程间通信。在实际开发中,可以根据业务需求扩展AIDL...
// 当不再需要与Service通信时,解绑 unbindService(serviceConnection); ``` 四、BroadcastReceiver通信 Service也可以通过BroadcastReceiver向Activity发送消息。Service在完成任务后,可以发送一个自定义广播,...
在Android应用开发中,Service与Activity之间的通信是一个重要的主题,因为它们各自承担着不同的职责:Activity作为用户界面的载体,Service则用于执行后台任务。在本文中,我们将深入探讨两种常见的Service与...
首先,我们要明确“进程内”通信与“进程间”通信的区别。进程内通信,即在同一应用程序的不同组件之间进行数据交换,由于都在同一个进程中,通常比跨进程通信更高效。在这种情况下,Activity和Service可以通过直接...
8. **Service通信** Service通过`Binder`对象实现与Activity的通信。Service中的`onBind()`方法返回一个实现了`IBinder`接口的实例。Activity可以通过`IBinder`与Service交互,例如传递数据或控制Service的行为。 ...
这就是使用Messenger进行Activity和Service通信的基本流程。这种通信方式相对简单,适用于需要频繁、轻量级的消息传递。然而,如果需要传输大量数据或复杂的对象,可能需要考虑其他如AIDL(Android Interface ...
本文将详细讨论如何启动Service以及Activity与Service之间的通信机制。 首先,我们来看启动Service的两种主要方式: 1. **显式启动(Explicit Start)**: 显式启动Service时,我们需要明确指定Service的类名。...
本示例探讨的是如何实现`Service`与`Activity`之间的有效通信,确保`Service`能及时更新`Activity`的用户界面。以下是关于这个主题的详细讲解。 1. **Service**: `Service`是Android中的一个系统服务,它可以在后台...
本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行进程间通信。 Activity是Android应用程序的用户界面,它负责与用户交互。Activity的生命周期分为几个关键...
Service与Activity之间的通信主要通过以下几种方式实现: 1. **Binder**: Binder是Android系统中的进程间通信(IPC)机制。你可以创建一个实现了IBinder接口的类,并在Service中暴露这个类的实例。Activity通过...
首先,理解Activity与Service的通信方式至关重要。主要有以下几种: 1. **Intent**: 这是最常见的通信方式,通过Intent对象传递数据给Service。启动Service时,可以在Intent中添加额外的数据,Service通过...
通过绑定,Activity可以与Service建立连接,并进行通信,获取Service的方法调用,甚至监控Service的状态。绑定服务的优点在于它可以提供更细粒度的控制,比如可以只在需要时启动Service,而且当Activity销毁时,绑定...
Service与Activity之间的通信是Android系统中一个重要的知识点,它允许我们实现Activity和Service之间的数据交互、状态传递以及控制Service的生命周期。广播(Broadcast)是Android系统中另一种通知全局事件的方式,...
总结来说,AIDL在Activity与远程Service通信中扮演了关键角色,它使得两个不同进程间的对象能够透明地调用对方的方法。通过定义接口、实现接口、在Service中返回Binder实例以及在Activity中绑定Service,我们可以...