[置顶] 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上关于图片异步加载的开源项目,就 ...
随机推荐
- SignaLR通信技术
新建MVC项目 如果没有Signale需要使用NuGet安装Signalr namespace SignaLrDemo { public class ChatHub : Hub { public vo ...
- Android Gradle 配置选项合集
//让gradle 引入构建安卓app的插件 apply plugin: 'com.android.application' //自定义变量, 使用的时候不需要 ext 前缀 ext { minSdk ...
- this function has none of deterministic, no sql,or reads sql data in its declaration and binary logging is enabled
原址:http://blog.chinaunix.net/uid-20639775-id-3031821.html This function has none of DETERMINISTI ...
- PHP-变量(www.w3school.com.cn/php)
写在前面: 变量可以形象的解释为信息的容器(存信息的东西).比如说$x=8,相当于把8给放到x里面,以后操作$x的时候就相当于操作8 >5+$x结果为13 ------------------- ...
- 高质量程序设计指南C/C++语言——C++/C程序设计入门(2)
*标准C规定,编译器只取前31个字符作为有效的标识符,而标准C++则取前255个字符作为有效的标识符. *把具有特殊含义的字符输出到终端上,尤其是当它们出现在普通字符串或格式控制字符串中时,一般来说有 ...
- cocos2dx ResolutionPolicy
FrameSize 参数,在游戏运行时,我们可以通过 CCEGLView::sharedOpenGLView()->getFrameSize();如果在手机上运行,那么不同分辨率将会得到不同的值 ...
- include file和include virtual的区别
1.#include file 包含文件的相对路径,#include virtual包含文件的虚拟路径. 2.在同一个虚拟目录内,<!--#include file="file.asp ...
- 转:alphaImageLoader滤镜加载后 链接不能点击
我是一个很少使用IE滤镜,也是一个不赞成使用IE滤镜的前端工程师.不过今天有一个朋友给我发来了一个有关于IE6的BUG,就是在IE6中使用了AlphaPNG透明的IE滤镜之后,a链接不能够点击.具体情 ...
- java csv 文件 操作类
一个CSV文件操作类,功能比较齐全: package tool; import java.io.BufferedReader; import java.io.BufferedWriter; impor ...
- CSS块级元素和行内元素
根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级 ...