(八)进程和线程(Processes and Threads)

当一个应用的第一个组件需要运行时,android系统就为这个组件启动一个只有一个线程的Linux进程,默认的,应用的所有组件都运行这个进程中的这个线程中。

但是,你可以安排组件运行在其他的进程中,并且为你的任意的进程增加若干线程。

1、 进程

组件运行的进程是在manifest文件里控制的,四大组件都一个process属性可以指定进程来运行,这些属性可以被设置为了每个组件都可以运行在 他自己的进程中,或者几个组件共享一个进程,或者不共享,如果两个应用共享一个Linux user ID并且有相同的权限,那么就可以使这两个应用中的组件运行在相同的进程中,也有process属性,用来指定对所有组件的属性。

所有 的组件都在指定的进程中的主线程中实例化,系统调用这些组件就是从主线程里发出的,其他的线程将不会对每个组件再实例化,所有作为调用的回应的这些方法, 比如说View.onKeyDown()还是组件的生命周期函数等等都是运行在这个主线程中的,这就意味着当系统调用这个组件时,这个组件不能长时间的阻 塞线程(比如说网络操作,循环计算),因为这样会阻塞这个进程中的其他组件,你可以将很耗时的任务分到其他的线程中。

内存不足或者有其他更紧急的进程要求时,Android系统可能关闭一个进程,运行在这个进程中的应用组件因此被销毁,当用户又重新回来时,进程才被重新启动。

至于究竟要停止哪个进程,android系统是通过衡量哪个进程对用户来说更重要来实现的

2、 线程

你可以限制你的应用运行在一个进程中,但是有的时候你需要新开一个线程在后台运行,用户界面需要随时对用户的要求做出反应,所以一些很耗时的工作应该重新启动一个线程来做,以免阻塞主进程。

Android系统提供了一系列方便的类来管理线程(Looper,Handler,HandlerThread)

3、 远程调用(Remote procedure calls)

Android系统有一个轻量级的远程调用机制(RPC)-----一个方法在本地调用,但是在远程执行(在另外一个进程里),返回给调用端的所有结果 都必须的系统能理解的,将数据从本地进程和地址空间传递到远程的进程和地址空间,并在远端重新装配,返回值的时候传输方向相反,android系统会去做 这些传输的工作,让你能够集中精力来定义你的RPC

一个RPC接口只能包含方法,默认的,即使是没有值返回,所有的方法都是同步执行的,就是说本地方法一直会阻塞直到远端的方法执行完毕)。

简单的说,这个远程调用的机制是这样工作的:

首先你需要用IDL(interface definition language)声明你的RPC接口,然后android系统会使用aidl工具来形成一个java接口,并且这个java接口是本地进程和远端进程都 可以获得的,这个java接口包含了两个内部类,请看下图:

这两个内部类有管理远程调用(你用IDL声明的接口)的所以代码,两个内部类都实现IBinder接口,一个是在本地(内部)使用,这个你可以不用自己 写代码,另外一个叫做Stub,继承自Binder类的,包含所有完成进程间通信(IPC)的代码,他包含你在RPC接口中声明的所有方法,你应该继续继 承Stub类来实现这些方法。

一般的,远端进程应该由一个service来管理(因为一个service能通知系统关于这个进程和他连接到的其他进程)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值