【5】Android Service 与 AIDL
前言:本系列仅介绍基本大体的使用步骤,而不对每个步骤进行细致的讲解。读者可作为已经对相关内容有所了解后的快速查阅。
一、单应用内Service的使用
Service组件与Activity以IBinder为媒介进行通信。
1、Service组件
Service组件的实现步骤如下:
- 新建一个java类继承Service作为Service组件。实现Service组件需要如下几步
- 在AndroidMenifest文件中注册该组件。
- 通过重写
public IBinder onBind(Intent t)
函数,提供服务接口。
AndroidMenifest中添加:
<service
android:name="com.starjade.cst.homework5.ZYService"
android:process=":remote"
android:exported="true" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="com.starjade.cst.homework5.ZYService" />
</intent-filter>
</service>
2、IBinder
IBinder是Service组件与Activity组件进行通信的接口。Service组件需要返回一个IBinder对象来提供服务接口。要达到这个目的需要如下几步;
- 新建一个类继承Binder类。
- 在该类中实现所有Service组件需要提供的接口函数。
例如想要提供一个比较两数大小的服务,则可以这样实现MyBind类:
public class MyBind extends Binder{
public int compare(int a, int b){
a = a > b ? a:b;
return a;
}
};
3、Activity组件
Activity组件是实际使用服务的对象。Activity的基本使用无需多言,仅仅介绍其与Service相关部分。实现步骤如下:
- 创建Service组件的Intent对象。
this.startService(intentService)
启用Service组件this.bindService(intentService,serviceConection,BIND_AUTO_CREATE)
将Activity组件与Service组件绑定,使得Activity组件能够使用Service组件。
bindService函数参数1:Service组件的intent对象,参数2:ServiceConnection对象,参数3:绑定方式
ServiceConnection对象的作用在于提供了绑定的回调函数,Activity组件可以通过它获得IBinder对象。代码示例如下:
private MyService.MyBinder myBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
获得IBinder对象后,那么就可以通过该对象调用Service提供的服务了。
二、多应用Service组件使用
很多情况下Service组件会提供给其他应用的Activity组件使用。
1、AIDL
AIDL(Android Interface Definition Language)提供一个进程间通信的接口。
多应用Service组件使用与单应用内Service的使用的主要区别就在于AIDL的使用。
定义接口文件
2、Service端
- 在src目录下创建.aidl接口文件。创建后ADT会自动生成一个对应的.java文件。
- 在接口文件中添加需要提供的服务方法的声明。
- 接口文件自带一个Stub类,该类继承了Bundle。在Service组件中创建一个对象,该对象所属的类继承Stub类,需要实现接口文件中的服务方法。
- 将创建的对象作为IBinder对象通过onBind方法输出。
举例:
1).aidl文件
interface IAIDLServerService {
Person getPerson(); //服务方法
Gender getGender();
}
2)Service组件中实现:
private IAIDLServerService.Stub mBinder = new Stub() {
//实现服务方法
public Person getPerson() throws RemoteException {
Person person = new Person();
person.setName("Snail");
person.setAge(27);
return person;
}
public Gender getGender() throws RemoteException {
return new Gender("male");
}
};
@Override
public IBinder onBind(Intent intent) {
return mBinder; //输出IBlinder对象
}
3、Client端
Client端的操作步骤与单应用情况下Activity组件的实现方式十分接近,区别在于:
- 创建.aidl文件(与Service端的文件相同,文件所属包名也要与Service端一致)
- 通过ServiceConnection获得接口类的对象。
例子:
private IAIDLServerService mIaidlServerService = null; //接口类的对象
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
mIaidlServerService = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
mIaidlServerService = IAIDLServerService.Stub.asInterface(service); //获取接口类对象
}
};
public void printPersonInfo(){
try {
Person person = mIaidlServerService.getPerson();
String str = "姓名:" + person.getName() + "\n" + "年龄:"
+ person.getAge();
mAIDLView.setText(str);
} catch (RemoteException e) {
e.printStackTrace();
}
}
【5】Android Service 与 AIDL的更多相关文章
- Android service binder aidl 关系
/********************************************************************************** * Android servic ...
- android service 的各种用法(IPC、AIDL)
http://my.oschina.net/mopidick/blog/132325 最近在学android service,感觉终于把service的各种使用场景和用到的技术整理得比较明白了,受益颇 ...
- Android Service学习之AIDL, Parcelable和远程服务
AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空 ...
- Android Service AIDL 远程调用服务 【简单音乐播放实例】
Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...
- Android Service总结06 之AIDL
Android Service总结06 之AIDL 版本 版本说明 发布时间 发布人 V1.0 初始版本 2013-04-03 Skywang 1 AIDL介绍 AIDL,即And ...
- Android Service和Binder、AIDL
1.首先理解service的作用和生命周期 由于activity如果切换,那么他就不再运行,那么我们想在玩游戏的时候听播放器中的音乐,activity就应运而生了,这是最常见的一种场景,同时servi ...
- Android Service完全解析,关于服务你所需知道的一切(下)
转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...
- Android 中的AIDL,Parcelable和远程服务
Android 中的AIDL,Parcelable和远程服务 早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用 ...
- Android:学习AIDL,这一篇文章就够了(下)
前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...
随机推荐
- 设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务
设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-02. 参考文章: IPv6"内网"设备 ...
- SecureCRT远程连接The remote system refused the connection问题
今天用SecureCRT远程连接Linux(Centos 7)时,连不上,报错The remote system refused the connection.于是就百度,首先查看sshd服务有没有启 ...
- Java8新特性之接口defualt,static方法
简介 作用 Java8中接口引入了defualt,static两种方法提供默认实现,彻底打破了接口不能有默认实现的规定 static 让接口类似于工具类,提供一些静态方法 static方法不会被子类继 ...
- Maven发布封装到中央仓库时候报错:no default secret key: No secret key
今天因为发布swagger-spring-boot-starter做一个问题的修复,然后碰到了下面这个问题,记录一下解决过程,帮助后续碰到类似问题的童鞋: *gpg: WARNING: "- ...
- Prometheus学习系列(九)之Prometheus 存储
前言 本文来自Prometheus官网手册 和 Prometheus简介 存储 Prometheus是一个本地磁盘时间序列数据库,但也可选择与远程存储系统集成,其本地时间序列数据库以自定义格式在磁盘上 ...
- Custom Diagrams
Custom Diagrams https://github.com/dbeaver/dbeaver/wiki/Custom-Diagrams You can create custom ER dia ...
- Mysql 事务及其原理
Mysql 事务及其原理 什么是事务 什么是事务?事务是作为单个逻辑工作单元执行的一系列操作,通俗易懂的说就是一组原子性的 SQL 查询.Mysql 中事务的支持在存储引擎层,MyISAM 存储引擎不 ...
- 如何使ElementUi中的el-dropdown传入多参数
这边因为业务的需求,觉得随着产品中心以后需要按钮的增多(图1操作栏的效果),这样会导致排版和按钮过于冗长的问题,用户体验不佳,于是想到利用el-dropdown做一个下拉按钮(图1操作1栏的效果) . ...
- 团队项目之Scrum5
小组:BLACK PANDA 时间:2019.11.25 每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 实现文章展示页面 完善后台的编辑功能接口 今天计划完成的工作 2 ...
- sql server一些快捷方式和操作技巧
1.注释(ctrl+k+c) 和 取消注释(ctrl+k+u) 2.行号显示,如图: