android aidl传递一个回调接口,aidl通过回调共享数据

AIDL传入回调方法

假设现有一个service在接收数据,接收的数据要传给另一个应用的activity使用,可以通过在activity中调用service的aidl的binder接口获取到远程service接口,然后通过该接口提供的设置数据接收回调的方法设置回调对象,从而实现远程service接收数据后,由activity提供的回调对象将数据传递给到activity中(这样做的原因是:aidl是共享内存的,数据共享速度是实时的(wrong),activity传到服务端的listener对象,在到达服务端时,服务端会产生一个新的对象,这2个对象的共同点是:底层Binder是同一个。由于对象是不能跨进程直接传输的,对象的跨进程传输本质都是反序列化的过程)。

//设置回调对象的aidl

package com.test.aidl;

import com.test.aidl.InterProcessCallback;

interface IAIDLSetCallback

{

void setCallback(InterProcessCallback callback);

}

//回调接口aidl,因为InterProcessCallback在activity和service中都要使用,所以必须定义出aidl

package com.test.aidl;

interface InterProcessCallback

{

void recv(int val);

}

//service

public class AIDLService extends Service {

//回调对象

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,AIDLAndroid Interface Definition Language)是一种用于进程间通信的接口定义语言。当客户端与服务端跨进程通信时,AIDL可以用来定义服务接口和传输数据类型。对于回调列表,我们可以通过AIDL将客户端的回调接口传递给服务端,在服务端需要回调时,调用客户端的回调接口。 具体实现步骤如下: 1. 首先,在AIDL文件中定义回调接口。例如: ``` // ICallbackInterface.aidl interface ICallbackInterface { void onCallback(int value); } ``` 2. 在服务端的AIDL接口中添加一个注册回调的方法和一个注销回调的方法。例如: ``` // IMyService.aidl interface IMyService { void registerCallback(in ICallbackInterface callback); void unregisterCallback(in ICallbackInterface callback); } ``` 3. 在服务端实现AIDL接口,并在需要回调时调用客户端的回调接口。例如: ``` // MyService.java public class MyService extends Service { private List<ICallbackInterface> mCallbacks = new ArrayList<>(); private void onValueChanged(int value) { for (ICallbackInterface callback : mCallbacks) { try { callback.onCallback(value); } catch (RemoteException e) { // 处理异常 } } } private final IMyService.Stub mBinder = new IMyService.Stub() { @Override public void registerCallback(ICallbackInterface callback) throws RemoteException { mCallbacks.add(callback); } @Override public void unregisterCallback(ICallbackInterface callback) throws RemoteException { mCallbacks.remove(callback); } }; } ``` 4. 在客户端实现回调接口,并在需要时注册回调。例如: ``` // MainActivity.java public class MainActivity extends AppCompatActivity { private IMyService mService; private ICallbackInterface mCallback = new ICallbackInterface.Stub() { @Override public void onCallback(int value) throws RemoteException { // 处理回调值 } }; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = IMyService.Stub.asInterface(service); try { mService.registerCallback(mCallback); } catch (RemoteException e) { // 处理异常 } } @Override public void onServiceDisconnected(ComponentName name) { mService = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 绑定服务 Intent intent = new Intent(this, MyService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); // 注销回调 if (mService != null) { try { mService.unregisterCallback(mCallback); } catch (RemoteException e) { // 处理异常 } } // 解绑服务 unbindService(mConnection); } } ``` 以上就是使用AIDL实现回调列表的基本步骤。需要注意的是,在使用AIDL时,需要注意线程安全问题,以及处理可能出现的异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值