了解AIDL
1、什么是AIDL?
Android Interface Definition Lauguage(android接口描述语言)是一个IDL语言。
2、AIDL的作用?
背景:在android平台 中,一个进程通常不能访问其它进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL工具可以来做这件事
作用:用来进行进程间通信,有很多人可能就会问到,进程间通信有很多方法,为什么非要用AIDL了?进程间通信的确有很多,如广播、Message,Content Provider。这些是可以进行进程间通信,但是广播是单向,Message只能在同一个进程通信,而不能跨进程通信,Content Provider不是实时的。而AIDL拥有这他们所没有的优点,双向和跨进程通信、实时。
那在什么情况下使用AIDL了?
官方文档介绍:
package com.test.service.aidl;
interface Manager{
float add(float num1,float num2);
}
写一个实现它的类ManagerImpl.java
package com.test.service.aidl;
public class ManagerImpl extends Manager.Stub{
@Override
public float add(float num1,float num2){
return num1 + num2;
}
}
写一个服务类MyService.java
package com.test;
import com.test.service.aidl.Manager;
import com.test.service.aidl.ManagerImpl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service{
private Manager.Stub binder;
public void onCreate(){
super.onCreate();
binder = new ManagerImpl();
System.out.println("---->onCreate");
Log.e("--->", "---->onCreate");
}
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("---->onStart");
return super.onStartCommand(intent, flags, startId);
}
//外界要想访问服务,是通过返回的binder访问的
@Override
public IBinder onBind(Intent arg0) {
return binder;
}
}
在AndroidMainfest.xml配置资源
android:process=":push"是另外一个进程
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"
android:process=":push" >
</service>
最后就写测试类了MainActivity.java
package com.test.ui.activity;
import com.test.service.aidl.Manager;
import com.test.MyService;
import com.test.R;
import com.test.service.aidl.ManagerImpl;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
public class MainActivity extends Activity {
private Manager binder;
private EditText etNum1,etNum2;
private TextView tvResult;
private ServiceConnection serviceConnect = new XmppServiceConnect();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("---->onCreate1");
init();
}
protected void onStart() {
super.onStart();
//活动开始时绑定MyService,就会自动调用serviceConnect
bindService(new Intent(this, MyService.class), serviceConnect, BIND_AUTO_CREATE);
}
private void init() {
etNum1 = (EditText)findViewById(R.id.etNum1);
etNum2 = (EditText)findViewById(R.id.etNum2);
tvResult = (TextView)findViewById(R.id.tvResult);
}
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnect);
}
public void btn_add_click(View v) throws RemoteException{
float num2 = Float.parseFloat(etNum2.getText().toString());
float num1 = Float.parseFloat(etNum1.getText().toString());
tvResult.setText(binder.add(num1, num2)+"");
}
private class XmppServiceConnect implements ServiceConnection {
//开始绑定服务时就执行下面的方法
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
binder = Manager.Stub.asInterface(iBinder);//特别注意这里iBinder是服务那边传过来的
}
//解绑时才调用
public void onServiceDisconnected(ComponentName componentName) {
binder = null;
}
}
}
界面就很简单了,两个EditText,一个TextView和一个Button
恩结束了,如果有错的地方,还希望有人指出来
了解AIDL的更多相关文章
- Android探索之AIDL实现进程间通信
前言: 前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreference,那么进程间怎么共享内存呢?Android系统中的进程之间不能共享内存,因此,需要提供 ...
- Android开发aidl使用中linkToDeath和unlinkToDeath的使用
1.Binder死亡代理 这一节首先将介绍Binder类中比较重要的两个方法linkToDeath和unlinkToDeath.我们知道Binder是运行在服务进程,若服务端进程因为某种原因“ ...
- android不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
- Android中利用AIDL机制调用远程服务
服务端: //CalculateInterface.aidl package com.itheima.aidl.calculate; interface CalculateInterface { do ...
- Android中AIDL的理解与使用(二)——跨应用绑定Service并通信
跨应用绑定Service并通信: 1.(StartServiceFromAnotherApp)AIDL文件中新增接口: void setData(String data); AppService文件中 ...
- Android中AIDL的理解与使用(一)——跨应用启动/绑定Service
AIDL(Android Interface Definition Language)--安卓接口定义语言 一.startService/stopService 1.同一个应用程序启动Service: ...
- 安卓中AIDL的使用方法快速入门
1.AIDL是什么? AIDL全称是Android Interface Definition Language,即安卓接口定义语言. 2.AIDL是用来做什么的?(为什么要有AIDL) AIDL是用来 ...
- make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 错误 1,make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 错误 1
错误3: g++: g++: selected multilib '32' not installed selected multilib '32' not installed make: *** [ ...
- 使用AIDL调用远程服务设置系统时间
在实际工作中,经常遇到客户需要用代码设置系统时间的需求,但是Android非系统应用是无法设置系统时间的.于是,我设计了一个使用系统签名的时间设置服务,客户通过bind调用服务里的方法就能达到设置时间 ...
随机推荐
- ORACLE中STATUS为INACTIVE但是SERVER为SHARED状态的会话浅析
我们知道当ORACLE数据库启用共享服务器模式时,通过共享服务器模式连接到数据库的会话是有一些特征的.在v$session里面,其SERVER的状态一般为SHARED和NONE, 为SHARED时,表 ...
- grep 查找bash脚本中的注释代码
出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...
- 换个角度看微信小程序[推荐]
去年参加几次技术沙龙时,我注意到一个有意思的现象:与之前大家统一接受的换名片不同,有些人并不愿意被添加微信好友--"不好意思,不熟的人不加微信". 这个现象之所以有意思,是因为名片 ...
- ReSharper详解Index0
JetBrains ReSharper可以帮助Visual Studio用户编写出更好的代码.支持对C#,VB.NET,XAML,JavaScript,TypeScript,JSON,XML,HTML ...
- emmet,jade,haml, slim,less,sass,coffeescript等的实战优缺点
摘要: 文章背景,来自于群内周五晚上的一次头脑风暴式的思维碰撞交流活动. 随着前端技术的蓬勃发展, 各种新技术随着生产力的需要不断的涌入我们的视野, 那今天探讨的话题是这些新时代的前端兵器谱: 一. ...
- ENode框架Conference案例分析系列之 - 文章索引
ENode框架Conference案例分析系列之 - 业务简介 ENode框架Conference案例分析系列之 - 上下文划分和领域建模 ENode框架Conference案例分析系列之 - 架构设 ...
- Java 8函数编程轻松入门(三)默认方法详解(default function)
default出现的原因 Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容. 在Java 8中为Collection接口增加了stream方法,这意味着所有实现 ...
- C# 云端-让http自动跳转到https链接
在项目的web.config下面加上下面的配置: <rewrite> <rules> <clear /> <rule name="Redirect ...
- Java发送Http请求并获取状态码
通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...
- 游戏服务器菜鸟之C#初探二游戏服务
经过短时间的折腾,为了解决上述问题,我对游戏进行一些简单的重构,以便能解决当前的瓶颈 添加了缓存服务器进行处理一些及时数据和配置数据,来缓解数据库的压力和IO的压力: 只能说解决当前的暂时性问题,但是 ...