1.AIDL是什么?

AIDL全称是Android Interface Definition Language,即安卓接口定义语言。

2.AIDL是用来做什么的?(为什么要有AIDL)

AIDL是用来进行进程间通信(IPC全称interprocess communication )的。

3.如何使用AIDL?

对于AIDL的使用,

服务端需要完成的任务是:

①.写一个xxxx.aidl文件

②.写一个Service并在AndroidManifest.xml中声明它。(注意:这个service里面有一个引用了实现xxxx.Stub抽象类的IBinder对象,这个对象将在service的onBind方法里面返回给调用者)

客户端的任务:

①.使用和服务端相同的那个aidl文件

②.在实现了ServiceConnection接口的onServiceConnected(ComponentName name, IBinder service)方法中调用myvar = testidl.Stub.asInterface(service)保存得到的对象,其中myvar是xxxx的类型

这么说还是不够清楚,下面直接上代码。

首先是服务端的

//testidl.idl文件的内容
package com.example.xxnote; interface testidl {
void TestFunction(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}

 

//myaidlservice.java文件的内容
package com.example.xxnote; import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException; public class myaidlservice extends Service { private final IBinder myStub = new testidl.Stub() { @Override
public void TestFunction(int anInt, long aLong, boolean aBoolean,
float aFloat, double aDouble, String aString)
throws RemoteException {
// TODO Auto-generated method stub
System.out.println("basicTypes()");
System.err.println("Service"+anInt + "," + aLong + "," + aBoolean + ","
+ aFloat + "," + aDouble + "," + aString);
}
}; @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("AIDL Service onBind, and return IBinder");
return myStub;
} @Override
public void onCreate() {
// TODO Auto-generated method stub
System.out.println("AIDL Service onCreate");
super.onCreate();
} @Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("AIDL Service onUnbind");
return super.onUnbind(intent);
} @Override
public void onDestroy() {
// TODO Auto-generated method stub
System.out.println("AIDL Service onDestroy");
super.onDestroy();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println("AIDL Service onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
}

 

 <!--  AndroidManifest.xml 的 application 标签的内容-->
<service android:name="myaidlservice">
<intent-filter >
<action android:name="zhenshi.mafan.qisia.aidl"/>
</intent-filter>
</service>

对于客户端,首先需要把aidl文件复制到相应的目录本例中是src/com/example/xxnote/testidl.aidl

package com.example.xxnote.callaidl;

import com.example.xxnote.testidl;

import android.R.bool;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class MainActivity extends Activity { private testidl mytTestidl;
private ServiceConnection connection;
private boolean isServiceConnected;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connection = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("Client onServiceDisconnected");
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
System.out.println("Client onServiceConnected");
mytTestidl = testidl.Stub.asInterface(service);
isServiceConnected = true;
}
};
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
    
//关闭服务按钮的事件
public void StopMyService(View v) {
System.out.println("StopMyService");
isServiceConnected = false;
unbindService(connection);
mytTestidl = null;
}
     //开启服务按钮的事件
