1.定义aidl文件

a.ITestService.aidl

package com.open.aidl.service;

import com.open.aidl.service.ITestServiceCallback;

interface ITestService {

    void registerCallback(ITestServiceCallback cb);

    void unregisterCallback(ITestServiceCallback cb);

    int request(inout Bundle mBundle);
}
b.ITestServiceCallback.aidl
package com.open.aidl.service;

oneway interface ITestServiceCallback
{
void onResponse(inout Bundle mBundle);
}
2.定义Activity
<

package com.open.aidl;

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.util.Log;
import android.view.View;
import android.view.View.OnClickListener; import com.open.aidl.service.ITestService;
import com.open.aidl.service.ITestServiceCallback;
import com.open.aidl.service.TestService; public class MainActivity extends Activity { private final String TAG="MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); init();
} private void init()
{
findViewById(R.id.bindBtn).setOnClickListener(clickListener);
findViewById(R.id.unBindBtn).setOnClickListener(clickListener);
} View.OnClickListener clickListener=new OnClickListener() { @Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.bindBtn:
bind();
break; case R.id.unBindBtn:
unbind();
} }
}; private void bind()
{
Intent mIntent=new Intent(TestService.class.getName());
bindService(mIntent, mServerConnection, Context.BIND_AUTO_CREATE);
} private void unbind()
{
if(null!=mService)
{
try {
mService.unregisterCallback(mCallBack);
} catch (RemoteException e) {
e.printStackTrace();
}
unbindService(mServerConnection);
}
} @Override
protected void onDestroy() {
unbind();
super.onDestroy();
} private ITestService mService=null;
private ServiceConnection mServerConnection=new ServiceConnection()
{ @Override
public void onServiceDisconnected(ComponentName name) {
Log.v(TAG, "onServiceDisconnected");
mService=null;
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.v(TAG, "onServiceConnected");
mService=ITestService.Stub.asInterface(service);
try {
mService.registerCallback(mCallBack);
mService.request(null);
} catch (RemoteException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
}; private ITestServiceCallback mCallBack=new ITestServiceCallback.Stub() { @Override
public void onResponse(Bundle mBundle) throws RemoteException {
Log.v(TAG,"call from service");
}
};
}
3.定义Service.
package com.open.aidl.service;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.IInterface;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log; /**
* 后台服务类
* @author DexYang
*
*/
public class TestService extends Service { private final String TAG="TestService";
private Object mCallbacksLock=new Object(); private Handler mHandler=new Handler(); @Override
public void onCreate() {
super.onCreate();
Log.v(TAG, "onCreate()");
} @Override
public void onStart(Intent intent, int startId) {
Log.v(TAG, "onStart()");
handleCommand(intent);
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v(TAG, "onStartCommand()");
handleCommand(intent);
return START_STICKY;
} private void handleCommand(Intent intent)
{ } @Override
public IBinder onBind(Intent arg0) {
Log.v(TAG, "onBind()");
if(null!=arg0&&TestService.class.getName().equals(arg0.getAction()))
{
handleCommand(arg0);
}
return mBinder;
} @Override
public void onRebind(Intent intent) {
Log.v(TAG, "onRebind()");
if(TestService.class.getName().equals(intent.getAction()))
{
handleCommand(intent);
}
super.onRebind(intent);
} @Override
public boolean onUnbind(Intent intent) {
Log.v(TAG, "onUnbind()");
return true;
} @Override
public void onDestroy() {
Log.v(TAG, "onDestroy()");
mCallbacks.kill();
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
} /**
* Binder 相关
*/
private final CusRemoteCallbackList<ITestServiceCallback> mCallbacks= new CusRemoteCallbackList<ITestServiceCallback>();
private ITestService.Stub mBinder=new ITestService.Stub() { @Override
public int request(Bundle mBundle) throws RemoteException {
Log.v(TAG,"call from Activity request ");
mHandler.postDelayed(new Runnable(){ @Override
public void run() {
synchronized (mCallbacksLock)
{
int callbacksNum = mCallbacks.beginBroadcast();
for (int i=callbacksNum-1; i>=0; i--)
{
try {
mCallbacks.getBroadcastItem(i).onResponse(null);;
} catch (Exception e) {
e.printStackTrace();
}
}
mCallbacks.finishBroadcast();
}
} }, 3000);
return 0;
} @Override
public void registerCallback(ITestServiceCallback cb)
throws RemoteException {
Log.v(TAG,"registerCallback :");
if (cb != null)
{
mCallbacks.register(cb);
} } @Override
public void unregisterCallback(ITestServiceCallback cb)
throws RemoteException {
Log.v(TAG,"unregisterCallback :");
if (cb != null)
{
mCallbacks.unregister(cb);
}
} }; /**
* 经过测试onCallbackDied()方法,只有在bindService(),没有调用unbind()方法process就挂了的情况下才会执行
* @author Administrator
* @param <E>
*/
private class CusRemoteCallbackList<E extends IInterface> extends RemoteCallbackList<E>
{
@Override
public void onCallbackDied(E callback) {
Log.v(TAG, "CusRemoteCallbackList onCallbackDied 1");
super.onCallbackDied(callback); } @Override
public void onCallbackDied(E callback, Object cookie) {
Log.v(TAG, "CusRemoteCallbackList onCallbackDied 2"); super.onCallbackDied(callback, cookie);
}
} }
4.配置AndroidManifest.xml文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.open.aidl"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.open.aidl.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:label="TestService"
android:name="com.open.aidl.service.TestService"
android:process="com.open.aidl"
android:exported="true">
<intent-filter>
<action android:name="com.open.aidl.service.TestService"/>
</intent-filter>
</service>
</application> </manifest>

5.测试运行.


点击bind service ,
在TestService中 打印了call from Activity,说明Activity 调用 Service 成功;
3秒后在Activity中 打印了call from service,说明Service 调用 Activity 成功。 


Demo代码地址:http://download.csdn.net/detail/zz7zz7zz/6010119


邮箱:zz7zz7zz@163.com

微博:http://weibo.com/u/3209971935

[置顶] android AIDL 进程间通信的更多相关文章

  1. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  2. android aidl 进程间通信需要注意的地方(android.os.TransactionTooLargeException)

    转自:http://blog.sina.com.cn/s/blog_4e1e357d0102wau9.html 1.bus工程实现通过service实现aidl实体类 2.actor工程通过发起bin ...

  3. [置顶] Android AlarmManager实现不间断轮询服务

    在消息的获取上是选择轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了.但如果只是一般的消息检测比如更新检查,可能是半个小时或一个小时一 ...

  4. [置顶] Android开发之MediaPlayerService服务详解(一)

    前面一节我们分析了Binder通信相关的两个重要类:ProcessState 和 IPCThreadState.ProcessState负责打开Binder 驱动,每个进程只有一个.而 IPCThre ...

  5. [置顶] [Android源码分析]inquiry result引起的上层变化分析

    在上一篇文章中,我们详细分析了android是如何解析蓝牙反馈上来的搜索到的设备信息,本文将会继续分析这些信息到了上层之后是如何处理. 8.inquiry result引起的上层变化 我们知道inqu ...

  6. [置顶] Android的IPC访问控制设计与实现

    3.3.1 IPC钩子函数设计与实现 IPC Binder是Android最重要的进程间通信机制,因此,必须在此实施强制访问控制. 1. 修改secuirty.h 打开终端shell,输入指令“cd ...

  7. [置顶] Android四大组件之BroadcastReceiver

    Android四大组件之BroadcastReceiver Broadcast Receiver 广播接收器,是一种负责接收广播消息并对消息做出响应的组件,和Service一样并不提供与用户交互的UI ...

  8. [置顶] android开发之来电自动拒接并自动回复短信_上课模式app

    上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...

  9. [置顶] Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

随机推荐

  1. zoj 1453 Stripies

    /* 根据题意:不难看出,要是整个方程式最小,那么应该大的数先结合,小的数后结合.先排序然后结合(贪心) */ #include<stdio.h> #include<stdlib.h ...

  2. ExtJs004define定义类

    Ext.onReady(function () { //在Ext中如何去定义一个类: Ext.define(className , properties , callback) Ext.define( ...

  3. linux定时任务crontab的设置

    linux定时任务crontab的设置http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cronta ...

  4. C++ 变量的声明与定义的区别

    变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点 ...

  5. 2.PHP 教程_PHP 安装

    您需要做什么? 找一个支持PHP和MySQL的主机 在您自己的PC机上安装web服务器,然后安装PHP和MySQL 使用支持PHP的Web的主机 如果您的服务器支持PHP,那么您不需要做任何事情. 只 ...

  6. C语言(1)--准备

    经过很长一段时间的准备,终于重新弄懂了一些C语言的问题,再次熟悉了C语言的大致应用,对此略有体会,在此以博客记录于此! 准备工作: 运行平台:Linux 编辑工具:vim (还可以使用emac,ged ...

  7. tcpdump抓包并保存成cap文件

    首选介绍一下tcpdump的常用参数 tcpdump采用命令行方式,它的命令格式为: tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接 ...

  8. 程序员眼中的UML

    --克服用例图的恐惧 在实际工作中,大部分程序员很少接触到需求分析,即使有需求分析,也是草草了事,没有用正规的方式来表达,所以一般程序员使用用例图的机会是不多的.但是却又常常在各种媒体上看见用例图,于 ...

  9. java 中缀转后缀(逆波兰)

    import java.util.Stack; public class LeetCode_middleTransformToReversePolish { /** * @param args */ ...

  10. 淘特房产CMS系统 7.5

    资源描写叙述: 淘特房产CMS系统採用淘特AspCms开发,全部前台信息生成静态HTM,提供了楼盘.二手房.房产中介.房产经济人.业主社区等管理模块,集成了淘特CMS与动网论坛,Discuz,Oblo ...