实现步骤
1.建立一个aidl文件,在里面定义好接口,注意里面不能写public修饰符,同接口一样,包名要一致.

package com.systemset.aidl;
interface ILight {
int getScreenBrightness();
void setScreenBrightness(int value);
int getScreenOffTimeout();
void setScreenOffTimeout(int value);
}

2.实现服务端进程,提供对应的功能.

Build生成对应的java文件(自动生成的java文件在/gen/yourPackage中),里面包含了一个内部类Stub,写一个Service子类,并在内部继承Stub类,实现对应的功能.
// ILight.java

package com.systemset.aidl;
public interface ILight extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.systemset.aidl.ILight
{
private static final java.lang.String DESCRIPTOR = "com.systemset.aidl.ILight";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.systemset.aidl.ILight interface,
* generating a proxy if needed.
*/
public static com.systemset.aidl.ILight asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.systemset.aidl.ILight))) {
return ((com.systemset.aidl.ILight)iin);
}
return new com.systemset.aidl.ILight.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_getScreenBrightness:
{
data.enforceInterface(DESCRIPTOR);
int _result = this.getScreenBrightness();
reply.writeNoException();
reply.writeInt(_result);
return true;
}
case TRANSACTION_setScreenBrightness:
{
data.enforceInterface(DESCRIPTOR);
int _arg0;
_arg0 = data.readInt();
this.setScreenBrightness(_arg0);
reply.writeNoException();
return true;
}
case TRANSACTION_getScreenOffTimeout:
{
data.enforceInterface(DESCRIPTOR);
int _result = this.getScreenOffTimeout();
reply.writeNoException();
reply.writeInt(_result);
return true;
}
case TRANSACTION_setScreenOffTimeout:
{
data.enforceInterface(DESCRIPTOR);
int _arg0;
_arg0 = data.readInt();
this.setScreenOffTimeout(_arg0);
reply.writeNoException();
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements com.systemset.aidl.ILight
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public int getScreenBrightness() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_getScreenBrightness, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
@Override public void setScreenBrightness(int value) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(value);
mRemote.transact(Stub.TRANSACTION_setScreenBrightness, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
@Override public int getScreenOffTimeout() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_getScreenOffTimeout, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
@Override public void setScreenOffTimeout(int value) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(value);
mRemote.transact(Stub.TRANSACTION_setScreenOffTimeout, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
}
static final int TRANSACTION_getScreenBrightness = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_setScreenBrightness = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
static final int TRANSACTION_getScreenOffTimeout = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
static final int TRANSACTION_setScreenOffTimeout = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
}
public int getScreenBrightness() throws android.os.RemoteException;
public void setScreenBrightness(int value) throws android.os.RemoteException;
public int getScreenOffTimeout() throws android.os.RemoteException;
public void setScreenOffTimeout(int value) throws android.os.RemoteException;
}

// LightService.java

package com.systemset.aidl;

import static android.util.Log.d;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException; import com.apical.systemset.util.SetManager; public class LightService extends Service { private static final String TAG = "debug";
private LightServer mLightServer; public LightService() {
} @Override
public IBinder onBind(Intent intent) {
if (mLightServer == null)
mLightServer = new LightServer();
d(TAG, "LightService: onBind");
return mLightServer;
} @Override
public boolean onUnbind(Intent intent) {
d(TAG, "LightService: onUnbind");
mLightServer = null;
return super.onUnbind(intent);
} public class LightServer extends ILight.Stub { @Override
public int getScreenBrightness() throws RemoteException {
int value = SetManager.getInstance().getScreenBrightness(
LightService.this);
d(TAG, "LightServer: call getScreenBrightness! return value is "
+ value);
return value;
} @Override
public void setScreenBrightness(int value) throws RemoteException {
d(TAG, "LightServer: call setScreenBrightness.value is " + value);
SetManager.getInstance().setScreenBrightness(LightService.this,
value);
} @Override
public int getScreenOffTimeout() throws RemoteException {
int value = SetManager.getInstance().getScreenOffTimeout(
LightService.this);
d(TAG, "LightServer: call getScreenOffTimeout! return value is "
+ value);
return value;
} @Override
public void setScreenOffTimeout(int value) throws RemoteException {
d(TAG, "LightServer: call setScreenOffTimeout.value is " + value);
SetManager.getInstance().setScreenOffTimeout(LightService.this,
value);
}
} public static int getScreenBrightness(Context context) {
int light = 0;
try {
light = Settings.System.getInt(context.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS);
} catch (SettingNotFoundException e) {
d(TAG, "SystemManager:", e);
}
return light;
} public static void setScreenBrightness(Context context, int value) {
Settings.System.putInt(context.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, value);
} public static int getScreenOffTimeout(Context context) {
int time = 0;
try {
time = Settings.System.getInt(context.getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT);
} catch (SettingNotFoundException e) {
d(TAG, "SystemManager:", e);
}
return time;
} public static void setScreenOffTimeout(Context context, int value) {
Settings.System.putInt(context.getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT, value);
}
}

// 在AndroidManifest.xml中注册服务

<service
android:name="com.systemset.aidl.LightService"
android:process=":remote"
android:exported="true" >
<intent-filter>
<action android:name="com.apical.systemset.aidl.LightService" />
</intent-filter>
</service>

3.实现客户端进程,提供对应的功能.
  将aidl文件拷贝到客户端进程中,注意包名需要一致.同样Build之后,会生成对应的java文件.使用bindService启动服务,在ServiceConnection的
onServiceConnected函数中使用Stub.asInterface(binder)取得对象.