public void StartMyService(View v) {
System.out.println("before bindService()");
bindService(
new Intent().setAction("zhenshi.mafan.qisia.aidl"),
connection,
Context.BIND_AUTO_CREATE);
/**
* bindService是异步的所以执行bindService方法的同时也开始执行下面的方法了,
* Debug跟踪了一下程序发现貌似Activity里面所有的方法都是在主线程的loop()方法
* 循环里面以消息队列里面的一个消息的样子执行的,也就是此处的StartMyService方
* 法对应的消息处理完(此函数返回)后,才能处理下一个消息,即执行onServiceConnected回调方法
*
* 试验了一下,StopMyService里面把mytTestidl赋值为null,即每次解除服务绑定后都重置mytTestidl为null
* 果然每次下面的语句:
* mytTestidl.basicTypes(1, 1, true, 100.0f, 200.0, "ssss");
* 都报空指针异常
*/ try {
mytTestidl.TestFunction(1, 1, true, 100.0f, 200.0, "ssss");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

  

这里还有一个需要注意的地方,就是bindService方法 的时候用到的intent,通过setAction可以成功启动服务,用setClassName就不能,不知道什么原因,暂时留待以后解决。

找到原因了,用setClassName的时候必须使用全限定类名,如:new Intent().setClassName("com.example.client.callaidl", "com.example.client.callaidl.testact")

 

安卓中AIDL的使用方法快速入门的更多相关文章

  1. laravel 中CSS 预编译语言 Sass 快速入门教程

    CSS 预编译语言概述 CSS 作为一门样式语言,语法简单,易于上手,但是由于不具备常规编程语言提供的变量.函数.继承等机制,因此很容易写出大量没有逻辑.难以复用和扩展的代码,在日常开发使用中,如果没 ...

  2. 安卓中onBackPressed ()方法的使用

    一.onBackPressed()方法的解释 这个方法放在 void android.app.Activity.onBackPressed() 在安卓API中它是这样解释的: public void ...

  3. Python中的单元测试模块Unittest快速入门

    前言 为什么需要单元测试? 如果没有单元测试,我们会遇到这种情况:已有的健康运行的代码在经过改动之后,我们无法得知改动之后是否引入了Bug.如果有单元测试的话,只要单元测试全部通过,我们就可以保证没有 ...

  4. Java中23种设计模式--超快速入门及举例代码

    在网上看了一些设计模式的文章后,感觉还是印象不太深刻,决定好好记录记录. 原文地址:http://blog.csdn.net/doymm2008/article/details/13288067 注: ...

  5. Python中定时任务框架APScheduler的快速入门指南

    前言 大家应该都知道在编程语言中,定时任务是常用的一种调度形式,在Python中也涌现了非常多的调度模块,本文将简要介绍APScheduler的基本使用方法. 一.APScheduler介绍 APSc ...

  6. webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包

    随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...

  7. webpack快速入门——CSS中的图片处理

    1.首先在网上随便找一张图片,在src下新建images文件夹,将图片放在文件夹内 2.在index.html中写入代码:<div id="pic"></div& ...

  8. webpack快速入门——处理HTML中的图片

    在webpack中是不喜欢你使用标签<img>来引入图片的,但是我们作前端的人特别热衷于这种写法, 国人也为此开发了一个:html-withimg-loader.他可以很好的处理我们在ht ...

  9. Redis快速入门:安装、配置和操作

    本文是有关Redis的系列技术文章之一.在之前的文章中介绍了<Redis快速入门:初识Redis>,对Redis有了一个初步的了解.今天继续为大家介绍Redis如何安装.配置和操作. 系列 ...

随机推荐

  1. Laravel中的ajax跨域请求

    最近接触Laravel框架ajax跨域请求的过程中遇到一些问题,在这里做下总结. 一开始发起ajax请求一直报500错误,搜索相关资料后发现Laravel要允许跨域请求可以加入Cors中间件,代码如下 ...

  2. MVC跨域CORS扩展

    一般的基于浏览器跨域的主要解决方法有这么几种:1.JSONP       2.IFrame方式    3.通过flash实现  4.CORS跨域资源共享  ,这里我们主要关注的是在MVC里面的CORS ...

  3. list,tuple,dict,set常用方法

    Python中list,tuple,dict,set常用方法 collections模块提供的其它有用扩展类型 from collections import Counter from collect ...

  4. redis分片

    本文是在window环境下测试 什么是分片 当数据量大的时候,把数据分散存入多个数据库中,减少单节点的连接压力,实现海量数据存储 那么当多个请求来取数据时,如何知道数据在哪个redis呢,redis有 ...

  5. 移动端开发viewport深入理解(转)

    一.viewport的概念   移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,就是浏览器上用来显示网页的那部分区域,但viewport不局限于浏览器可视区域 的大小,它 ...

  6. windows多线程编程

    进程共同实现某个任务或者共享计算机资源, 它们之间存在两种关系: 1.同步关系, 指为了完成任务的进程之间, 因为需要在某些位置协调它们的执行顺序而等待, 传递消息产生的制约关系. 2.互斥关系, 进 ...

  7. Scala中None, Nil, Nothing的区别

    Nil是一个空的List None是一个object,是Option的子类型 List[Nothing]

  8. javascript 原型查找 再次试探~

    前言 我们知道 对象字面量 是没有能力去查找自己原型的,它必须通过他的构造器来完成原型查找, 1本文将测试以下 a,new这个对象 之前/之后 改变构造器的原型,使其指向其他构造器的原型 b,new这 ...

  9. 利用django创建一个投票网站(一)

    这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...

  10. Pitfalls: C++ 中的index运算符

    名可名, 非常名 在调一个题目的过程中发现了一个之前从未意识到的问题. 考虑如下代码 vector<int> a; int f(int x){ a.push_back(x); return ...