[置顶] android AIDL 进程间通信
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 进程间通信的更多相关文章
- [置顶] Android开发笔记(成长轨迹)
分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...
- android aidl 进程间通信需要注意的地方(android.os.TransactionTooLargeException)
转自:http://blog.sina.com.cn/s/blog_4e1e357d0102wau9.html 1.bus工程实现通过service实现aidl实体类 2.actor工程通过发起bin ...
- [置顶] Android AlarmManager实现不间断轮询服务
在消息的获取上是选择轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了.但如果只是一般的消息检测比如更新检查,可能是半个小时或一个小时一 ...
- [置顶] Android开发之MediaPlayerService服务详解(一)
前面一节我们分析了Binder通信相关的两个重要类:ProcessState 和 IPCThreadState.ProcessState负责打开Binder 驱动,每个进程只有一个.而 IPCThre ...
- [置顶] [Android源码分析]inquiry result引起的上层变化分析
在上一篇文章中,我们详细分析了android是如何解析蓝牙反馈上来的搜索到的设备信息,本文将会继续分析这些信息到了上层之后是如何处理. 8.inquiry result引起的上层变化 我们知道inqu ...
- [置顶] Android的IPC访问控制设计与实现
3.3.1 IPC钩子函数设计与实现 IPC Binder是Android最重要的进程间通信机制,因此,必须在此实施强制访问控制. 1. 修改secuirty.h 打开终端shell,输入指令“cd ...
- [置顶] Android四大组件之BroadcastReceiver
Android四大组件之BroadcastReceiver Broadcast Receiver 广播接收器,是一种负责接收广播消息并对消息做出响应的组件,和Service一样并不提供与用户交互的UI ...
- [置顶] android开发之来电自动拒接并自动回复短信_上课模式app
上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...
- [置顶] Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
随机推荐
- Sublime Text3快捷方式总结
Ctrl+P快速查找 Ctrl+D多行游标//同时选中多个地方进行编辑 Ctrl+F查找替换 Ctrl+H查找替换 Ctrl+G快速跳到某一行 Ctrl+shift+P命令模式 在命令模式下设置语法: ...
- 日志记录Filter
Filter也可以日志记录,在request 之前后, 该filter 使用Apache 日只记录工具,记录客户IP ,访问URI 以及消耗时间. LogFilter.java package com ...
- mysql 时间差问题集锦
SELECT * from grouptoadd where taskid = '103244'; select datediff(max(spreadtime),min(createtime)) f ...
- python的map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于list [1, 2 ...
- 简单的Coretext 图文混排
在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现.现在分享一种比较简单的实现方式 iOS sdk中为我 ...
- Push segues can only be used when the.....
刚刚遇到的两个错误,. 1, Terminating app due to uncaught exception'NSGenericException', reason: 'Push segues c ...
- 64位linux下安装oracle10 64位 遇到 :ins_ctx.mk ;ins_emdb.mk
http://blog.csdn.net/bamuta/article/details/10523835 http://www.cnblogs.com/kerrycode/p/3519446.html ...
- PowerPoint2003/2007幻灯片常用快捷键大全
熟习掌握PowerPoint快捷键不仅可以对我们在制作幻灯片的时候更加熟练节省时间.而且在我们演示PPT文稿的时候,也不需要停下演讲去调试菜单工具来切换下一张,我们只需要轻轻的按一下键盘即可轻松切换P ...
- Qt实战之开发CSDN下载助手 (2)
现在,我们正式开工啦.这一篇主要学习下基本的抓包分析.学会协议登录CSDN并制作登陆界面. 准备工具: 一款http抓包工具. 可以是FireBug或者fiddler.这里我们用httpWatch. ...
- 应用 Valgrind 发现 Linux 程序的内存问题
如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题.掌握 valgri ...