Binder的使用(跨进程——AIDL,非跨进程)
一、Binder类
1.作用:Binder是客户端与服务器端的通信的媒介(连接各种Manager的桥梁),客户端通过Binder对象获取服务器端提供的数据
(为什么要用Binder来提供数据呢,服务器不能自己传给客户端数据么?)
因为服务器端通过Binder创建接口暴露自身数据,能够防止其他黑客入侵,导致数据被偷走或者篡改,只能让其他用户获取我们想要给他们的数据,不让他们从服务器自己拿数据。
2.在服务器端创建的Binder类,其实是运行在Binder的线程池中,就是说当使用的时候是从线程池中拿取Binder使用的,当多个客户端调用的时候,需要进行线程同步。
二、跨进程使用(实现客户端添加Book对象,服务器端接收对象并打印)
步骤一:创建Book.java类、Book.aidl类、IBookManager.aidl类
步骤二:创建Service并重写IBookManager类
/*BookService类*/ public class BookService extends Service {
private static final String TAG = "BookService"; private List<Book> mBookList; //如何创建在AIDL创建的IBookManager类
@Nullable
private Binder mIBookManager = new IBookManager.Stub(){ @Override
public List<Book> getBooksItem() throws RemoteException {
return mBookList;
} @Override
public void addBook(Book book) throws RemoteException {
Log.d(TAG,"新书加入"+book.toString());
}
}; @Override
public void onCreate() {
super.onCreate();
mBookList = new ArrayList<>();
mBookList.add(new Book(1,"疯狂Android讲义"));
mBookList.add(new Book(2,"Android开发艺术探索"));
} @Override
public IBinder onBind(Intent intent) {
return mIBookManager;
}
}
不要忘了在AndroidManifest.xml中注册
<service android:name=".BookService"
android:process=":Remote">
<!--Service创建新的进程-->
</service>
步骤三:在客户端中启动Service
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity"; private IBookManager mService;
private List<Book> mBookList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//必须创建ServiceConnection对象,详见Service类的使用
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//将服务器的Binder转换陈客户端的Binder
mService = IBookManager.Stub.asInterface(service);
try {
//获取所有书籍
mBookList = mService.getBooksItem();
Log.d(TAG,mBookList.get(0).toString());
//加入书籍
mService.addBook(new Book(2,"IOS"));
} catch (RemoteException e) {
e.printStackTrace();
}
} @Override
public void onServiceDisconnected(ComponentName name) { }
};
//启动Service
Intent intent = new Intent(this,BookService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
}
}
未理解的问题:当application结束时候,Service的进程是否也会终止? 与线程的Binder的区别
三、不跨进程使用
四、跨进程与不跨进程原理的区别
跨进程:onBind()获取的是所返回对象的代理
不跨进程:onBind()可以直接获取onBind方法的返回值
Binder的使用(跨进程——AIDL,非跨进程)的更多相关文章
- python多进程,进程池,数据共享,进程通信,分布式进程
一.操作系统中相关进程的知识 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前 ...
- Python 之并发编程之进程中(守护进程(daemon)、锁(Lock)、Semaphore(信号量))
五:守护进程 正常情况下,主进程默认等待子进程调用结束之后再结束守护进程在主进程所有代码执行完毕之后,自动终止kill -9 进程号 杀死进程.守护进程的语法:进程对象.daemon = True设置 ...
- Service官方教程(11)Bound Service示例之2-AIDL 定义跨进程接口并通信
Android Interface Definition Language (AIDL) 1.In this document Defining an AIDL Interface Create th ...
- 不依赖AIDL的跨进程通信
http://blog.csdn.net/lmj623565791/article/details/38461079 如果知道AIDL和binder的原理,可以简单写一个不依赖AIDL的跨进程通信 不 ...
- android 进程间通信 messenger 是什么 binder 跟 aidl 区别 intent 进程间 通讯? android 消息机制 进程间 android 进程间 可以用 handler么 messenger 与 handler 机制 messenger 机制 是不是 就是 handler 机制 或 , 是不是就是 消息机制 android messenge
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha messenger 是什么 binder 跟 aidl 区别 intent 进程间 通讯 ...
- {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll
Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...
- Api之Cors跨域以及其他跨域方式
Web Api之Cors跨域以及其他跨域方式(三) 我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还 ...
- SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析
最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1.jquery ajax跨 ...
- Web Api之Cors跨域以及其他跨域方式(三)
我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还有另外实现跨域方式 一.手动实现JSONP跨域 1.首先 ...
随机推荐
- AspectJ的安装和Eclipse的AJDT插件的配置
一.安装AspectJ:1.从http://www.eclipse.org/aspectj/downloads.php 下载AspectJ(目前发布的最新版为1.8.6);2.解压下载下来的jar文 ...
- YII学习,初体验 ,对YII的一些理解.
先说点没用的: 不会选择,选择后不坚持,不断的选择.这是人生中的一个死循环,前两一直迷茫.觉得自己前进方向很不明朗.想去学的东西有很多.想学好YII,想学PYTHON 想学学hadoop什么的,又想研 ...
- Ubuntu14.04安装配置SVN及Trac
还是个实习生的时候,项目管理十分欠缺,会出现很多问题,痛定思痛,决定要改变现状,养成良好的项目管理习惯,看网上工具很多,在这里尝试使用SVN作代码版本控制,使用trac作为项目管理追踪.本文采用的操作 ...
- js 获取浏览器内核
<script language="JavaScript" type="text/javascript"> var browser = { ...
- KeybMap 键盘映射工具更新至 V1.5(修订)
KeybMap 更新至 V1.5,主要是增加了对一些多媒体键定义修改功能,也可以将任意一键定义为打开指定的程序. 3月9日略做修订. http://www.mympc.org/down/1/2005- ...
- USB学习小记-HID类键盘的报告描述符的理解
前言 断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的.利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧. 在学习过程中, ...
- BootStrap框架写的致敬乔布斯的网页
http://codepen.io/Gabyler/pen/oxjRYj <div class="container"> <div class="jum ...
- Makefile与Shell的问题
http://blog.csdn.net/absurd/article/details/636418 Makefile与Shell的问题 大概只要知道Makefile的人,都知道Makefile可以调 ...
- iOS GCD详解
前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步.异步.串行.并行和死锁这几个名词的漩涡中渐渐放弃治疗.本文将使用图文表并茂的方式给大家形象地解释其中的原理和规律. 线程.任务和队列的概 ...
- Eidtplus常用快捷键
文件 新建普通文本 Ctrl+N 新建普通的文本文档 新建浏览器窗口 Ctrl+Shift+B 新建浏览器窗口 新建 HTML 页 Ctrl+Shift+N 创建一个空白的 HTML 页面 打开 Ct ...