android 跨进程通讯 AIDL
跨进程如何通讯?两个进程无法直接通讯,通过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的更多相关文章
- Android跨进程通信AIDL服务
服务(Service)是android系统中非常重要的组件.Service可以脱离应用程序运行.也就是说,应用程序只起到一个启动Service的作用.一但Service被启动,就算应用程序关闭,Ser ...
- android 史上最简单易懂的跨进程通讯(Messenger)!
不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...
- Android为TV端助力 史上最简单易懂的跨进程通讯(Messenger)!
不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...
- Android跨进程通信的四种方式
由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...
- android中跨进程通讯的4种方式
转自:http://blog.csdn.net/lyf_007217/article/details/8542359 帖子写的很好.看来一遍,试了一遍,感觉太有意义.必须转过来! android中跨进 ...
- android 跨进程通信
转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...
- Android跨进程通信广播(Broadcast)
广播是一种被动跨进程通讯的方式.当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据.这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通,在应用程序中发送广播比较简单.只 ...
- Android 跨进程启动Activity黑屏(白屏)的三种解决方案
原文链接:http://www.cnblogs.com/feidu/p/8057012.html 当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?).当然从桌面 ...
随机推荐
- Ubuntu vim使用
vim安装:apt-get install vim-gtk vim使用:默认启动插入模式,或者按‘I’进入插入模式,退出插入模式按‘esc’,用冒号‘:wq’进行保存退出: 其复制和粘贴是靠鼠标右键中 ...
- bootstrap模版兼容IE浏览器代码嵌入
1. bootstrap模板为使IE6.7.8版本(IE9以下版本)浏览器兼容html5新增的标签,引入下面代码文件即可. <script src="https://oss.maxc ...
- nodejs的mysql模块学习(二)连接数据库
nodejs连接mysql的方式有两种 官方建议的第一种是 let mysql = require('mysql'); let connection = mysql.createConnection( ...
- 你所不知道的html5与html中的那些事(三)
文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...
- linux 下定位程序假死
ps -ef | grep 程序名称 pstack 程序的进程ID
- Hashtable源码剖析
Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. Hashtabl ...
- Django 中ORM 的使用
一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={ 'de ...
- qscoj#19D(单调队列)
题目链接:http://qscoj.cn/problem/130/ 题意:中文题诶- 思路:直接用单调栈搞一下就好了 代码: #include <bits/stdc++.h> using ...
- poj 2049(二分+spfa判负环)
poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...
- 洛谷P3200 [HNOI2009]有趣的数列(Catalan数)
P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足 ...