Android中AIDL的简单使用

移动开发 Android
本文通过一个Android中AIDL与service通信的小demo,让刚刚接触这方面的初学者能够对AIDL的简单使用有一个入门级别的的认识。

AIDL这里就不加累述它的概念定义等等,免得长篇大幅。下面介绍的是简单的一次使用AIDL成功与service通信的一个例子:

1.在项目包下新建一个IInfo.aidl,并在其中添加你要调用的方法,格式和java中接口一样。package com.android.server;

interface IInfo {  
    boolean start(); 
    void stop(); 
    void locate(int x, int y); 
    void move(int dx, int dy); 
    void getLocation(inout int[] p);//参数为数组的话,可以加上inout,不然会报错 
    void setTimeout(int t); 
    int getTimeout(); 
    void setBitmap(inout byte[] bmp, int width, int height);}   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

正确写好之后,eclipse的adt会自动在gen目录下生成一个IInfo.java文件

2.新建一个CursorService.java类,继承IInfo.stub,如下:

package com.android.server; 
public class CursorService extends ICursorInfo.Stub{ 
    final boolean hasService; 
    public CursorService() { 
        hasService = initializeJNI(); 
    } 
    public synchronized boolean start() { 
        if (hasService) 
            return start0(); 
        return false
    } 
    public synchronized void stop() { 
        if (hasService) 
            stop0(); 
    } 
    public synchronized void locate(int x, int y) { 
        if (hasService) 
            locate0(x, y); 
    } 
  
    public synchronized void move(int dx, int dy) { 
       if (hasService) 
           move0(dx, dy); 
    } 
  
    public synchronized void getLocation(int[] p) { 
        if (p == null
            throw new NullPointerException("p is null"); 
        if (p.length < 2
            throw new IllegalArgumentException("p.len must >= 2"); 
        if (hasService) 
            getPosition0(p); 
    } 
    public synchronized void setTimeout(int t) { 
        if (hasService) 
            setTimeout0(t); 
    } 
  
    public synchronized int getTimeout() { 
        if (hasService) 
            return getTimeout0(); 
        return -1
    } 
  
    public void setBitmap(byte[] bmp, int width, int height) { 
        if(bmp == null
            throw new NullPointerException("bmp is null"); 
        if(width < 0 || height < 0
           throw new IllegalArgumentException("width < 0 || height < 0"); 
       if(width * height > bmp.length) 
            throw new IndexOutOfBoundsException("bmp less than width*height"); 
        setBitmap0(bmp,width,height); 
    } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.

在其中实现你aAIDL中的方法

3. 新建一个Manager类,在其中构造一个内部服务连接类,实现ServiceConnection接口:

public class Manager { 
    private static final String TAG = "Manager"
    private IInfo   iCurSer; 
    private Manager(){ 
    } 
      
    public Manager(Context ctx){ 
        this.context = ctx; 
        new Manager(); 
    } 
      
       /**这里就可以与service正常通信,调用service中的方法**/ 
    public void startService(){ 
        Intent intent=new Intent("com.android.server.CursorService"); 
        context.bindService(intent,new CursorServiceConnection(), 
                Service.BIND_AUTO_CREATE); 
    } 
    /** 
     * 实现ServiceConnection接口 
     * */ 
    public final class CursorServiceConnection implements ServiceConnection{ 
       // 和CursorService绑定时系统回调这个方法 
        @Override 
        public void onServiceConnected(ComponentName name, IBinder service) { 
           // 此处不能使用强制转换, 应该调用Stub类的静态方法获得CursorService接口的实例对象 
           iCurSer=ICursorInfo.Stub.asInterface(service); 
        } 
  
        //解除和CursorService的绑定时系统回调这个方法 
        @Override 
        public void onServiceDisconnected(ComponentName name) { 
            iCurSer=null
        } 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

Android中AIDL的简单使用就mark到这吧,希望对刚刚学Android的开发者能有些帮助。

责任编辑:闫佳明 来源: oschina
相关推荐

2013-03-28 13:14:45

AIDL进程间通信Android使用AI

2023-11-06 08:22:34

AIDLAndroid通信

2014-07-17 11:36:27

Android Stu使用教程

2017-03-29 15:20:25

AndroidRootTools框架

2011-06-01 13:22:25

Android Alarm

2011-05-27 11:34:53

Android preference

2010-01-25 17:53:35

Android Lis

2011-09-02 19:12:59

IOS应用Sqlite数据库

2016-10-20 08:46:17

2009-05-30 09:29:52

AndroidGoogle移动OS

2023-12-04 07:18:05

Goswitch

2021-06-30 07:19:36

Netty简单使用

2010-08-29 21:17:48

DHCP中继

2021-08-20 14:27:50

鸿蒙HarmonyOS应用

2024-10-14 16:25:59

C#线程锁代码

2024-12-05 08:58:47

2011-06-02 10:37:02

Android 对话框

2013-03-27 09:47:01

Android开发SQAndroid SDK

2009-12-22 10:46:35

2013-06-13 10:29:39

CasperJS测试UI测试
点赞
收藏

51CTO技术栈公众号