aidl支持的文件类型

1. Java 编程语言中的基本类型, 如 int、long、boolean 等, 不需要 import.

2. String、List、Map 和 CharSequence, 不需要 import.

3. AIDL 生成的 interface, 需要 import, 同一个包中也需要导入, 传递的是引用.
  如果定义的接口方法中有参数, 则需在前面加上 in, out 或 inout, 但是对于基本类型的参数, 默认就是 in, 并且不会是其他值.

4. Parcelable 接口的自定义类, 需要 import, 同一个包中也需要导入, 其传递的是值.

另外, 自定义类还需要用一个aidl文件来声明该类型.
如定义了一个类, 它的源代码在RoadLine.java中:
  package com.communicate;
  import android.os.Parcel;
  import android.os.Parcelable;
  public class RoadLine implements Parcelable {
需要在RoadLine.aidl文件中做如下声明:
  package com.communicate;
  import com.communicate.RoadLine;
  parcelable RoadLine;

AIDL 实现回调

1. 建立2个aidl文件,  一个用于声明回调的接口,  另一个用于定义注册接口, 及服务端调用的通知方法. 如:

package com.apical.contact;

import com.apical.contact.RoadLine;
import com.apical.contact.CarData; interface IDVRRoadMetaDataCallback {
void onMetaData(int cameraId, in List<RoadLine> roadLines, in List<CarData> carDatas);
}
package com.apical.contact;

import com.apical.contact.IDVRRoadMetaDataCallback;
import com.apical.contact.RoadLine;
import com.apical.contact.CarData; interface IDVRRoadMetaDataTaskBinder {
void registerCallback(int cameraId, IDVRRoadMetaDataCallback callback); void unregisterCallback(int cameraId, IDVRRoadMetaDataCallback callback); void onUpdateMetaData(int cameraId, in List<RoadLine> roadLines, in List<CarData> carDatas);
}

2. 实现服务端后台Service类. 要实现回调, 需要使用RemoteCallbackList对象, 一个存储回调对象的列表

private RemoteCallbackList<IDVRRoadMetaDataCallback> mCallbackList = new RemoteCallbackList<>();
注册
mCallbackList.register(callback);
取消注册
mCallbackList.unregister(callback);
方法调用
int count = mCallbackList.beginBroadcast();
try {
for (int i = 0; i < count; i++) {
mCallbackList.getBroadcastItem(i).onMetaData(cameraId, roadLines, carDatas);
}
} catch (RemoteException e) {
Dlog.e("E/onUpdateMetaDatas", e);
} finally {
mCallbackList.finishBroadcast();
}

package com.communicate;

import java.util.List;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log; public class DvrMetaDataService extends Service { private static final String TAG = "debug"; private RemoteCallbackList<IDVRRoadMetaDataCallback> mCallbackList = new RemoteCallbackList<>(); @Override
public IBinder onBind(Intent intent) {
return mBinder;
} @Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
} @Override
public void onCreate() {
super.onCreate();
} @Override
public void onDestroy() {
super.onDestroy();
} public IDVRRoadMetaDataTaskBinder.Stub mBinder = new IDVRRoadMetaDataTaskBinder.Stub() { @Override
public void registerCallback(int cameraId, IDVRRoadMetaDataCallback callback) throws RemoteException {
mCallbackList.register(callback);
} @Override
public void unregisterCallback(int cameraId, IDVRRoadMetaDataCallback callback) throws RemoteException {
mCallbackList.unregister(callback);
} @Override
public void onUpdateMetaData(int cameraId, List<RoadLine> roadLines, List<CarData> carDatas) throws RemoteException {
int count = mCallbackList.beginBroadcast();
try {
for (int i = 0; i < count; i++) {
mCallbackList.getBroadcastItem(i).onMetaData(cameraId, roadLines, carDatas);
}
} catch (RemoteException e) {
Log.e(TAG, "E/onUpdateMetaDatas", e);
} finally {
mCallbackList.finishBroadcast();
}
}
};
}

  注册服务,必须指定exported为true

        <service android:name="com.communicate.DvrMetaDataService" android:exported="true">
</service>

3. 服务端绑定服务, 调用数据通知方法.

    Intent metaDataService = new Intent();
metaDataService.setComponent(new ComponentName(com.communicate, com.communicate.DvrMetaDataService));
boolean result = bindService(metaDataService, mMetaDataConn, Service.BIND_AUTO_CREATE); /** DVR Meta data 共享数据服务 */
private IDVRRoadMetaDataTaskBinder mMetaDataServiceTaskBinder;
private ServiceConnection mMetaDataConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName componentName) {
} @Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mMetaDataServiceTaskBinder = IDVRRoadMetaDataTaskBinder.Stub.asInterface(iBinder);
}
}; 在更新数据时调用
if (mMetaDataServiceTaskBinder != null) {
try {
mMetaDataServiceTaskBinder.onUpdateMetaData(cameraId, roadLines, carDatas);
} catch (RemoteException e) {
Dlog.e("E/OnCameraMetaDataChange", e);
}
}

4. 客户端绑定服务, 注册接口, 实现回调的功能.需要注意的是, 由于服务端也绑定了服务,或者多个客户端同时绑定服务, unbindService时并不会调用 onServiceDisconnected 方法, 因此客户端不需要使用时要适时取消注册.

    Intent metaDataService = new Intent();