Intent intent = new Intent();
intent.setAction("com.apical.systemset.aidl.LightService");
// 不能调用setPackage,否则会出现如下错误
// Unable to start service Intent { act=com.apical.systemset.aidl.LightService pkg=com.diysoul.aidlclient } U=0: not found
// intent.setPackage(getPackageName());
boolean bindResult = bindService(intent, mServiceConnection,
Context.BIND_AUTO_CREATE);
// ServiceConnection对象定义如下
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName componentName) {
d(TAG, "ServiceConnection componentName:" + componentName);
mLight = null;
}
@Override
public void onServiceConnected(ComponentName componentName,
IBinder binder) {
d(TAG, "ServiceConnection componentName:" + componentName);
mLight = ILight.Stub.asInterface(binder);
try {
int screenBrightness = mLight.getScreenBrightness();
int ScreenOffTimeout = mLight.getScreenOffTimeout();
d(TAG, "client getScreenBrightness = " + screenBrightness);
d(TAG, "client getScreenOffTimeout = " + ScreenOffTimeout);
} catch (RemoteException e) {
d(TAG, "", e);
}
}
};

// MainActivity.java

package com.diysoul.aidlclient;

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 static android.util.Log.d;
import com.systemset.aidl.ILight; public class MainActivity extends Activity { private static final String TAG = "debug";
private ILight mLight; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Intent intent = new Intent();
intent.setAction("com.apical.systemset.aidl.LightService");
// Unable to start service Intent { act=com.apical.systemset.aidl.LightService pkg=com.diysoul.aidlclient } U=0: not found
// intent.setPackage(getPackageName());
boolean bindResult = bindService(intent, mServiceConnection,
Context.BIND_AUTO_CREATE);
d(TAG, "bindResult:" + bindResult);
d(TAG, "mLight:" + mLight);
} @Override
protected void onDestroy() {
super.onDestroy();
unbindService(mServiceConnection);
} private ServiceConnection mServiceConnection = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName componentName) {
d(TAG, "ServiceConnection componentName:" + componentName);
mLight = null;
} @Override
public void onServiceConnected(ComponentName componentName,
IBinder binder) {
d(TAG, "ServiceConnection componentName:" + componentName);
mLight = ILight.Stub.asInterface(binder);
try {
int screenBrightness = mLight.getScreenBrightness();
int ScreenOffTimeout = mLight.getScreenOffTimeout();
d(TAG, "client getScreenBrightness = " + screenBrightness);
d(TAG, "client getScreenOffTimeout = " + ScreenOffTimeout);
} catch (RemoteException e) {
d(TAG, "", e);
}
}
};
}

AIDL 简单实现的更多相关文章

  1. AIDL简单使用

    1.AIDL定义 AIDL是android interface definition language的缩写,它对android IPC组件Binder进行了封装.使用它不需理会底层IPC的实现,只需 ...

  2. Android的IPC机制(一)——AIDL的使用

    综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道. ...

  3. AIDL旅行记之开篇AIDL基本介绍

    嗨,伙伴们,计划了一周的想法最终要在这一刻实现了. 一直都想写一个博客专栏,但是总是鼓不起勇气来写.感觉自己的水量还不太够.哈哈.这次下定决心,与小伙伴们一起分享下Android中的AIDL,从此,也 ...

  4. android跨进程通信(IPC)——AIDL

    转载请标明出处: http://blog.csdn.net/sinat_15877283/article/details/51026711: 本文出自: [温利东的博客] 近期在看 @任玉刚 大神编写 ...

  5. (转载)Android中的Service:Binder,Messenger,AIDL(2)

    前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ...

  6. Android艺术开发探索——第二章:IPC机制(下)

    Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...

  7. Android进程间通信IPC

    一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...

  8. IPC 简说

    IPC(inter-process communication)进程间通信 多进程分为两种情况 1. 同一个应用,使用android:process属性启动的四大组件 2. 多应用 通过android ...

  9. i.mx6 Android5.1.1 vibrator系统服务流程

    0. 概述 0.1 小结 下面来从APP一直分析到kernel的driver,因为vibrator是我所知的最简单的系统服务,分析过程过来,可以获取整个安卓服务的运行思路,把相关知识点都串联起来,又不 ...

随机推荐

  1. 人脸识别 ArcFace Demo [Windows]

    Arcsoft ArcfaceDemo for Windows, VS2013 C++   使用虹软技术开发完成 使用步骤: 1.下载SDK包,32位Windows平台将五个SDK包里lib中的文件到 ...

  2. vue 与jq 的对比

    vue.react和angular,众所周知,他们是前端框架的3个大佬.这篇主要想对比一下用vue和用jq的区别,至于和其他框架的对比,我想vue的官网说的更为详细. 我算是独自用vue写过一个小型项 ...

  3. C++ 学习笔记之——字符串和字符串流

    1. 字符数组 字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '\0'.C++ 已经提供了一些字符串处理函数,这些函数被封装在头文件 和 <string.h> 中. ...

  4. [C++] in-class initializer

    C++11 introduced serveral contructor-related enhancements including: Class member initializers Deleg ...

  5. URAL 1519 Formula 1(插头DP,入门题)

    Description Background Regardless of the fact, that Vologda could not get rights to hold the Winter ...

  6. HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)

    Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...

  7. POJ 1639 Picnic Planning(最小度限制生成树)

    Description The Contortion Brothers are a famous set of circus clowns, known worldwide for their inc ...

  8. jQuery实现仿京东商城图片放大镜

    效果图: 不废话直接上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. 由作业题引发对C++引用的一些思考

    首先分析一段代码: #include <bits/c++config.h> #include <ostream> #include <iostream> #incl ...

  10. 用URL传参带特殊字符,特殊字符丢失

    文章:URL中编码URL特殊字符 文章:用URL传参带特殊字符,特殊字符丢失(encode) 如果url中有特殊字符,需要对url进行编码,否则特殊字符丢失,导致最终接收到的值不对.