• 【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 国际许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

  • 相关阅读:
    数组中找出最小的K个数
    温故而知新---Java(一)
    写一手简洁的代码
    同步IO与同步非阻塞IO的理解
    旋转打印矩阵
    求仅出现一次的最早字符
    spring 自定义schema 加载异常 White spaces are required between publicId and systemId.
    Java位运算知识点整理
    Idea 插件开发之DubboInvoke实践
    pinpoint插件开发实践
  • 原文地址:https://www.cnblogs.com/tangyikejun/p/4070013.html
Copyright © 2020-2023  润新知