跨进程如何通讯?两个进程无法直接通讯,通过Android系统底层间接通讯。基于service的aidl实现跨进程通讯。

什么叫AIDL? Android interface definition language,Android接口定义语言

什么时候使用?
AIDL IPC 多线程 多应用

Binder IPC 没有多线程 多应用

message IPC 没有多线程

使用

eclipse

Androidstudio

new-folder-AIDL Folder 生成AIDL目录

在目录中 new - AIDL - AIDL FILE 生成,要编译后,才可以调用

案列

新建两个app.

服务端app

new-folder-AIDL Folder 生成AIDL目录

在目录中 new - AIDL - AIDL FILE 新建一个aidl文件

// IMyAidlInterface.aidl
package com.base.aidl; // Declare any non-default types here with import statements interface IMyAidlInterface { //计算两个数的和
int add(int num1, int num2); }

再提供一个service提供调用

public class IRemoteService extends Service {

    //当客户端绑定这个服务时 会执行
@Override
public IBinder onBind(Intent intent) {
return iBinder;
} private IBinder iBinder = new IMyAidlInterface.Stub(){ @Override
public int add(int num1, int num2) throws RemoteException {
Log.e("TAG", "收到的数是:"+ num1+","+ num2);
return num1+num2;
}
};
}

xml注册

        <service
android:name=".IRemoteService"
android:enabled="true" >
<intent-filter>
<action android:name="com.base.aidl.IRemoteService" />
</intent-filter>
</service>

客服端app

新建一个和服务端一样的AIDL,(包名,名称都要一样)

activity代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText eTNum1;
private EditText eTNum2;
private EditText eTNum3;
private IMyAidlInterface iMyAid; private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//绑定成功
iMyAid = IMyAidlInterface.Stub.asInterface(iBinder);
} @Override
public void onServiceDisconnected(ComponentName componentName) {
//绑定结束
iMyAid = null;
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView(); //启动绑定
bindSer();
} private void bindSer() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.base.aidl", "com.base.aidl.IRemoteService"));
bindService(intent, conn, Context.BIND_AUTO_CREATE);
} private void initView() { eTNum1 = (EditText) findViewById(R.id.ed_num1);
eTNum2 = (EditText) findViewById(R.id.ed_num2);
eTNum3 = (EditText) findViewById(R.id.ed_res); findViewById(R.id.btn_add).setOnClickListener(this);
} @Override
public void onClick(View view) {
int num1 = Integer.parseInt(eTNum1.getText().toString());
int num2 = Integer.parseInt(eTNum2.getText().toString()); int num3; try {
num3 = iMyAid.add(num1, num2);
eTNum3.setText(num3 + "");
} catch (RemoteException e) {
e.printStackTrace();
eTNum3.setText("出错了");
}
} @Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}

布局省略

AIDL 数据类型

short不支持

list要表明 in 或者 out

parcelable 序列化

android 跨进程通讯 AIDL的更多相关文章

  1. Android跨进程通信AIDL服务

    服务(Service)是android系统中非常重要的组件.Service可以脱离应用程序运行.也就是说,应用程序只起到一个启动Service的作用.一但Service被启动,就算应用程序关闭,Ser ...

  2. android 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...

  3. Android为TV端助力 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...

  4. Android跨进程通信的四种方式

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  5. android中跨进程通讯的4种方式

    转自:http://blog.csdn.net/lyf_007217/article/details/8542359 帖子写的很好.看来一遍,试了一遍,感觉太有意义.必须转过来! android中跨进 ...

  6. android 跨进程通信

    转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ...

  7. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

  8. Android跨进程通信广播(Broadcast)

    广播是一种被动跨进程通讯的方式.当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据.这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通,在应用程序中发送广播比较简单.只 ...

  9. Android 跨进程启动Activity黑屏(白屏)的三种解决方案

    原文链接:http://www.cnblogs.com/feidu/p/8057012.html 当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?).当然从桌面 ...

随机推荐

  1. 如何在VS2015中使用Git命令提示符

    本文转载自 http://qkxue.net/info/176223/Visual-Studio-Git VS2015自带了Git插件,但有时候觉得Git控制台命令更方便些.VS中本身不能把Git B ...

  2. matlab新手入门(二)(翻译)

    矩阵和数组 MATLAB是“矩阵实验室”的缩写.虽然其他编程语言大多数一次使用数字,但MATLAB®主要用于整个矩阵和数组.所有MATLAB变量都是多维数组,无论数据类型如何.矩阵是通常用于线性代数的 ...

  3. 无监督学习:Linear Dimension Reduction(线性降维)

    一 Unsupervised Learning 把Unsupervised Learning分为两大类: 化繁为简:有很多种input,进行抽象化处理,只有input没有output 无中生有:随机给 ...

  4. hdu1166(线段树单点更新&区间求和模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:中文题诶- 思路:线段树单点更新,区间求和模板 代码: #include <iost ...

  5. 51nod1282(最小表示法&&枚举)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1282 题意:中文题目诶- 思路:指针不可转,刻盘可转,显然,对 ...

  6. 51nod 1562 玻璃切割

      1562 玻璃切割 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1562 题目来源: CodeForces 基准时间 ...

  7. 洛谷P3190 [HNOI2007]神奇游乐园(插头dp)

    传送门 大概是算第一道自己做出来的插头dp? (虽然都是照着抄板子的) (虽然有个地方死活没调出来最后只能看题解才发现自己错在哪里的) 我就当你们都会插头dp了…… 因为必须得是一条路径,所以扫描线上 ...

  8. AcDbSymbolTable of AcDbDatabase

    AcDbBlockTable AcDbLayerTable AcDbTextStyleTable AcDbLinetypeTable AcDbViewTable AcDbUCSTable AcDbVi ...

  9. [Xcode 实际操作]七、文件与数据-(10)NSkeyedArchiver存储和解析数据,Swift对象的归档和恢复归档

    目录:[Swift]Xcode实际操作 本文将演示如何使用归档的方法,对模型对象进行持久化工作. 在项目名称上点击鼠标右键,弹出右键菜单,选择[New File]新建文件命令, 在弹出的模板选项窗口中 ...

  10. git 基本操作——上传文件与项目分支管理

    创建并转入新分支:git checkout –b XX(其中XX代表分支名称) 将新分支发布在github上: git push origin Branch1 往分支中添加文件:git add mas ...