文档章节

【专题】Android AIDL使用

老牟
 老牟
发布于 2014/04/30 10:24
字数 1025
阅读 427
收藏 0

文章不讲如何简单的创建AIDL,会使用项目中实际的例子来说如何使用,也方便了解了AIDL的同学却不知道在什么情况下使用的。    

先来了解下AIDL,英文全称叫Android Interface definition language,是Android系统内部进程通信接口的描述语言,它作为两个进程间通讯的接口。    

下面就来介绍一个项目中实际使用AIDL的例子。    

客户需求可以在第三方APP里调用系统设置的接口,如果要达到这个目的,由于是第三方APP(即使用Android SDK开发的APP),无法直接调用这些系统接口(包括权限问题,隐藏API问题),只有通过在系统设置里面创建AIDL服务接口,在第三方APP里面调用这些接口,就能实现客户的需求。    

那么AIDL工作的方式是什么呢?你可以理解为一个服务端,一个客户端,客户端请求服务端调用工作,如果有必要服务端还会调用客户端提供的接口。    

首先来看服务端该做什么

路径:/packages/apps/Settings

1 创建AIDL文件    

创建文件/packages/apps/Settings/src/com/xxx/agent/IExperienceAgentService.aidl    

package com.xxx.agent;

interface IExperienceAgentService {
    void setTimeZone(String timeZone);
}

2 创建文件 /packages/apps/Settings/src/com/xxx/agent/ExperienceAgentService.java (名字跟AIDL文件名没有直接关系,可以不同)    

package com.xxx.agent;

public class ExperienceAgentService extends Service {

