不依赖AIDL的跨进程通信
http://blog.csdn.net/lmj623565791/article/details/38461079
如果知道AIDL和binder的原理,可以简单写一个不依赖AIDL的跨进程通信
不知道的话可以看这里:http://www.cnblogs.com/qlky/p/6720405.html
先看AIDL要做什么: 在binderProxy的onTransact中接收数据,并返回结果。
在自定义service的stub中实现函数,并返回stub
所以如果只用binder,在自定义service重写onTransact就行了
- package com.example.zhy_binder;
- import android.app.Service;
- import android.content.Intent;
- import android.os.Binder;
- import android.os.IBinder;
- import android.os.Parcel;
- import android.os.RemoteException;
- import android.util.Log;
- public class CalcPlusService extends Service
- {
- private static final String DESCRIPTOR = "CalcPlusService";
- private static final String TAG = "CalcPlusService";
- public void onCreate()
- {
- Log.e(TAG, "onCreate");
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId)
- {
- Log.e(TAG, "onStartCommand");
- return super.onStartCommand(intent, flags, startId);
- }
- public IBinder onBind(Intent t)
- {
- Log.e(TAG, "onBind");
- return mBinder;
- }
- public void onDestroy()
- {
- Log.e(TAG, "onDestroy");
- super.onDestroy();
- }
- public boolean onUnbind(Intent intent)
- {
- Log.e(TAG, "onUnbind");
- return super.onUnbind(intent);
- }
- public void onRebind(Intent intent)
- {
- Log.e(TAG, "onRebind");
- super.onRebind(intent);
- }
- private MyBinder mBinder = new MyBinder();
- private class MyBinder extends Binder
- {
- @Override
- protected boolean onTransact(int code, Parcel data, Parcel reply,
- int flags) throws RemoteException
- {
- switch (code)
- {
- case 0x110:
- {
- data.enforceInterface(DESCRIPTOR);
- int _arg0;
- _arg0 = data.readInt();
- int _arg1;
- _arg1 = data.readInt();
- int _result = _arg0 * _arg1;
- reply.writeNoException();
- reply.writeInt(_result);
- return true;
- }
- case 0x111:
- {
- data.enforceInterface(DESCRIPTOR);
- int _arg0;
- _arg0 = data.readInt();
- int _arg1;
- _arg1 = data.readInt();
- int _result = _arg0 / _arg1;
- reply.writeNoException();
- reply.writeInt(_result);
- return true;
- }
- }
- return super.onTransact(code, data, reply, flags);
- }
- };
- }
然后在客户端中需要序列化数据,并用transact把数据发送出去
- package com.example.zhy_binder_client03;
- 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.widget.Toast;
- public class MainActivity extends Activity
- {
- private IBinder mPlusBinder;
- private ServiceConnection mServiceConnPlus = new ServiceConnection()
- {
- @Override
- public void onServiceDisconnected(ComponentName name)
- {
- Log.e("client", "mServiceConnPlus onServiceDisconnected");
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service)
- {
- Log.e("client", " mServiceConnPlus onServiceConnected");
- mPlusBinder = service;
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- public void bindService(View view)
- {
- Intent intentPlus = new Intent();
- intentPlus.setAction("com.zhy.aidl.calcplus");
- boolean plus = bindService(intentPlus, mServiceConnPlus,
- Context.BIND_AUTO_CREATE);
- Log.e("plus", plus + "");
- }
- public void unbindService(View view)
- {
- unbindService(mServiceConnPlus);
- }
- public void mulInvoked(View view)
- {
- if (mPlusBinder == null)
- {
- Toast.makeText(this, "未连接服务端或服务端被异常杀死", Toast.LENGTH_SHORT).show();
- } else
- {
- android.os.Parcel _data = android.os.Parcel.obtain();
- android.os.Parcel _reply = android.os.Parcel.obtain();
- int _result;
- try
- {
- _data.writeInterfaceToken("CalcPlusService");
- _data.writeInt();
- _data.writeInt();
- mPlusBinder.transact(0x110, _data, _reply, );
- _reply.readException();
- _result = _reply.readInt();
- Toast.makeText(this, _result + "", Toast.LENGTH_SHORT).show();
- } catch (RemoteException e)
- {
- e.printStackTrace();
- } finally
- {
- _reply.recycle();
- _data.recycle();
- }
- }
- }
- public void divInvoked(View view)
- {
- if (mPlusBinder == null)
- {
- Toast.makeText(this, "未连接服务端或服务端被异常杀死", Toast.LENGTH_SHORT).show();
- } else
- {
- android.os.Parcel _data = android.os.Parcel.obtain();
- android.os.Parcel _reply = android.os.Parcel.obtain();
- int _result;
- try
- {
- _data.writeInterfaceToken("CalcPlusService");
- _data.writeInt();
- _data.writeInt();
- mPlusBinder.transact(0x111, _data, _reply, );
- _reply.readException();
- _result = _reply.readInt();
- Toast.makeText(this, _result + "", Toast.LENGTH_SHORT).show();
- } catch (RemoteException e)
- {
- e.printStackTrace();
- } finally
- {
- _reply.recycle();
- _data.recycle();
- }
- }
- }
- }
不依赖AIDL的跨进程通信的更多相关文章
- android 远程Service以及AIDL的跨进程通信
在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...
- AIDL跨进程通信
Android跨进程通信会用到AIDL,当然跨进程通信不一定要用AIDL,像广播也是可以的,当然这里用到AIDL相对比较安全一些: AIDL允许传递基本数据类型(Java 的原生类型如int/long ...
- Service官方教程(11)Bound Service示例之2-AIDL 定义跨进程接口并通信
Android Interface Definition Language (AIDL) 1.In this document Defining an AIDL Interface Create th ...
- Android中的跨进程通信方法实例及特点分析(一):AIDL Service
转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...
- 【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了
一.前言 提起跨进程通信,大多数人首先会想到AIDL.我们知道,用AIDL来实现跨进程通信,需要在客户端和服务端都添加上aidl文件,并在服务端的Service中实现aidl对应的接口.如果还需要服务 ...
- Android随笔之——跨进程通信(一) Activity篇
在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...
- 跨进程通信之Messenger
1.简介 Messenger,顾名思义即为信使,通过它可以在不同进程中传递Message对象,通过在Message中放入我们需要的入局,就可以轻松实现数据的跨进程传递了.Messenger是一种轻量级 ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...
- Android-Messenger跨进程通信
http://blog.csdn.net/lmj623565791/article/details/47017485 一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler ...
随机推荐
- How do I convert an IIR filter into a FIR filter in digital signal processing?
Maybe you were asking if there is some kind of design tool allowing to convert an IIR filter into an ...
- 设计模式:Builder
简介 建造者模式(Builder),将一个复杂对象的表示和它的构建分离,这样同样的构造过程可以创建出不同的对象状态. 类图 下面的Product是要创建的对象的目标类型,产品. Builder 创建一 ...
- [Ynoi2015]此时此刻的光辉(莫队)
一道神题...自己写出来以后被卡常了...荣获洛谷最差解... 思路还是比较好想,对于每个数 \(\sqrt{n}\) 分块,对于 \(\sqrt{n}\) 以内的数,我们可以直接求出来.对于 \(\ ...
- 如何执行超过一百兆(100MB)的sql脚本?
最近遇到一个问题,在sqlserver的查询分析器里面执行一个超过100MB的数据库脚本,发现老是报“引发类型为“System.OutOfMemoryException”的异常”,上网查了一下,主要是 ...
- 【转】如何用css限制文字长度,使溢出的内容用省略号…显示
文章转自这里(现在貌似被黑了,建议不要点击了) ps:因在该地方没看到转载按钮,复制下存到这里以待自己方便,别人能看到帮助一下更是乐意之至,效果亲测可以实现,兼容IE.谷歌.火狐 由于文字内容长度的不 ...
- vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件
vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...
- 使用ServiceStack改造我们的项目
ServiceStack是一个NET环境下的开源框架集合 包括轻量级的Orm框架,数据库访问,Json处理,Redis驱动等多个模块,我们可以按需选择使用 serviceStack.Ormlite s ...
- ElasticSearch入门2: 基本用法
基本用法: 一.索引创建 (启动集群和索引请看上一篇文章:http://www.cnblogs.com/liuxiaoming123/p/8081883.html) 1.打开浏览器,输入请求:htt ...
- 源码分析篇 - Android绘制流程(二)measure、layout、draw流程
performTraversals方法会经过measure.layout和draw三个流程才能将一帧View需要显示的内容绘制到屏幕上,用最简化的方式看ViewRootImpl.performTrav ...
- Apache本地配置虚拟域名
转载+修改 例:虚拟域名为 aaa.com 端口为默认80 index.html所在目录 D:/wamp/www/web 不用解析域名,使用虚假的域名也可以 apache安装完默认是不开启虚拟服务器 ...