这几天搞了搞AIDL,终于弄明白了在AIDL中让Service调用Activity的方法
代码:
首先建立一个ICallback.aidl文件,作为Activity中的回调方法
-
packagecom.zhang.test.service;
-
-
interfaceICallback{
-
voidshowResult(intresult);
-
}
然后再建立一个IService.aidl用来在Activity中接收Service回调,以及在Service中onBind时返回的Binder
注意:aidl中import不能写com.xxx.*,要写全类的路径
-
packagecom.zhang.test.service;
-
-
importcom.zhang.test.service.ICallback;
-
-
interfaceIService{
-
voidregisterCallback(ICallbackcb);
-
voidunregisterCallback(ICallbackcb);
-
}
接下来是service:
MainService.java
-
packagecom.zhang.test.service;
-
-
importandroid.app.Service;
-
importandroid.content.Intent;
-
importandroid.os.Handler;
-
importandroid.os.IBinder;
-
importandroid.os.Message;
-
importandroid.os.RemoteCallbackList;
-
importandroid.os.RemoteException;
-
importandroid.util.Log;
-
-
publicclassMainServiceextendsService{
-
-
privatestaticfinalStringTAG="MainService";
-
-
privateRemoteCallbackList<icallback>mCallbacks=newRemoteCallbackList<icallback>();
-
-
privateIService.StubmBinder=newIService.Stub(){
-
-
@Override
-
publicvoidunregisterCallback(ICallbackcb){
-
if(cb!=null){
-
mCallbacks.unregister(cb);
-
}
-
}
-
-
@Override
-
publicvoidregisterCallback(ICallbackcb){
-
if(cb!=null){
-
mCallbacks.register(cb);
-
}
-
}
-
};
-
-
@Override
-
publicIBinderonBind(Intentintent){
-
Log.d(TAG,"onBind");
-
returnmBinder;
-
}
-
-
@Override
-
publicvoidonCreate(){
-
Log.d(TAG,"onCreate");
-
-
-
-
mHandler.sendEmptyMessageDelayed(0,1000);
-
super.onCreate();
-
}
-
-
@Override
-
publicvoidonDestroy(){
-
mHandler.removeMessages(0);
-
mCallbacks.kill();
-
super.onDestroy();
-
}
-
-
privatevoidcallBack(){
-
intN=mCallbacks.beginBroadcast();
-
try{
-
for(inti=0;i<N;i++){
-
mCallbacks.getBroadcastItem(i).showResult(i);
-
}
-
}catch(RemoteExceptione){
-
Log.e(TAG,"",e);
-
}
-
mCallbacks.finishBroadcast();
-
}
-
-
privateHandlermHandler=newHandler(){
-
-
@Override
-
publicvoidhandleMessage(Messagemsg){
-
callBack();
-
super.handleMessage(msg);
-
}
-
};
-
}
-
</icallback></icallback>
然后是activity:
-
packagecom.zhang.test;
-
-
importandroid.app.Activity;
-
importandroid.content.ComponentName;
-
importandroid.content.Context;
-
importandroid.content.Intent;
-
importandroid.content.ServiceConnection;
-
importandroid.os.Bundle;
-
importandroid.os.IBinder;
-
importandroid.os.RemoteException;
-
importandroid.util.Log;
-
-
importcom.zhang.test.service.ICallback;
-
importcom.zhang.test.service.IService;
-
importcom.zhang.test.service.MainService;
-
-
publicclassMainActivityextendsActivity{
-
-
privatestaticfinalStringTAG="MainActivity";
-
-
privateIServicemService;
-
-
-
@Override
-
publicvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
Intenti=newIntent(this,MainService.class);
-
bindService(i,mConnection,Context.BIND_AUTO_CREATE);
-
}
-
-
@Override
-
protectedvoidonDestroy(){
-
if(mService!=null){
-
try{
-
mService.unregisterCallback(mCallback);
-
}catch(RemoteExceptione){
-
Log.e(TAG,"",e);
-
}
-
}
-
-
unbindService(mConnection);
-
super.onDestroy();
-
}
-
-
-
-
-
privateICallback.StubmCallback=newICallback.Stub(){
-
-
@Override
-
publicvoidshowResult(intresult){
-
Log.d(TAG,"result:"+result);
-
}
-
};
-
-
-
-
-
privateServiceConnectionmConnection=newServiceConnection(){
-
-
@Override
-
publicvoidonServiceDisconnected(ComponentNamename){
-
Log.d(TAG,"onServiceDisconnected");
-
mService=null;
-
}
-
-
@Override
-
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
-
Log.d(TAG,"onServiceConnected");
-
mService=IService.Stub.asInterface(service);
-
try{
-
mService.registerCallback(mCallback);
-
}catch(RemoteExceptione){
-
Log.e(TAG,"",e);
-
}
-
}
-
};
-
}
最后不要忘记在manifest中加上service标记:
-
<serviceandroid:name=".service.MainService">
-
</service>
分享到:
相关推荐
本文将深入探讨如何在Activity中使用AIDL来让Service与Activity进行通信。 首先,我们需要了解AIDL的基本概念。AIDL是一种特殊的接口定义语言,它允许Android系统生成必要的Java绑定类和代理对象,以便在不同的进程...
6. **在Activity中使用Service**: Activity需要获取Service的IBinder接口,然后通过这个接口调用Service中的方法。首先,通过`bindService`方法连接到Service,然后在回调的`onServiceConnected`方法中,你可以...
标题“aidl双向通信,Service加回调刷新自身Activity”涉及了两个关键概念:AIDL的双向通信以及通过Service回调更新Activity。 首先,让我们深入理解AIDL。AIDL是用来定义接口的,这些接口可以让一个Android进程...
本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行进程间通信。 Activity是Android应用程序的用户界面,它负责与用户交互。Activity的生命周期分为几个关键...
在Android开发中,Activity与Service之间的通信是应用中常见的需求,尤其当Service运行在远程进程中时,这种通信机制显得尤为重要。AIDL(Android Interface Definition Language)是Android提供的一种接口定义语言...
3. Activity绑定Service并使用Binder:在Activity中,我们可以通过bindService()方法绑定到Service,并在onServiceConnected()回调中获取到Binder对象。之后就可以调用Service中定义的方法了。 ```java public ...
本篇文章将深入探讨如何在Android Studio中使用AIDL来实现跨进程通信。 首先,我们需要理解AIDL的基本概念。AIDL是一种接口定义语言,它允许开发者声明服务端提供的接口,客户端通过这些接口调用服务端的方法,实现...
在Android系统中,AIDL(Android Interface Definition Language)是用于定义跨进程通信(IPC, Interprocess Communication)接口的一种语言。通过AIDL,开发者可以创建服务(Service),使得其他应用程序组件能够与...
- 连接成功后的操作:在`ServiceConnection`的`onServiceConnected()`回调中,我们可以获取到Service的Binder对象,从而调用Service的方法。 - 解绑Service:当不再需要与Service交互时,记得调用`unbindService()...
AIDL(Android Interface Definition Language)是Android提供的一种工具,用于支持跨进程调用,让服务(Service)可以在不同的进程中运行并与其他应用进行交互。本教程将通过一个简单的例子来讲解如何使用AIDL实现...
本示例代码将探讨如何在Android应用中使用Service和AIDL。 1. **Service基础** - **Service生命周期**:Service有其特定的生命周期,包括onCreate(), onStartCommand(), onBind(), onRebind(), onUnbind(), 和 ...
AIDL使得服务(Service)和活动(Activity)这两个独立的APK之间能够相互通信,交换数据,即使它们运行在不同的进程中。在“Aidldemo”中,我们可以看到一个服务端(AIDLServer)和客户端(AIDLClient)的示例,这是...
总之,观察者模式在Android开发中扮演着重要的角色,尤其在Service与Activity的交互中,能够优雅地处理数据变化的传播,提高代码的可读性和可维护性。在"ObservableDemo"项目中,我们可以通过阅读和分析源码,更深入...
5. 绑定服务:在客户端,使用bindService()方法连接服务,然后在回调中获取服务接口实例。 6. 调用服务:通过接口实例调用服务端的方法,进行跨进程通信。 示例: ```aidl package com.example.aidldemo; // 声明...
在这个实例中,`onServiceConnected`回调中,我们通过`Stub.asInterface(service)`获取到服务端的接口实现,然后就可以调用`sendMessage`和`receiveMessage`了。如果在调用过程中发生异常,通常是因为进程间的通信...
通过这个AIDL_DEMO,我们可以学习到如何在Android应用中使用AIDL实现进程间通信。这不仅适用于简单数据传递,还可以处理更复杂的对象交互,是Android开发中不可或缺的一部分。在实际项目中,根据需求灵活运用AIDL,...
总结来说,AIDL是Android中实现进程间通信的有效工具,特别是当需要在独立进程中运行服务并进行回调时。通过定义接口、实现接口、设置服务进程以及绑定服务,我们可以创建出高效且稳定的跨进程通信解决方案。在实际...
在Android系统中,AIDL(Android Interface Definition Language)和Service是两个重要的组件,它们分别用于进程间通信(IPC,Inter-Process Communication)和后台服务执行。本篇文章将深入探讨AIDL的工作原理以及...