使用Messenger
上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger。
其实实现IPC(Inter-Process Communication,进程间通信)的方式,还有AIDL,但推荐使用Messenger,有两点好处:
1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多
2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的。如果你的程序就是要多线程去访问Service,就可以用AIDL,不然最好使用Messenger的方式。
不过,其实Messenger底层用的就是AIDL实现的,看一下实现方式,先看Service的代码:
Java代码
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的代码:
Java代码
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
AIDL,Android Interface Definition Language。建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:
(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例的内容。
(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
(3)建立一个服务类(Service的子类)。
(4)实现由aidl文件生成的Java接口。
(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
分享到:
相关推荐
`android:process=":remote"`表示Service将在与应用主进程不同的进程中运行,实现进程间的隔离。 4. 调用Service:在Activity中,我们需要获取Service的Binder,然后就可以调用AIDL中定义的方法了。首先,通过`...
// 当不再需要与Service通信时,解绑 unbindService(serviceConnection); ``` 四、BroadcastReceiver通信 Service也可以通过BroadcastReceiver向Activity发送消息。Service在完成任务后,可以发送一个自定义广播,...
4. 测试代码:压缩包中的`TestService`可能包含了对上述步骤的实现,可以运行这个测试服务来验证Activity与Service之间的Binder通信是否正常。确保在AndroidManifest.xml中注册了Service,并给予必要的权限。 总结...
在Android应用开发中,Activity与Service之间的通信是十分常见的需求,尤其当Service运行在不同的进程中时,这种通信机制显得尤为重要。下面将详细讲解三种不同方式来实现Activity与Service的跨进程通信。 首先,...
本文将详细介绍如何使用`Messenger`机制来实现`Activity`与`Service`之间的通信,以及如何进一步扩展这种通信机制以支持跨进程通信。 #### Messenger实现Activity与Service通讯 `Messenger`是一种用于在不同组件...
当涉及到不同应用之间的Activity通信时,我们通常会利用Android提供的Intent、Binder机制、ContentProvider、BroadcastReceiver等方法。以下将详细介绍这些通信方式及其应用。 一、Intent通信 Intent是Android中最...
总的来说,理解并熟练掌握Activity与Service之间的通信方式,对于构建功能丰富的Android应用至关重要。开发者应根据需求灵活选择合适的方法,同时注意性能和资源的合理利用,确保应用的稳定性和用户体验。
这就是使用Messenger进行Activity和Service通信的基本流程。这种通信方式相对简单,适用于需要频繁、轻量级的消息传递。然而,如果需要传输大量数据或复杂的对象,可能需要考虑其他如AIDL(Android Interface ...
本文将详细讨论如何启动Service以及Activity与Service之间的通信机制。 首先,我们来看启动Service的两种主要方式: 1. **显式启动(Explicit Start)**: 显式启动Service时,我们需要明确指定Service的类名。...
在Android应用开发中,Service与Activity之间的通信是一个重要的主题,因为它们各自承担着不同的职责:Activity作为用户界面的载体,Service则用于执行后台任务。在本文中,我们将深入探讨两种常见的Service与...
本示例探讨的是如何实现`Service`与`Activity`之间的有效通信,确保`Service`能及时更新`Activity`的用户界面。以下是关于这个主题的详细讲解。 1. **Service**: `Service`是Android中的一个系统服务,它可以在后台...
Service与Activity之间的通信是Android应用开发中的重要概念,特别是在处理后台任务和服务持久运行时非常关键。当Activity和Service处于同一进程时,它们之间的通信可以通过Binder机制实现,这是一种轻量级的进程间...
本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行进程间通信。 Activity是Android应用程序的用户界面,它负责与用户交互。Activity的生命周期分为几个关键...
Service与Activity之间的通信主要通过以下几种方式实现: 1. **Binder**: Binder是Android系统中的进程间通信(IPC)机制。你可以创建一个实现了IBinder接口的类,并在Service中暴露这个类的实例。Activity通过...
本示例“android 本地服务通信 AIDL service服务与activity之间的通信”通过一个学号查询学生的例子,清晰地展示了如何利用AIDL实现在Activity和Service之间的数据传递。 首先,我们需要了解AIDL的基本概念。AIDL...
Service与Activity之间的通信是Android系统中一个重要的知识点,它允许我们实现Activity和Service之间的数据交互、状态传递以及控制Service的生命周期。广播(Broadcast)是Android系统中另一种通知全局事件的方式,...
总结来说,AIDL在Activity与远程Service通信中扮演了关键角色,它使得两个不同进程间的对象能够透明地调用对方的方法。通过定义接口、实现接口、在Service中返回Binder实例以及在Activity中绑定Service,我们可以...
6. 当我们需要与Service通信时,就可以通过`mService`对象调用Service中定义的方法。注意,由于是跨进程通信,所有方法调用都是异步的,不能直接得到结果,需要通过回调或者其他方式处理。 7. 不要忘记在Activity中...