metaDataService.setComponent(new ComponentName(MetaDataServiceConfig.META_DATA_SERVICE_PKG_NAME,
MetaDataServiceConfig.META_DATA_SERVICE_CLASS_NAME));
boolean result = bindService(metaDataService, mServiceConnection, Service.BIND_AUTO_CREATE);
Log.d(TAG, "result = " + result); private ServiceConnection mServiceConnection = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName componentName) {
try {
if (mIDVRRoadMetaDataTaskBinder != null) {
mIDVRRoadMetaDataTaskBinder.unregisterCallback(0, mCallback);
mIDVRRoadMetaDataTaskBinder = null;
}
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
} @Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.d(TAG, "(DvrMetaDataService - onServiceConnected");
mIDVRRoadMetaDataTaskBinder = IDVRRoadMetaDataTaskBinder.Stub.asInterface(iBinder);
try {
mIDVRRoadMetaDataTaskBinder.registerCallback(0, mCallback);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
}
}; private IDVRRoadMetaDataTaskBinder mIDVRRoadMetaDataTaskBinder; private IDVRRoadMetaDataCallback mCallback = new IDVRRoadMetaDataCallback.Stub() {
@Override
public void onMetaData(int cameraId, List<RoadLine> roadLines, List<CarData> carDatas) throws RemoteException {
Log.d(TAG, "-> onMetaData :" + carDatas);
// do something needed
}
};

Aidl实现进程间通信,跨进程回调的更多相关文章

  1. Binder的使用(跨进程——AIDL,非跨进程)

    一.Binder类 1.作用:Binder是客户端与服务器端的通信的媒介(连接各种Manager的桥梁),客户端通过Binder对象获取服务器端提供的数据 (为什么要用Binder来提供数据呢,服务器 ...

  2. Android IPC机制(三)使用AIDL实现跨进程方法调用

    上一篇文章中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户 ...

  3. Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

    在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...

  4. 【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了

    一.前言 提起跨进程通信,大多数人首先会想到AIDL.我们知道,用AIDL来实现跨进程通信,需要在客户端和服务端都添加上aidl文件,并在服务端的Service中实现aidl对应的接口.如果还需要服务 ...

  5. AIDL跨进程通信

    Android跨进程通信会用到AIDL,当然跨进程通信不一定要用AIDL,像广播也是可以的,当然这里用到AIDL相对比较安全一些: AIDL允许传递基本数据类型(Java 的原生类型如int/long ...

  6. Android AIDL Service 跨进程传递复杂数据

    黑夜 黑夜给了我黑色的眼睛,我却用它寻找光明~ 传值方式 AIDL是同意跨进程传递值的,一般来说有三种方式: - 广播:这样的算是比較常见的一种方式了,传递小数据不错 - 文件:这个是保存到文件里.然 ...

  7. android 远程Service以及AIDL的跨进程通信

    在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...

  8. Android中的跨进程通信方法实例及特点分析(一):AIDL Service

    转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...

  9. android不需要Socket的跨进程推送消息AIDL!

    上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...

随机推荐

  1. 关于java中“使用了未经检查或不安全的操作、有关详细信息,请使用 ——Xlint:unchecked重新编译”

    今天看<算法 第4版>排序章节时,发现了一个了一个小问题.先贴一下代码: public class Selection{ public static void main(String[]a ...

  2. 【Machine Learning】如何处理机器学习中的非均衡数据集?

    在机器学习中,我们常常会遇到不均衡的数据集.比如癌症数据集中,癌症样本的数量可能远少于非癌症样本的数量:在银行的信用数据集中,按期还款的客户数量可能远大于违约客户的样本数量.   比如非常有名的德国信 ...

  3. LeetCode - 412. Fizz Buzz - ( C++ ) - 解题报告 - to_string

    1.题目大意 Write a program that outputs the string representation of numbers from 1 to n. But for multip ...

  4. java超强分页标签演示

    最近在做一个项目,用到了一个分页,于是动手写了个分页标签,先将代码贴出来,供大家交流,写的不好,请见谅!. 以下是java标签类,继承自SimpleTagSupport package com.lyn ...

  5. 深搜(DFS)与广搜(BFS)区别

    最近做了不少的搜索题,时而用到DFS时而用到BFS,这里对两种搜索方法做一个总结. 广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法.简单来说 ...

  6. “Hello World!”团队——Alpha发布用户使用报告

    博客内容: 1.用户体验报告表 2.用户评论截图 3.总结 一.用户体验报告表 用户使用报告 用户序号 用户姓名(化名) 性别 用户职业 使用频次 用户评论 1 小董 女 文学在读硕士 5 1.游戏界 ...

  7. Debian 7 amd64 + fbterm + ucimf

    前段时间,显示器出了问题,导致Debian下只有终端显示正常,桌面显示效果很是摇晃模糊.遂起了念头,能不能在终端下就能完成日常的工作. google了很久,终于知道fbterm可以在终端下显示中文,加 ...

  8. ASP.NET 最全的POST提交数据和接收数据 —— (1) 用url传参方式

    //1.对象提交,字典方式 //接口方:public ActionResult GetArry(Car model) public void PostResponse() { HttpWebReque ...

  9. 载入其他同名源文件导致vs编译错误

    今天下午工程编译的时候总是通不过,提示1,某个类没有某个成员,可是我去该类的头文件下查看,确实包括了这个成员啊.2,没有某个类,可是我明明定义了的. 检查了好久才发现 原来是,我打开了其他工程下的某一 ...

  10. 请问:在delphi中怎样判断DBgrid中数据是否被修改,以便在退出窗口时加以提示

    若DBGrid.DataSource.DateSet为ADOQuery1,这样试一下:if ADOQuery1.Modified then ... procedure TForm1.FormClose ...