文档章节

android AIDL通信

lgl_lfx
 lgl_lfx
发布于 2016/02/29 16:50
字数 508
阅读 82
收藏 6

1.创建android工程
2.创建aidl文件(不需要public类似的修饰)例如 IBankAccountService.aidl
 interface IBankAccountService {
     double calMondy(double sum);
}

3.自定义类继承Service并实现 onBind方法,在自定义类中可以设置多个变量实现多个aidl文件,根据onBind的Intent的action返回不同的IBinder对象
如:
public class CustomService extends Service {

        //操作 可以有多个类似这样的变量,多个aidl
    private IBankAccountService.Stub ibanAccountService=new IBankAccountService.Stub() {
        @Override
        public double calMondy(double sum) throws RemoteException {
            return sum*10;
        }
    };
    
    @Override
    public IBinder onBind(Intent intent) {
        return ibanAccountService;
    }

}

4.进程间数据传递
/**
通过Android.os提供的Parcelable类型来传递数据,通常我们使用Eclipse+ADT插件来完成,在Eclipse中在Package Explorer view视图上单击鼠标右键,选择Create Aidl preprocess file for Parcelable classes(创建aidl预编译文件),最终我们创建一个名为android123.aidl文件
*/
 
import android.os.Parcel;
import android.os.Parcelable;
 
public final class Rect implements Parcelable {
public int left;
public int top;
public int right;
public int bottom;
 
public static final Parcelable.Creator<Rect> CREATOR = new Parcelable.Creator<Rect>() {
public Rect createFromParcel(Parcel in) {
return new Rect(in);
}
 
public Rect[] newArray(int size) {
return new Rect[size];
}
};
 
public Rect() {
}
 
private Rect(Parcel in) {
readFromParcel(in);
}
 
public void writeToParcel(Parcel out) { //当前数据写入到Parcel中
out.writeInt(left);
out.writeInt(top);
out.writeInt(right);
out.writeInt(bottom);
}
 
public void readFromParcel(Parcel in) { //从Parcel中读取数据
left = in.readInt();
top = in.readInt();
right = in.readInt();
bottom = in.readInt();
}
}

5.进程内使用(以下方式启动service)
 IBankAccountService mService=null;
    private ServiceConnection mConnection = new ServiceConnection() {
           public void onServiceConnected(ComponentName className,
                   IBinder service) {
               mService = IBankAccountService.Stub.asInterface(service);
  try {
                System.out.println(  mService.calMondy(20));
            } catch (RemoteException e) {
                e.printStackTrace();
            }
   }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    };
   

 // 启动服务
                 Intent intent=new Intent();
        intent.setClass(this, CustomService.class);
        bindService(intent,
                mConnection, Context.BIND_AUTO_CREATE);

当mService不等于null时就可以使用了

6.进程外使用(跨进程,注意:***保证拥有CustomService的项目已经装在手机里)
  1.把IBankAccountService.aidl及其包拷入到目标工程(工程内此文件路径完全一致)
  2.类似前面第5步一样启动服务,服务直接设置action的名字
  3.如果需传递数据需要使用前面定义的Parcelable实现类传递,当然需要把前面定义的Parcelable实现类及其包拷贝过来
 

© 著作权归作者所有

共有 人打赏支持
lgl_lfx
粉丝 0
博文 6
码字总数 2371
作品 0
厦门
程序员
android自启动服务,研究自用

1、开机自启动 2、系统服务(需要用到AIDL进行数据传输);拿到需求的第一步准备下手的是开机自启动。 一、开机自启动 这里要分三步走: 第一步:加入开机自启动权限 <uses-permission andro...

捍卫机密
07/10
0
0
安卓跨进程通信之Aidl教程详解(一)

安卓多进程通信主要有四大方案:1,Activity 2,Broadcast Receiver 3,Content Prodiver 4,Service 1,Activity Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); inte......

修炼爱情
2017/04/19
0
0
简单音乐播放实例的实现,Android Service AIDL 远程调用服务

Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成。 AIDL 是什么 AIDL (Android Inte...

baisou
2013/07/27
0
0
Android通过Aidl调用Service实例

最近在上Android课程,现在我懒得备课了,直接拿博客来讲好了! Aidl访问Service实例: Android中Activity与Service是属于两个不同的进程的,而两个进程之间的通讯除了可以用广播之外,最完美...

MingliC
2013/12/23
0
0
android开发AIDL实例

由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空间。但是a...

晨曦之光
2012/03/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 中不适用功能键切换TTY

本简要指南介绍了在类 Unix 操作系统中如何在不使用功能键的情况下切换 TTY。在进一步讨论之前,我们将了解 TTY 是什么。正如在 AskUbuntu 论坛的一个答案[1]中所提到的,TTY这个词来自 Tele...

问题终结者
10分钟前
0
0
OSChina 周三乱弹 —— 我自己总觉得我的灵魂有毒

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Devoes :分享王菲的单曲《匆匆那年 (Fleet of Time)》 《匆匆那年 (Fleet of Time)》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) 天长地...

小小编辑
17分钟前
3
3
深度学习与图像处理实例:人像背景虚化与背景替换

简单人像背景虚化处理思路如下: 对图像内容分割,提取人像,背景 背景模糊处理 人像与模糊处理后的背景融合 本实例使用DeepLabV3图像分割深度学习模型实现。代码如下: import numpy as np...

IOTService
昨天
0
0
八月新增开源项目:假装自己是图形界面的 Git 命令行工具

每月新增开源项目。顾名思义,每月更新一期。我们会从社区上个月新收录的开源项目中,挑选出有价值的、有用的、优秀的、或者好玩的开源项目来和大家分享。数量不多,但我们力求推荐的都是精品...

编辑部的故事
昨天
8
0
20180918 find命令与Linux文件扩展名

命令find 用来查找搜索文件。 搜索文件相关命令: which 从环境变量里的目录中去搜索 whereis(不常用) 从一个固定的库中搜索 locate(需要单独安装 yum install -y mlocate) 查询时会从/var/...

野雪球
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部