【5】Android Service 与 AIDL

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

一、单应用内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() + "
" + "年龄:"   
                + person.getAge();   
        mAIDLView.setText(str);   
    } catch (RemoteException e) {   
        e.printStackTrace();   
    }          
        
} 



知识共享许可协议
作者:tangyikejun
本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

原文地址:https://www.cnblogs.com/tangyikejun/p/4070013.html