对于用aidl生成Service,之前作过,这里记录一下,顺便也整理一下思路。java

一、建立aidl文件。android

这个aidl文件必须包括包名,和用interface的形式定义方法。eclipse

例如:IAIDLService.aidl。异步

package com.ting.androidexample.services;

interface IAIDLExampleService {

void show();

void function(String packageName, IBinder binder);

}

由于我是在eclipse中开发,因此这时会在gen目录下自动生成IAIDLExampleService.java文件。 ide

二、建立AIDLService.java文件。code

这个文件是一个Service,所以要继承Service类,由于Service是抽象类,所以,要实现抽象的onBind方法。onBind方法的返回值是一个Binder,这个Binder是要传给客户端的。这个Binder要继承自由aidl文件自动生成的IAIDLService.java类中的抽象子类Stub。而这个抽象子类中未实现的方法就是咱们在IAIDLService.aidl中定义的方法。继承

public class AIDLService extends Service {

private final IAIDLService.Stub mBinder = new IAIDLService.Stub() {

@Override

public void show() throws RemoteException {

// TODO Auto-generated method stub

}

@Override

public void function(String packageName, IBinder binder)

throws RemoteException {

// TODO Auto-generated method stub

}

};

@Override

public IBinder onBind(Intent arg0) {

return mBinder;

}

}

对于mBinder中的方法会传给绑定它的组件,而后绑定它的组件会调用这些方法。

三、建立与AIDLService通讯的类,好比,咱们先用Activity去调用与该Service通讯。ip

public class AIDLActivity extends Activity {

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

}

@Override

public void onServiceDisconnected(ComponentName name) {

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Intent intent = new Intent();

bindService(intent, conn, Context.BIND_AUTO_CREATE);

}

@Override

protected void onDestroy() {

super.onDestroy();

unbindService(conn);

}

}

只有执行bindService和unbindService时才会用到AIDL这种方式。

在执行bindService时,它的第二个参数是一个ServiceConnection实例,这个实例有两个回调方法,onServiceConnected是服务链接上的回调,onServiceDisconnected是服务断开链接的回调。因此说,bindService在链接时是异步的。对于onServiceConnected的第二个参数就是Service返回给Activity的binder。也就是靠它来通讯的。Activity能够经过这个binder调用传过来的方法。开发

那么AIDLActivity如何使用这个传过来的Binder呢?咱们看下面的代码。get

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

mIAIDLService = IAIDLService.Stub.asInterface(service);

mIAIDLService.show();

}

@Override

public void onServiceDisconnected(ComponentName name) {

mIAIDLService = null;

}

};

Activity的ServiceConnection中的代码能够修改成上面这样。首先获得mIAIDLService实例,而后就能够用mIAIDLService来执行aidl文件中定义的方法。这里须要注意,aidl文件中定义的方法能够是Binder,好比IAIDLService.aidl中的function方法的第二个参数就是Binder。对于Activity来讲,它没有办法得到这个Binder传到参数中。

若是绑定AIDLService的是一个Service,咱们定义为ClientService的话,而且这个 ClientService 有一些方法须要传给AIDLService,那么就能够为这个 ClientService建立IClientService.aidl文件,而且把须要的方法定义在aidl文件中。这样,在ClientService中就能够实例化一个它本身的Binder,而且能够经过上面IAIDLService的function方法把这个Binder传入。

例如:

public class ClientService extends Service {

private IAIDLService mIAIDLService;

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

mIAIDLService = IAIDLService.Stub.asInterface(service);

try {

mIAIDLService.show();

mIAIDLService.function(getPackageName(), mBinder);

} catch (RemoteException e) {

e.printStackTrace();

}

}

@Override

public void onServiceDisconnected(ComponentName name) {

mIAIDLService = null;

}

};

private final IClientService.Stub mBinder = new IClientService.Stub() {

@Override

public void test() throws RemoteException {

// TODO Auto-generated method stub

}

};

@Override

public void onCreate() {

super.onCreate();

Intent intent = new Intent();

bindService(intent, conn, Context.BIND_AUTO_CREATE);

}

@Override

public void onDestroy() {

super.onDestroy();

unbindService(conn);

}

@Override

public IBinder onBind(Intent intent) {

return null;

}

}

IClientService.aidl文件为:

