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. setInterval()与clearInterval()的用法

    setInterval() 方法可按照指定的周期来调用函数或计算表达式.  --简单地说就是过一段时间调用一次该函数 setInterval() 方法会不停地调用函数,直到 clearInterval ...

  2. 2015 5.16 C# 继承和多态

    类的层次结构有两种基本的构造方式  自顶向下  自底向上 基类的保护成员是指允许派生类的方法代码访问,而不是指通过派生类的对象访问 如果基类中的字段通过公有且可读写的属性进行了封装,那么建议将字段定义 ...

  3. Core Data Stack学习笔记

    Entity Entities 实体->数据表一个实体可以表示一个数据模型 1> 通过图形化界面可以建立一个模型关系图,可以指定一对多,多对一,多对多的数据关系 -在数据库开发中,少用多对 ...

  4. 【转载】设置event.cancelBubble,使触发子元素的onclick不同时触发父元素的onclick

    由于HTML中的对象都是层次结构,比如一个Table包含了多个TR,一个TR包含了多个TD Bubble就是一个事件可以从子节点向父节点传递,比如鼠标点击了一个TD,当前的event.srcEleme ...

  5. 小猪猪逆袭成博士之C++基础篇(一)数据精度、强制类型转换、变量命名规则

    小猪猪逆袭成博士之C++基础篇(一) 关键词: 数据精度.强制类型转换.变量命名规则 综述: 1.大多数编程语言通过两种方式来进一步补充其特征:一是赋予程序员自定义数据类型的权利(C++中的类):二是 ...

  6. UVa1368/ZOJ3132 DNA Consensus String

    #include <stdio.h>#include <string.h> int main(){    int a[4][1000]; // A/C/G/T在每列中出现的次数 ...

  7. UVa1584 Circular Sequence

    #include <stdio.h>#include <string.h> int less(char* str, size_t len, size_t p, size_t q ...

  8. css伪类伪元素

    在CSS中,模式(pattern)匹配规则决定哪种样式规则应用于文档树(document tree)的哪个元素.这些模式叫着选择符(selector). 一条CSS规则(rule)是选择符{属性:值; ...

  9. 向ibus-table-wubi里添加属于自己的输入法(98五笔)

    写在前面: 第三步整理每行的结构相对来说算是最难的,我的方法是先用文本编码转换专家将文本编码转换成utf-8无BOM(linux下有转换命令不会用,一定要是无BOM否则会在linux下打开乱码),再用 ...

  10. 帝国cms7.0调用指定栏目,指定顺序排列

    [e:loop={"select * from {$dbtbpre}enewsclass where classid in (82,83,86,87,88,89,90,91,93) orde ...