android 自动生成aidl,[Android]用AIDL生成Service
对于用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相关推荐
- android自动创建快捷方式,Android开发之生成桌面快捷方式细则(原创)
本文已独家授权 郭霖 ( guolin_blog) 公众号发布! 申明,标题里的快捷方式不是指开发人员使用频率极高的Ctrl+C和Ctrl+V:也不是IDE里Ctrl+D.Ctrl+F等常用快捷键.这 ...
- android 自动挂断,android实现接通和挂断电话
本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...
- android 自动挂断,android 来电自动接听和自动挂断(2.3以上)
转自http://stephen830.iteye.com/blog/1181786java android 来电自动接听和自动挂断android 注意:android2.3版本不支持下面的自动接听方 ...
- android 自动 键盘,关于Android中的软键盘
InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系 ...
- android 自动打印出来,Android:签名打包后关闭Log打印
楔子 log在发布版本中打印会出现极大的安全问题,但在debug版本中确是不可缺少的. 需求 自动判断当前版本类型,选择是否输出log 实现 查阅了stormzhang的文章,提出使用BuildCon ...
- android自动更新demo,Android程序自动更新功能模块的实现方法【附完整demo源码下载】...
本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更 ...
- android自动夜间模式,Android实现日夜间模式的深入理解
在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...
- android自动切换图片,Android应用中图片浏览时实现自动切换功能的方法详解
先给最终效果图: 当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能! activity代码: package cn.com. ...
- Android 自动搜索频道,Android自定义收音机搜台控件RadioRulerView
前言:像这类的自定义控件有非常多的开源项目,但还是没有找到我项目想要的,所以简单实现了一个,下面简单讲讲实现原理. 效果图: 实现思路: 首先画固定背景尺子,而实现这个则要计算刻度线的宽度.刻度线间的 ...
- android自动添加包,android nfc写入应用程序包名与网址 自动打开应用程序与网址...
安卓手机大部分手机提供了NFC芯片 可以根据NFC传递数据 NFC卡与手机 手机与手机数据等交互 非常好的功能,这篇文章教大家如何向NFC卡或标签写入功能. 用法 : 点击包名 将N ...
最新文章
- Android stadio 模板 liveTemplate不管用
- 项目跑到到了日志警告就卡住了_java中的日志框架梳理(以故事的形式呈现)...
- Android Annotation-让你的代码更加优雅(二)做一个Java诗人(JavaPoet)
- 连接查询,结构、循环语句
- 5G万物智联下互联网通信技术升级之路
- win10下Rabbitmq的安装和配置
- tomcat出现5个using_当猫咪出现这5个迹象,主人就要给猫咪换猫粮了
- python matplotlib模块教程_Python中的Matplotlib模块入门教程
- 关于telnet: connect to address 190.168.6.6: No route to host 报错处理
- 解决XP IIS(HTTP 500内部服务器错误)
- 对丰田暴冲事故的软件调查报告——嵌入式软件工程师必看
- 区块链-超级账本Hyperledger-fabric初步认识
- SHAMANIC Heil Amazonas-DschungelSHAMA
- 蜗牛星际改内存_二、FreeNAS篇:使用U盘在蜗牛星际上安装FreeNAS
- 子网掩码取反怎么取_关于子网掩码的问题
- 有哪些能给视频加特效字幕的软件?试试这几种简单方法
- 2021 年年度最佳开源软件
- linux中shell脚本批处理命令
- c#使用WPD读取便携式设备信息一(枚举设备、连接设备及读取设备信息)
- 糖豆人显示此服务器正在进行游戏,糖豆人神仙服务器
热门文章
- 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的...
- ZOJ - 3624
- java 内部类和静态内部类的区别
- ORACLE SQL调优案例一则
- [转] Official Microsoft Team Blogs / Microsoft Blogs
- 一个简单的适用于Vue的下拉刷新,触底加载组件
- 一篇文章入门Redis
- 2018--Linux面试题
- 23种设计模式-备忘录模式
- Spring处理跨域请求