现在的位置: 首页 > 综合 > 正文

android aidl iBinder理解

2013年09月09日 ⁄ 综合 ⁄ 共 2663字 ⁄ 字号 评论关闭

在android中有一个程序员大量使用的操作,就是bindservice,通过一个service可以实现代码的复用以及解耦,所以对这个bindservice的理解的深度直接影响了一个开发人员对于android系统开发的整体的掌握情况。 

   
好啦,废话不多说,首先我们来看一个我开发过程中遇到的例子。
 

   
在开发中我们常常要用到这们一种情况,我们的UI逻辑和为UI逻辑提供服务的一些算法的是需要解耦的。这样,当我们UI和算法各自独立发生变化的时候,只 要接口没有改变,对于UI的开发人员和算法的开发人员来将,就可以不去考虑,这个对与开发的好处,我想不用多说了。
 

   
Android的Service是基于IBinder的, IBinder其实就是windows上的com,这个以后我会有详细的文章来解释。
 

   
要使用service首先要通过AndroidMainifest.xml注册,这样在安装你的包的时候,系统就会识别出你所编写的serice,这样就可以提供给别的应用使用了。
 

   
一个典型service的AndroidMainifest.xml如下:
 

          
<service android:name="your_service_name"
 
               
android:exported="true"
 
               
android:process="your_service_process_name">
 
               
<intent-filter>
 
                   
<action android:name="intent_string_to_start_your_service" />
 
                   
<category android:name="android.intent.category.DEFAULT" />
 
               
</intent-filter>
 
           
</service>
 

   
这个service域要放在xml文件的application域中,其中android:name的意思是你的service的名字,可以是你想要的任 意的字符串。android:process是当这个service被你的调用启动起来以后在系统中进程的名字。如果这个域没有写,那么默认的启动的是 local的service,就是将service放到本地进程的主线程中,如何你之定了一个进程的名字,那么系统就会启动一个独立的进程作为你的服务, 在shell中,通过ps就可以看到这个进程的名字。action android:name的意思是说那个Intent会启动这个service。
 


  
在添加了xml文件以后,就是正式的开写java的代码了。
 

  
首先,要创建一个aidl文件,熟悉windows上com的同志,看到这个名字都会会心的一笑,因为这个和windows上的midl是一样的,估计就 是一帮搞windows的人被google挖走了。android和根据这个aidl自动的声称一个infterface的文件做为service的接口 文件。
 

  
这里我提供一个例子:
 

  
package com.motorola.inputmethod.base;
 

  
interface IYourAidl {
 
     
int A(int i, in int[] j, out int[] k );
 
     
int B(int i, in int[] j, out int[] k );
 
 
}
 

 
在这里我们要注意的是你所定义的接口的变量的类型,android为一个他所默认的类型提供了相应的parcel服务类。如果你的参数的类型是一些 java的基本类型,或是string, arrayd等,是没有问题的,当如果参数是你自己定义的class类型,那么你就要写一个自己的parcel类了,这个以后我们还会说。还有就是,大家 看如果A中的参数是int这些简单的类型的,那么没问题,如果是像int[]这样的类型的话,那么你要在类型的情面加上in 或是 out来告诉系统这个是一个输入还是输出参数。
 

  
在写完aidl文件以后我们在添加一个对应与aidl文件的Android.mk文件。如下:
 

  
LOCAL_PATH:= $(call my-dir)
 
  
include $(CLEAR_VARS)
 

    
LOCAL_SRC_FILES := /
 
          
path_to_your_aidl_file/your_test.aidl
 
      
 
 
    
LOCAL_MODULE := com.android.youraidl
 

    
include $(BUILD_STATIC_JAVA_LIBRARY)
 



 OK,
在搞定aidl以后,我们开始实现一个使用这个aidl的service,其实一个service可以还有任何一个对象,不一定要含有aidl的,这里我 们只是使用了aidl作为service的一个对象,其实service是service,aidl是aidl,这个希望大家能够理解。
 

 
一个service如下:
 

 
import android.app.Service;
 

 
import path_to_your_aidl_file.IYourAidl;
 


 
public class your_service_name extends Service {
 


     
public void onCreate() {
 
       
super.onCreate();
 

       
log.d("service onCreate")
 

     
}
 

  

     
public void onDestroy() {
 

       
super.onDestroy();
 

       
log.d("service onDestroy")
 

     
}
 

   
 
 

     
private final IYourAidl.Stub mBinder = new IYourAidl.Stub(){
 

        
public int A(int i, in int[] j, out int[] k ){
 

           
log.d("aidl implimention do something in A");
 

        
}
 

        
public int B(int i, in int[] j, out int[] k ){
 

【上篇】
【下篇】

抱歉!评论已关闭.