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. 用JQUERY实现给当前页面导航一个CSS

    今天遇到一个问题 当我在导航中点击一个标签后 希望用户知道自己所在导航的位置 只需要根据点击的页面是否加载完成 给这个标签用JS 添加一个CCcurr的 也就是我们常说的current CLASS 代 ...

  2. [转]Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案

    昨天,组里一个小朋友告诉我,他写的报表生成服务中无法打开一个已经存在的Excel 2007文件,他的开发环境是Win7.Visual Studio .Net 2008(Windows Server 2 ...

  3. connot find one or more components. please reinstall the application

    正在用 Visual Studio 2013 写程序,程序一直执行正常. 此时,手动把注册表"HKEY_USERS"的当前用户的权限删除.再运行程序会提示:“是否继续并运行上次的成 ...

  4. sql server中关于批处理与脚本的简单介绍

    1.批处理 批处理指的是包含一条或多条T-SQL语句的语句组,这组语句从应用程序一次性地发送到SQL Server服务器执行.SQL Server服务器将批处理语句编译成一个可执行单元(即执行计划), ...

  5. pthread 简要使用指南

    http://www.2cto.com/kf/201208/151995.html http://www.2cto.com/kf/201208/151997.html

  6. POJ 2689 Prime Distance(素数筛选)

    题目链接:http://poj.org/problem?id=2689 题意:给出一个区间[L, R],找出区间内相连的,距离最近和距离最远的两个素数对.其中(1<=L<R<=2,1 ...

  7. hive 分区操作记录

    创建分区: alter table table_name add partition (dt='20150423') location '/data/text/20150423';

  8. set up blog on github

    http://www.ruanyifeng.com/blog/2012/08/blogging_with_jekyll.html

  9. ural1057 Amount of degrees 位数统计

    #include <iostream> #include <string> using namespace std; ][]; void init(){ f[][] =; ;i ...

  10. 使用 IIS Manager 对 Windows Azure 网站进行远程管理

     最近,我们为客户新增了使用 Windows自带的 IIS管理控制台管理 Azure网站的功能.IIS Manager支持 HTTP over SSL,提供到您的 Windows Azure 网站 ...