一、当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现。
当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用。比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信。
代码如下:
/*************************Service代码****************************************
/public class LocalService extends Service {
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
} public IBinder onBind(Intent intent) {
return binder;
}
}
/*****************************Activity代码*************************************/public class BindingActivity extends Activity {
LocalService localService;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,IBinder localBinder) { localService = (LocalBinder) localBinder.getService();
}
public void onServiceDisconnected(ComponentName arg0) {
localService = null;
}
};
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
protected void onStop() {
super.onStop();
unbindService(mConnection);
}
public void printRandomNumber{
int num = localService.getRandomNumber();
System.out.println(num);
}
}
代码解释:
使用使用context.bindService()启动Service会经历:
context.bindService()->onCreate()->onBind()->Service running
onUnbind() -> onDestroy() ->Service stop
Activity能进行绑定得益于Service的接口onBind()。Service和Activity的连接可以用ServiceConnection来实现,需要实现一个新的ServiceConnection,重写onServiceConnected和onServiceDisconnected方法。执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显式或隐式)和一个你实现了的ServiceConnection实例。一旦连接建立,你就能通Service的接口onBind()得到serviceBinder实例进而得到Service的实例引用。一旦Service对象找到,就能得到它的公共方法和属性。但这种方式,一定要在同一个进程和同一个Application里。
分享到:
相关推荐
1. **性能优化**:由于都在同一进程中,Service与其他组件之间的通信更快,数据交换更高效,减少了跨进程通信(IPC)的开销。 2. **资源节省**:如果多个组件在不同进程中运行,会消耗更多的系统资源。同一进程内,...
通过以上步骤,我们就完成了基于AIDL的Activity与Service之间的进程间通信。在实际开发中,可以根据业务需求扩展AIDL接口,传递更复杂的对象或数据结构。值得注意的是,由于IPC涉及到进程间的数据拷贝和序列化,所以...
总结,通过Binder机制,即使在同一进程中,Activity和Service也能实现更加安全和规范的通信方式。这种方式不仅适用于进程内通信,而且在需要跨进程交互时,如实现远程Service,也同样适用。理解并熟练运用Binder通信...
4. ** AIDL(Android Interface Definition Language)**:当需要跨进程通信并且数据交换比较复杂时,可以使用AIDL定义接口,使得Activity和Service之间能像在同一进程中一样调用对方的方法。 5. ** Intent和start...
在Android应用开发中,Activity与Service之间的通信是十分常见的需求,尤其当Service运行在不同的进程中时,这种通信机制显得尤为重要。下面将详细讲解三种不同方式来实现Activity与Service的跨进程通信。 首先,...
总结,通过AIDL,我们可以使Service与Activity在不同进程中相互通信,实现跨进程调用。同时,Service还可以通过Intent启动Activity。在实际开发中,需要注意跨进程通信的安全性和效率,合理设计接口,以提供高效且...
本示例"Android Service与Activity会话Demo"旨在教你如何在Android Studio中实现Service与Activity之间的通信,这对于创建功能丰富的应用程序至关重要。 Service是Android系统的一个组件,它可以在没有用户界面的...
本文将详细介绍如何使用`Messenger`机制来实现`Activity`与`Service`之间的通信,以及如何进一步扩展这种通信机制以支持跨进程通信。 #### Messenger实现Activity与Service通讯 `Messenger`是一种用于在不同组件...
本篇文章将深入探讨在同一应用内,Activity如何与Service进行通信,以及相关知识点的详细说明。 首先,了解Service的基本概念。Service是Android中的一个组件,它可以长时间在后台运行,即使没有用户界面。Service...
在Android应用开发中,Service和Activity是两个关键组件。Activity主要负责用户界面的展示和...而如果Service和Activity在同一进程中,两者之间的通信则更为简单和高效。在实际开发中,应根据具体需求选择合适的方法。
进程间通信的效率比在同一进程中通信要低,因为涉及到数据序列化和跨进程通信的开销。因此,合理使用AIDL并控制IPC的数量对于保持应用性能至关重要。 总结,Android系统允许开发者创建多个进程来执行不同的任务,...
2. **在同一进程内的Activity通信**: 当两个Activity位于同一进程中时,它们可以直接访问彼此的成员变量和方法,无需使用IPC。但如描述中所述,这种情况下的通信速度较快且更直接,因为它们共享相同的内存空间。 3....
然而,有时开发者可能希望多个Activity或Service在同一进程中运行,以便共享数据或优化性能。本示例程序"SingleInstanceTest"就是一个典型的Android单进程应用实例,它展示了如何在一个进程中管理多个组件。 在...
本地Service是运行在应用进程中,与创建它的Activity处于同一进程,主要用于执行一些持续性的任务,如播放音乐、网络通信等。在`ServiceTest`中,你可能会看到以下关键步骤: 1. **创建Service类**:继承自`Service...
在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序或同一应用内不同进程之间数据共享和协同工作的重要手段。"Messenger进程间通信"是一种轻量级的IPC方式,常用于简单的双向通信...
本篇文章将深入探讨“服务通信方案总结”,主要包括服务端的实现、客户端通过AIDL(Android Interface Definition Language)进行进程间通信、Activity与Service之间的通信以及Parcel的使用和接口回调机制。...
本地Service运行在同一应用程序进程中,而远程Service运行在另一进程,通常用于跨应用服务共享。 **本地Service通信:** 本地Service的通信主要通过`bindService()`方法实现。客户端(通常是一个Activity或...
主要的四种跨进程通信方式包括:Activity、Content Provider、Broadcast Receiver以及Service,特别是AIDL(Android Interface Definition Language)服务。 1. **访问其他应用程序的Activity** - 在同一应用内...