前言:本系列仅介绍基本大体的使用步骤,而不对每个步骤进行细致的讲解。读者可作为已经对相关内容有所了解后的快速查阅。

一、单应用内Service的使用

Service组件与Activity以IBinder为媒介进行通信。

1、Service组件

Service组件的实现步骤如下:

  1. 新建一个java类继承Service作为Service组件。实现Service组件需要如下几步
  2. 在AndroidMenifest文件中注册该组件。
  3. 通过重写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对象来提供服务接口。要达到这个目的需要如下几步;

  1. 新建一个类继承Binder类。
  2. 在该类中实现所有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相关部分。实现步骤如下:

  1. 创建Service组件的Intent对象。
  2. this.startService(intentService)启用Service组件
  3. 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端

  1. 在src目录下创建.aidl接口文件。创建后ADT会自动生成一个对应的.java文件。
  2. 在接口文件中添加需要提供的服务方法的声明。
  3. 接口文件自带一个Stub类,该类继承了Bundle。在Service组件中创建一个对象,该对象所属的类继承Stub类,需要实现接口文件中的服务方法。
  4. 将创建的对象作为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组件的实现方式十分接近,区别在于:

  1. 创建.aidl文件(与Service端的文件相同,文件所属包名也要与Service端一致)
  2. 通过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的更多相关文章

  1. Android service binder aidl 关系

    /********************************************************************************** * Android servic ...

  2. android service 的各种用法(IPC、AIDL)

    http://my.oschina.net/mopidick/blog/132325 最近在学android service,感觉终于把service的各种使用场景和用到的技术整理得比较明白了,受益颇 ...

  3. Android Service学习之AIDL, Parcelable和远程服务

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

  4. Android Service AIDL 远程调用服务 【简单音乐播放实例】

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

  5. Android Service总结06 之AIDL

    Android Service总结06 之AIDL 版本 版本说明 发布时间 发布人 V1.0 初始版本 2013-04-03 Skywang           1 AIDL介绍 AIDL,即And ...

  6. Android Service和Binder、AIDL

    1.首先理解service的作用和生命周期 由于activity如果切换,那么他就不再运行,那么我们想在玩游戏的时候听播放器中的音乐,activity就应运而生了,这是最常见的一种场景,同时servi ...

  7. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  8. Android 中的AIDL,Parcelable和远程服务

    Android 中的AIDL,Parcelable和远程服务      早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用    ...

  9. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

随机推荐

  1. jumpserver 资产管理及授权

    1.用户管理-添加[用户列表] 1.1点击创建用户 1.2创建用户 2.用户管理-添加[用户组] 2.1点击创建用户组 2.2创建用户组   3.资产管理添加资产 3.1添加节点 3.2添加资产(点击 ...

  2. 如何在 Chrome中导出、导入书签和密码

    目录 书签 密码 书签 1.导出 点击浏览器右上角的三小点,选择"书签",再选择"书签管理器",进入如下页面 点击蓝色书签栏右上角的三小点,选择"导出 ...

  3. 一分钟教你编写Linux全局内置命令

    前言:在linux命令使用中,有些命令总是又长又难记,就算是经常使用的命令每次都敲也真的很烦,所以今天教大家一个方法,来简化命令,创建我们自己的内建命令!!! 创建内置命令 创建命令存储目录 现在li ...

  4. pandas 初识(五)

    1. 如何实现把一个属性(列)拆分成多列,产生pivot,形成向量信息,计算相关性? 例: class_ timestamp count 0 10 2019-01-20 13:23:00 1 1 10 ...

  5. node、npm、chrome、v8、sandbox是什么?

    这些东西有些比较常用,有些仅知道个名称,但无论是熟悉还是陌生的,要比较精确地解释这些东西,是有一定的难度,可这些东西对前端开发非常重要,还是需要有明确的概念. PS:内容点到即止,不然一个东西一篇文章 ...

  6. SAP_ECC6_EHP7_IDES安装文档ORACLE11G+WINDOWS2012 R2 问题总结

    SAP_ECC6_EHP7_IDES安装文档ORACLE11G+WINDOWS2012 R2 问题总结 1.注意密码不能带@等特殊符号,否则会报如下错误,因为ORACLE数据是不容许密码带@的.@是一 ...

  7. Virtual Box复制虚拟机

    用惯了VM换BOX还是有点不大一样的,比如复制 我用了2个网卡,所以看起来麻烦了一次 注释了UUID 应该有更好的办法来操作,下面的看起来有点啰嗦,先凑合着这样弄... 1.关机 2.复制 3.改名称 ...

  8. ORA-00904:"WM_CONCAT":标识符无效

    原创 Oracle 作者:Root__Liu 时间:2019-11-21 18:49:27  514  0 今天客户现场业务甩给我一个报错让处理,ora-00904:"WM_CONCAT&q ...

  9. Python 的字符编码

    配置: Python 2.7 + Sublime Text 2 + OS X 10.10 本文意在理清各种编码的关系并以此解决 Python 中的编码问题. 1 编码基本概念 只有先了解字符表.编码字 ...

  10. 【oracle】PLS-00103: 出现符号 "end-of-file"

    begin xxxxx end; 修改xxxxx为xxxxx:就好了