package com.ting.androidexample.services;

interface IClientService {

void test();

}

android 自动生成aidl,[Android]用AIDL生成Service相关推荐

  1. android自动创建快捷方式,Android开发之生成桌面快捷方式细则(原创)

    本文已独家授权 郭霖 ( guolin_blog) 公众号发布! 申明,标题里的快捷方式不是指开发人员使用频率极高的Ctrl+C和Ctrl+V:也不是IDE里Ctrl+D.Ctrl+F等常用快捷键.这 ...

  2. android 自动挂断,android实现接通和挂断电话

    本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...

  3. android 自动挂断,android 来电自动接听和自动挂断(2.3以上)

    转自http://stephen830.iteye.com/blog/1181786java android 来电自动接听和自动挂断android 注意:android2.3版本不支持下面的自动接听方 ...

  4. android 自动 键盘,关于Android中的软键盘

    InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系 ...

  5. android 自动打印出来,Android:签名打包后关闭Log打印

    楔子 log在发布版本中打印会出现极大的安全问题,但在debug版本中确是不可缺少的. 需求 自动判断当前版本类型,选择是否输出log 实现 查阅了stormzhang的文章,提出使用BuildCon ...

  6. android自动更新demo,Android程序自动更新功能模块的实现方法【附完整demo源码下载】...

    本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更 ...

  7. android自动夜间模式,Android实现日夜间模式的深入理解

    在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...

  8. android自动切换图片,Android应用中图片浏览时实现自动切换功能的方法详解

    先给最终效果图: 当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能! activity代码: package cn.com. ...

  9. Android 自动搜索频道,Android自定义收音机搜台控件RadioRulerView

    前言:像这类的自定义控件有非常多的开源项目,但还是没有找到我项目想要的,所以简单实现了一个,下面简单讲讲实现原理. 效果图: 实现思路: 首先画固定背景尺子,而实现这个则要计算刻度线的宽度.刻度线间的 ...

  10. android自动添加包,android nfc写入应用程序包名与网址 自动打开应用程序与网址...

    安卓手机大部分手机提供了NFC芯片   可以根据NFC传递数据   NFC卡与手机  手机与手机数据等交互  非常好的功能,这篇文章教大家如何向NFC卡或标签写入功能. 用法 :  点击包名   将N ...

最新文章

  1. Android stadio 模板 liveTemplate不管用
  2. 项目跑到到了日志警告就卡住了_java中的日志框架梳理(以故事的形式呈现)...
  3. Android Annotation-让你的代码更加优雅(二)做一个Java诗人(JavaPoet)
  4. 连接查询,结构、循环语句
  5. 5G万物智联下互联网通信技术升级之路
  6. win10下Rabbitmq的安装和配置
  7. tomcat出现5个using_当猫咪出现这5个迹象,主人就要给猫咪换猫粮了
  8. python matplotlib模块教程_Python中的Matplotlib模块入门教程
  9. 关于telnet: connect to address 190.168.6.6: No route to host 报错处理
  10. 解决XP IIS(HTTP 500内部服务器错误)
  11. 对丰田暴冲事故的软件调查报告——嵌入式软件工程师必看
  12. 区块链-超级账本Hyperledger-fabric初步认识
  13. SHAMANIC Heil Amazonas-DschungelSHAMA
  14. 蜗牛星际改内存_二、FreeNAS篇:使用U盘在蜗牛星际上安装FreeNAS
  15. 子网掩码取反怎么取_关于子网掩码的问题
  16. 有哪些能给视频加特效字幕的软件?试试这几种简单方法
  17. 2021 年年度最佳开源软件
  18. linux中shell脚本批处理命令
  19. c#使用WPD读取便携式设备信息一(枚举设备、连接设备及读取设备信息)
  20. 糖豆人显示此服务器正在进行游戏,糖豆人神仙服务器

热门文章

  1. 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的...
  2. ZOJ - 3624
  3. java 内部类和静态内部类的区别
  4. ORACLE SQL调优案例一则
  5. [转] Official Microsoft Team Blogs / Microsoft Blogs
  6. 一个简单的适用于Vue的下拉刷新,触底加载组件
  7. 一篇文章入门Redis
  8. 2018--Linux面试题
  9. 23种设计模式-备忘录模式
  10. Spring处理跨域请求