Android Developers Blog 发表了一篇题为《Multitasking the Android Way》的博文,读起来颇为有趣。我将博文中的关键信息加以自己的理解,简单整理成以下文字,以便日后查阅之便。能力有限,误读和错读难以避免,阅读者应该坚持怀疑的态度来阅读本文,尽信书不如无书。 同时运行多个应用程序,即 Multitask,对于现在的 OS 来说,是个稀松平常的事情,–IPhone OS 另当别论。Android 对 Multitask 的处理方式有着自己独到之处,这让从其他平台转来的开发者有点发懵。凡事知其然,更要知其所以然,要设计出和 Android 完美“融合”的应用程序,理解 Multitask 是非常有必要的。这篇博文从设计考量出发,告诉你问题的大环境是什么,然后讲述现在的处理机制对于应用程序的影响,最后引出开发者应该如何利用好这一机制。 移动设备,例如手机等,有着苛刻的技术限制,内存、电量、运算速度等都不能和 PC 相提并论,用户体验更不能照搬桌面软件或者 web 系统,任何试图在移动设备上建立起和 PC 相等的用户体验是一种不怎么明智的想法。 Android 设计者在设计 multitask 时充分考虑到了这些,并归纳成四点设计考量: 很明显,前两点是冲突的。Android 淡化“关闭应用程序”这一常见的操作,相反 Android 想让用户感觉到所有的应用程序一直都在运行当中。与此同时,移动设备都有着比较苛刻的内存限制,因此一旦它需要的内存超过了可用的内存,系统就会很快变慢。这一对矛盾一直伴随着 Android 设计过程。 对 Android multitask 的一个常见误解是混淆进程和应用之间的差别。Android 里,用户可能看到了应用,实际上却没有进程在运行;多个应用可能共享一个进程,也可能一个应用使用了多个进程;应用可能没有在做任何事情,但是进程却会一直被保留。 事实上,进程正在“运行”,并不能等同应用就在运行,或者说在执行什么操作。用户离开应用,Android 会自行处置进程,如果判定稍后还需要这个它,则就会保留它,也有可能用户刚刚离开应用,Android 就清除掉了这个进程,但是这并不妨碍用户返回到刚刚离开的地方。 这种处理方式的关键是要明白进程并没有被彻底地关闭。当用户离开应用,应用进程会被保留在后台,需要的话,会允许它继续工作。如果用户返回应用,则进程立即进入到前台。假设设备从不会用完内存,那么 Android 就会保留所有的进程,并且让它们一直“运行”下去。 当然了,只有人的欲望才是无限的,机器的内存总是有限的,Android 在这一点上是非常清楚,因此它必须决定在什么时间清除掉不必要的进程。Android 会有规则来判断每一个进程的重要性以及哪一个进程应该被清除。这些规则基于两个因素:该进程对当前用户体验的重要性和距离上次使用到该进程的时间间隔有多久。 一旦 Android 决定要清除掉某个进程,那么它就会用简单粗暴的方式直接 KILL 它,同时内核会立即跟进,不管三七二十一,回收这个进程持有的所有资源。 如果用户返回到了进程已被杀死的应用,Android 需要有一种方法能够重新启动,并且恢复到此前的最后状态。通过跟踪用户关心的 Activity,记录观察到的状态信息,并使用最后的状态信息重新启动 Activity,Android 成功营造出了营造“all applications are running all of the time”的假象。用户每次离开 Activity,系统就会生成新的状态,–注意不是在进程被KILL时!正因为保留了最后的状态信息,所以内核才可以“肆无忌惮”地杀死进程。 某种意义上讲,Android 的进程管理可以被视为一种 swap space:应用进程代表了正在使用的内存的大小;当内存少了,一些进程会被杀死(相当于 swapped out);当这些进程被再次需要的时候,它们就会从最后保存的状态(swapped in)中恢复,重新启动。
详细解决方案
读《Multitasking the Android Way》(1)
热度:76 发布时间:2016-05-01 16:31:38.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法