    // AIDL文件接口实现
    public class ExperienceAgentServiceImpl extends IDoroExperienceAgentService.Stub {
        @Override
        public void setTimeZone(String timeZone) throwsRemoteException {
            Log.d(TAG, "timeZone="+timeZone);
            try {
                mAlarmManager.setTimeZone(timeZone);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public  IBinder onBind(Intent intent) {
        return newExperienceAgentServiceImpl ();
    }
}

好服务端代码基本上就写完了,然后编译,需要修改Android.mk文件    

添加     

LOCAL_SRC_FILES += \    

         src/com/xxx/agent/IExperienceAgentService.aidl

还需要在AndroidManifest.xml 里面注册创建的服务

添加    

 <service android:name="com.xxx.agent.ExperienceAgentService" >
     <intent-filter>
         <action android:name="com.xxx.agent.IExperienceAgentService" />  // action name 可以自定义
     </intent-filter>
 </service>

再来看看客户端该做什么,首先肯定需要启动绑定服务,然后再调用服务。

客户端包名 com.xxx.client

1 创建AIDL文件      

拷贝服务端创建的AIDL文件到客户端目录,路径 com/xxx/agent/IExperienceAgentService.aidl,注意包路径必须一样,文件内容也必须一样。      

2 绑定服务      

package com.xxx.client;

import com/xxx/agent/IExperienceAgentService;

public class Client extends Activity {
    private IExperienceAgentServicemService = null;
    private ServiceConnection mConnection = new ServiceConnection() {
         // 连接服务端成功
         public void onServiceConnected(ComponentName className, IBinder service) {
             IExperienceAgentServicemService  = IExperienceAgentService.Stub.asInterface(service);
         }
         //服务端连接断开
         public void onServiceDisconnected(ComponentName className) {
             IExperienceAgentServicemService  = null;
         }
    }
    @Override
    protected void onStart() {
        super.onStart();
        // 绑定服务,Intent 选择服务端AndroidManifest注册的action
        bindService(new Intent(”com.xxx.agent.IExperienceAgentService“, mConnection, Context.BIND_AUTO_CREATE);
    }
     @Override
    protected void onStop() {
        super.onStop();
        unbindService(mConnection);
    }
    @Override
    public void onClick(View v) {
        if (IExperienceAgentServicemService != null) {
            try {
               // 调用AIDI接口文件方法
               IExperienceAgentServicemService.setTimeZone("shanghai");
            } catch (RemoteException e) {
               e.printStackTrace();
            } 
        }
    }
}

至此,客户端代码也就编写完成了


下面在来看看服务端调用客户端提供的接口是怎么工作的呢 

服务端需要修改的如下 

1 创建AIDL文件      

创建文件/packages/apps/Settings/src/com/xxx/agent/ICallback.aidl      

package com.xxx.agent;

interface ICallback{
    void updateTimeZone(String timeZone);
}

修改/packages/apps/Settings/src/com/xxx/agent/IExperienceAgentService.aidl      

package com.xxx.agent;

import com.xxx.agent.ICallback;

interface IExperienceAgentService {
    void setTimeZone(ICallback cb, String timeZone);
}

修改/packages/apps/Settings/src/com/xxx/agent/ExperienceAgentService.java      

package com.xxx.agent;

public class ExperienceAgentService extends Service {

    // AIDL文件接口实现
    public class ExperienceAgentServiceImpl extends IDoroExperienceAgentService.Stub {
        @Override
        public void setTimeZone(ICallback cb, String timeZone) throwsRemoteException {
            Log.d(TAG, "timeZone="+timeZone);
            try {
                mAlarmManager.setTimeZone(timeZone);
            } catch (Exception e) {
                e.printStackTrace();
            }
            cb.updateTimeZone(timeZone);
        }
    }

    @Override
    public  IBinder onBind(Intent intent) {
        return newExperienceAgentServiceImpl ();
    }
}

客户端需要修改的如下      

1 拷贝服务端创建的ICallback.aidl文件到客户端目录,路径 com/xxx/agent/ICallback.aidl      

2 绑定服务      

package com.xxx.client;

import com/xxx/agent/IExperienceAgentService;
import com/xxx/agent/ICallback;

public class Client extends Activity {
    public class Callback extends ICallback.Stub
        @Override
        public void updateTimeZone(String timeZone) throwsRemoteException {
            Message msg = new Message();
            msg.obj = timeZone;
            mHandler.sendMessage(msg);
       }
    }

    @Override
    public void onClick(View v) {
        if (IExperienceAgentServicemService != null) {
            try {
               // 调用AIDI接口文件方法
               IExperienceAgentServicemService.setTimeZone(new Callback(), "shanghai");
            } catch (RemoteException e) {
               e.printStackTrace();
            } 
        }
    }
    
    private Handler mHandler = new Handler() {
        @Override 
        public void handleMessage(Message msg) {
             // 进行界面更新
        }
    }
}

至此AIDL服务端回调接口也已经完了。      

Google官方介绍链接:http://developer.android.com/guide/components/aidl.html 


© 著作权归作者所有

共有 人打赏支持
老牟
粉丝 14
博文 20
码字总数 8401
作品 0
成都
程序员
私信 提问
Android AIDL 远程服务器使用示例

很多网友来函表示对Android AIDL不是很理解,这里Android123准备了一个简单的例子,帮助大家了解Android上比较强大的远程服务设计吧。 一、为什么要使用AIDL,他的优势有哪些呢? AIDL服务更像...

阿酷
2011/10/21
1K
0
Android通过Aidl调用Service实例

最近在上Android课程,现在我懒得备课了,直接拿博客来讲好了! Aidl访问Service实例: Android中Activity与Service是属于两个不同的进程的,而两个进程之间的通讯除了可以用广播之外,最完美...

MingliC
2013/12/23
0
0
Android高手进阶教程(二十五)之---Android 中的AIDL!!!

大家好,好久不见,今天要给大家分享的是android aidl的使用。在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然,...

迷途d书童
2012/02/29
298
1
Android中aidl如何import文件

如果你做Android开发,那就应该会知道aidl工具的,但是会使用aidl命令行工具的人有吗有吗有吗,如果有的话你们为神马不出来写写怎么用!!!! 用aidl命令行的如果不出意外肯定会遇见类似这样...

华宰
2011/09/08
3.8K
0
简单音乐播放实例的实现,Android Service AIDL 远程调用服务

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

baisou
2013/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GO redis 相关操作

在gopath 目录下安装 go get github.com/garyburd/redigo/redis package mainimport ("fmt""github.com/garyburd/redigo/redis")//定义一个全局链接池变量var pool *redis.Pool//......

汤汤圆圆
38分钟前
9
0
java8性特性,常用的lambda表达式

1、抽取多个对象中的某个属性,用数组接收 List<Student> students = new ArrayList<>(); List<String> names =students.stream().map(Student::getName).collect(Collectors.toList()); 2、......

Boss-x
39分钟前
11
0
flutter 子组件与父组件

无论是子组件还是父组件,任何时候initState()只执行一次,如果需要判断 就在build里面进行,不然无效的。

大灰狼wow
41分钟前
4
0
Rancher Labs引入全球首个多集群、多租户的Prometheus支持!

近日,Rancher Labs宣布加强对Prometheus的支持,提高Kubernetes集群的可见度。Rancher也因此成为唯一一个在多集群、多租户环境中支持Prometheus的解决方案。 Prometheus正迅速成为监控云原生...

RancherLabs
44分钟前
6
0
vue项目中api接口管理总结

默认vue项目中已经使用vue-cli生成,安装axios,基于element-ui开发,axiosconfig目录和api目录是同级,主要记录配置的相关。 1. 在axiosconfig目录下的axiosConfig.js import Vue from 'vue...

peakedness丶
46分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部