android92 aidl远程进程通信
05项目RemoteService.java
package com.itheima.remoteservice;
//05项目
import com.itheima.remoteservice.PublicBusiness.Stub; import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder; public class RemoteService extends Service {
@Override
public IBinder onBind(Intent intent) {
System.out.println("bind方法");
return new furong();
} //之前是:class furong extends Binder implements PublicBusiness{
class furong extends Stub{//直接继承Stub,因为Stub是extends android.os.Binder implements com.itheima.remoteservice.PublicBusiness
@Override
public void qianXian() {
banzheng();
}
} public void banzheng(){
System.out.println("李局帮你来办证");
}
}
05项目PublicBusiness.aidl
package com.itheima.remoteservice; interface PublicBusiness { void qianXian();
}
05项目清单文件配置service
<service android:name="com.itheima.remoteservice.RemoteService">
<intent-filter >
<action android:name="com.itheima.remote"/>
</intent-filter>
</service>
06项目PublicBusiness.aidl
package com.itheima.remoteservice; interface PublicBusiness { void qianXian();
}
06项目MainActivity.java
package com.itheima.runremote;
//06项目
import com.itheima.remoteservice.PublicBusiness;
import com.itheima.remoteservice.PublicBusiness.Stub; import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { private MyserviceConn conn; PublicBusiness pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
conn = new MyserviceConn();
} public void click(View v){
//启动远程服务
Intent intent = new Intent();
intent.setAction("com.itheima.remote");
startService(intent);
}
public void click2(View v){
//停止远程服务
Intent intent = new Intent();
intent.setAction("com.itheima.remote");
stopService(intent);
} public void click3(View v){
Intent intent = new Intent();
intent.setAction("com.itheima.remote");
bindService(intent, conn, BIND_AUTO_CREATE);
} public void click4(View v){
unbindService(conn);
}
class MyserviceConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//把Ibinder中间人对象强转成publicbusiness
//返回的service是一个furong对象继承 Stub,但是该service对象是05项目的,是传不过来的,
pb = Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
} public void click5(View v){
try {
pb.qianXian();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
###服务的分类
* 本地服务:指的是服务和启动服务的activity在同一个进程中
* 远程服务:指的是服务和启动服务的activity不在同一个进程中(在不同的工程中),隐士启动服务。 ###AIDL是Android interface definition language安卓接口定义语言,用于进程间通信技术,默认2个进程是不能通信的,安卓里面不同的应用有自己各自的内存空间,内存之间是不能访问的,linux中通过管道进行进程通信,安卓中也有管道概念,handeler就是管道。06项目想访问05项目的对象的方法就要用进程通信,相当于通过进程通信可以把05项目内存的对象传到06项目的内存进行使用。
1. 把05项目的远程服务的方法抽取成一个单独的接口java文件
2. 把05接口上面的java文件PublicBusiness.java的后缀名改成aidl,在05项目gen中会自动生成PublicBusiness.java
3. 在05项目中自动生成的PublicBusiness.java文件中,有一个静态抽象类Stub,它已经继承了binder类,实现了publicBusiness接口,这个类就是新的中间人
4. 把aidl文件复制粘贴到06项目,粘贴的时候注意,aidl文件所在的包名必须跟05项目中aidl所在的包名一致
5. 在06项目中,强转中间人对象时,直接使用Stub.asInterface()
广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册。 远程服务只能隐式启动,类似隐式启动Activity,在清单文件中配置Service标签时,必须配置intent-filter子节点,并指定action子节点。 应用场景:远程服务中的中间人对象,其他应用是拿不到的,那么在通过绑定服务获取中间人对象时,就无法强制转换,使用aidl,就可以在其他应用中拿到中间人类所实现的接口
##支付宝远程服务(可以通过jar包导入到被绑定的应用中去,但是支付宝不用这种方式,因为这样的话所有支付的密码操作都在被绑定的应用里面执行,那么有可能这个被绑定的应用是恶意应用将会盗取密码,所以阿里巴巴不可能让支付进程跑在第三方应用进程中,所以是远程访问调用支付宝的方法,所有输入密码都是在支付宝的进程去做的,所以支付宝是没有jar包的,而是重新下载支付宝软件在支付宝软件去支付的,苹果不用支付宝是通过苹果的软件去支付的。)
1. 定义支付宝的服务,在服务中定义pay方法
2. 定义中间人对象,把pay方法抽取成接口
3. 把抽取出来的接口后缀名改成aidl
4. 中间人对象直接继承Stub对象
5. 注册这个支付宝服务,定义它的intent-Filter ##需要支付的应用
1. 把刚才定义好的aidl文件拷贝过来,注意aidl文件所在的包名必须跟原包名一致
2. 远程绑定支付宝的服务,通过onServiceConnected方法我们可以拿到中间人对象
3. 把中间人对象通过Stub.asInterface方法强转成定义了pay方法的接口
4. 调用中间人的pay方法
android92 aidl远程进程通信的更多相关文章
- AIDL跨进程通信
Android跨进程通信会用到AIDL,当然跨进程通信不一定要用AIDL,像广播也是可以的,当然这里用到AIDL相对比较安全一些: AIDL允许传递基本数据类型(Java 的原生类型如int/long ...
- AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)
首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...
- Aidl跨进程通信机制-android学习之旅(87)
Aidl简介 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信的代码. 如果在 ...
- Android使用AIDL跨进程通信
一.基本类型 1.AIDL是什么 AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definiti ...
- AIDL跨进程通信报Intent must be explicit
在Android5.0机子上采用隐式启动来调试AIDL时,会出现Intent must be explicit的错误,原因是5.0的机子不允许使用隐式启动方式,解决的方法是:在启动intent时添加i ...
- Android 进程通信机制之 AIDL
什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在 ...
- android 远程Service以及AIDL的跨进程通信
在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...
- Android 进阶9:进程通信之 AIDL 解析
读完本文你将了解: AIDL AIDL 生成文件分析 Stub Proxy AIDL 生成的内容小结 AIDL 的使用回顾 服务端 客户端 小结 手动写个 Binder 首先是定义跨进程接口实现 II ...
- Android 进阶7:进程通信之 AIDL 的使用
读完本文你将了解: AIDL 是什么 AIDL 支持的数据类型 AIDL 如何编写 AIDL 实例 创建 AIDL 编写服务端代码 编写客户端代码 运行结果 总结 代码地址 Thanks 记得 201 ...
随机推荐
- FLV封装格式及分析器工具
http://blog.csdn.net/leixiaohua1020/article/details/17934487 FLV封装原理 FLV格式的封装原理,贴上来辅助学习之用. FLV(F ...
- LINUX下安装PHP(CGI模式)和NGINX[转]
安装所需依赖 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freety ...
- Type-C设计上的防护
Type C设计上各家芯片公司都提供了很多方案,但在防护方面很多留给了客户自己选择,这方面我可以重点聊聊,说起防护,无非就是过压过流防护. 过压防护,Type C的信号线有很多,都需要做静电防护,US ...
- 《linux程序设计》笔记 第一章 入门
linux程序存放位置linux主要有一下几个存放程序的目录: /bin 系统启动程序目录 /usr/bin 用户使用的标准程序 /usr/local/bin 用于存放软件安装目录 /usr ...
- 【原创】FPGA开发手记(一) UART接口
以下内容均以Xilinx的Nexys3作为开发板 1. UART简介 UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串 ...
- C#中的深拷贝与浅拷贝
1.基本的概念: 首先我们应该了解一下什么叫深拷贝与浅拷贝(Deep Copy and Shallow Copy). a.浅拷贝(Shallow Copy影子克隆):只复制对象的基本类型,对象类型,仍 ...
- Linux Kernel 本地内存损坏漏洞
漏洞名称: Linux Kernel 本地内存损坏漏洞 CNNVD编号: CNNVD-201310-663 发布时间: 2013-11-05 更新时间: 2013-11-05 危害等级: 漏洞类 ...
- 【转】让itunes下载加速的真正办法,转向至香港台湾澳门苹果服务器 -- 不错不错!!!
原文网址:http://bbs.feng.com/read-htm-tid-2397269.html 今天,看了一个这个帖子是改dns的,http://bbs.feng.com/read-htm-ti ...
- Mvc自定义分页控件
MVC开发分页常常使用第三方控件,生成的分页HTML带有版权申明,虽然免费,但是总有的别扭.于是,某日,楼主闲来蛋疼,折腾了个自定义分页控件: 先来展示下效果图: 1>当分页不超过10页的时候, ...
- 测试一个函数的运行时间(C++)
#include <ctime> static clock_t Start,Finish; Start=clock(); fun(); Finish = clock(); double t ...