文档章节

android Service学习之AIDL

二进制的忧伤
 二进制的忧伤
发布于 2015/01/08 14:26
字数 845
阅读 92
收藏 1

1、什么是AIDL?

FAQ:百度百科上给出的解释:

Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。

为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。

2、如何创建一个简单的AIDL项目?

FAQ:这里给出在eclipse环境下创建生成AIDL的实例,ADDService是服务端,提供实现加法的运算方法,ADDClient是客户端去调用服务端的方法,给出计算结果。

ADDService工程视图:

ADDClient工程视图:

实现步骤:

(1)创建一个ADDService android工程,并在com.example.aidl包下实现名为AddOp.aidl的接口,实现类似java接口实现。

package com.example.aidl;
interface AddOp { // 除了没有访问权限,其他和接口定义差不多
 int addService(int a, int b);
}

编译后会自动生成这个文件:

    这个里面的代码是使用代理模式来实现的,我们一般是定义该接口的静态内部类Stub的asInterface()方法,返回我们的接口。

(2) 建立一个服务类AddOpService.java,并在其中实现了由aidl文件生成的java接口:

 public class AddOpService extends Service {
 private static final String TAG = "AddOpService";
 private IBinder binder = new AddOpBinder();
 @Override
 public IBinder onBind(Intent intent) {
  Log.i(TAG, "onBind...");
  return binder;
 }
 @Override
 public void onCreate() {
  super.onCreate();
  Log.i(TAG, "onCreate...");
 }
 // 服务提供的方法通过Binder对象提供给外部
 private int add(int a, int b) {
  Log.i(TAG, "add...a = " + a + ";b = " + b);
  return a + b;
 }
 class AddOpBinder extends AddOp.Stub {// 继承aidl生成的存根
  @Override
  public int addService(int a, int b) throws RemoteException {// 实现次方法
   return add(a, b);// 调用实现的方法
  }
 }
}

(3) 配置ADDService工程的AndroidManifest.xml,设置Service隐式启动的action:

<service android:name="com.example.addservice.AddOpService" >
            <intent-filter>
                <action android:name="com.example.aidl.AddOp.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>

至此ADDService开发完毕,接下来开发ADDClient工程;

(4) 将ADDService下的aidl整个包com.example.aidl拷贝到ADDClient下如上面ADDClient工程视图所示;

(5) 调用AddOp.java中的addService(int a, int b)方法去得出结果:

public class MainActivity extends Activity {
 private static final String TAG = "MainActivity";
 private EditText a, b;
 private TextView c;
 private Button add;
 private AddOp addOp;
 private ServiceConnection conn = new AddOpServiceConnection();
 private static final String MY_ACTION = "com.example.aidl.AddOp.MY_ACTION";
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Log.i(TAG, "onCreate");
  a = (EditText) findViewById(R.id.a);
  b = (EditText) findViewById(R.id.b);
  c = (TextView) findViewById(R.id.c);
  add = (Button) findViewById(R.id.add);
  Intent intent = new Intent();
  intent.setAction(MY_ACTION);
  bindService(intent, conn, BIND_AUTO_CREATE);// 绑定服务
  add.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    int addResult;
    try {
     addResult = addOp.addService(Integer.parseInt(a.getText().toString()),
       Integer.parseInt(b.getText().toString()));
     c.setText("" + addResult);
    } catch (Exception e) {
    }
   }
  });
 }
 class AddOpServiceConnection implements ServiceConnection {
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   Log.i(TAG, "onServiceConnected");
   addOp = AddOp.Stub.asInterface(service); // 将IBinder转换成接口类型
  }
  @Override
  public void onServiceDisconnected(ComponentName name) {
   Log.i(TAG, "onServiceDisconnected");
   addOp = null;
  }
 }
}

至此,整个AIDL项目开发完毕,将两个APK安装到机器上,运行ADDClient这个APK,即可调用ADDService去实现简单的两个整数相加!

© 著作权归作者所有

二进制的忧伤
粉丝 9
博文 19
码字总数 16902
作品 0
深圳
程序员
私信 提问
Android AIDL 远程服务器使用示例

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

阿酷
2011/10/21
1K
0
Android AIDL远程服务使用示例

Android AIDL远程服务使用示例 了解Android上比较强大的远程服务设计。 一、为什么要使用AIDL,他的优势有哪些呢? AIDL服务更像是 一个Server,可以为多个应用提供服务。由于使用了IDL这样类...

android技术开发
2013/08/15
537
0
android基础知识05:四大组件之service 02:远程调用

本文主要介绍service相关内容。包括两篇文章: android基础知识05:四大组件之service 01 android基础知识05:四大组件之service 02:远程调用 android基础知识05:四大组件之service 03:实...

迷途d书童
2012/03/23
356
0
Android Service学习之AIDL, Parcelable和远程服务

AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空...

eric_zhang
2011/08/01
1K
1
Android通过Aidl调用Service实例

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

MingliC
2013/12/23
428
0

没有更多内容

加载失败,请刷新页面

加载更多

sync 包讲解

sync.Once Once 的作用是多次调用但只执行一次,Once 只有一个方法,Once.Do(),向 Do 传入一个函数,这个函数在第一次执行 Once.Do() 的时候会被调用,以后再执行 Once.Do() 将没有任何动作...

李琼涛
4分钟前
1
0
java中的byte占一字节或4字节

https://www.jianshu.com/p/2f663dc820d0

南桥北木
18分钟前
2
0
Cassandra 常用命令

Linux控制台命令 #进入Cassandra的安装目录 cd /home/db/cassandra/cassandra #进入Cassandra 无密码 ./bin/cqlsh localhost(IP)有密码 ./bin/cqlsh localhost(IP)-u 用户名 #显示所...

最菜最菜之小菜鸟
23分钟前
2
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
31分钟前
2
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
38分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部