Android中Activity详解(中)

书接上文,距离上次发文也有几天的时间了,最近一直在忙着公司的投标问题,迟迟没有更新,敬请大家谅解,闲话少叙,我们马上进入正题。
这里写图片描述

进程的优先级

Android 系统会尽可能长的延续一个应用程序进程,但在内存过低的时候,仍然会不可避免需要移除旧的进程。为了决定哪些进程留下,哪些进程被杀死,系统根据在进程中在运行的组件及组件的状态,为每一个进程分配了一个优先级等级。优先级最低的进程首先被杀死。这个进程重要性的层次结构主要有五个等级。
这里写图片描述
  
Android 会尽可能高的估量一个进程的级别。比如,一个进程拥有一个可见状态的 activity 和一个 service,这个进程会被认为是可见进程,而不是服务进程。
一个进程的级别可能会由于其它进程依赖于它而升高。一个为其它进程提供服务的进程级别永远高于使用它服务的进程。比如说,如果A进程中的内容提供者为进程B中的客户端提供服务,或进程A 中的服务为进程B中的组件所绑定,则A进程高于或者等于进程B的等级。
  
进程的五个常用等级:

1. 前台进程(Foreground process)

前台进程表明用户正在与该进程进行交互操作,如果满足下面各种情况中的一种,一个进程被认为是在前台:

  • 进程持有一个正在与用户交互的 Activity。
  • 进程持有一个 Service,这个 Service 处于这几种状态:
    ①Service与用户正在交互的Activity绑定。
    ②Service是在前台运行的,即它调用了startForeground()。
    ③Service正在执行它的生命周期回调函数( onCreate() , onStart() , onDestroy() )。
  • 进程持有一个 BroadcastReceiver,这个 BroadcastReceiver 正在执行它的 onReceive() 方法。

一般情况下,不会有太多的前台进程。杀死前台进程是操作系统最后无可奈何的做法。当内存严重不足的时候,前台进程一样会被杀死。

2.可见进程(Visible process)

如果一个进程不含有任何前台的组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可见的:

  • 进程持有一个 Activity,这个 Activity 不在前台,但是仍然被用户可见(处于 onPause() 调用后又没有调用 onStop() 的状态,比如,前台的 activity 打开了一个对话框,这样 activity 就会在其后可见)。
  • 进程持有一个 Service,这个 Service 和一个可见的(或者前台的)Activity 绑定。

可见的进程也被认为是很重要的,一般不会被销毁,除非是为了保证所有前台进程的运行而不得不杀死可见进程的时候。

3.服务进程 (Service process)

如果一个进程中运行着一个 Service ,这个 Service 是通过 startService() 开启的,并且不属于上面两种较高优先级的情况,这个进程就是一个服务进程。

尽管服务进程没有和用户可以看到的东西绑定,但是它们一般在做的事情是用户关心的,比如后台播放音乐,后台下载数据等。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要。

4.后台进程 (Background process)

如果进程不属于上面三种情况,但是进程持有一个用户不可见的 Activity(Activity 的 onStop() 被调用,但是 onDestroy() 没有调用的状态),就认为进程是一个后台进程。

后台进程不直接影响用户体验,系统会为了前台进程、可见进程、服务进程而任意杀死后台进程。

通常会有很多个后台进程存在,它们会被保存在一个 LRU (least recently used) 列表中,这样就可以确保用户最近使用的 Activity 最后被销毁,即最先销毁时间最远的 Activity。

5.空进程 (Empty process)

如果一个进程不包含任何活跃的应用组件,则认为是空进程。
例如:一个进程当中已经没有数据在运行了,但是内存当中还为这个应用驻留了一个进程空间。
保存这种进程的唯一理由是为了缓存的需要,为了加快下次要启动这个进程中的组件时的启动时间。系统为了平衡进程缓存和底层内核缓存的资源,经常会杀死空进程。

Activity任务栈

为什么需要了解关于Activity的任务栈,其实最直接的体现就是提高用户交互友好性。
举个例子,当我们去浏览一个新闻客户端的时候,我们进入了新闻详情页,在这个页面有相隔两条的新闻标题,当我们去点击这个标题的时候进入了新的新闻详情页时,如果我们不加以控制会导致什么现象?它会创建出n个新闻详细页的 Activity 实例,导致用户在退出的时候需要推出多个新闻详情 Activity,这点在用户体验上是非常不好的,当然对于我们自身的程序也是非常不好的,不断的去创建新的 Activity 必定会消耗一定的内存,久而久之,应用程序会越来越卡甚至崩溃。

什么是栈?

简单点来理解,可以把栈比作一个开封的箱子,我们可以往里面塞东西,这里假设塞的东西的底面积和箱子的底面积是相同的,那么这些东西就具备有从下往上一定的顺序,当我们想要取出箱子里面的东西时,我们没有办法一下子拿到箱子最底层的东西,我们只能拿到最上面一层的东西,从上往下。
来看下这张图,这里的箱子就是栈,箱子口可以看作是栈的入口与出口,东西代表数据。栈的特点:具有一定的次序,后进先出(越先放入的东西,越晚出来)。
栈

Activity任务栈  

在了解了什么是栈之后,我们可以开始进入今天的主题了,在Android的官方文档描述中我们可以知道,任务栈也是栈,具有栈的一切特点。
Activity 任务栈,顾名思义是存放 Activity 任务的栈,这里的任务栈为上图箱子,Activity 为上图的东西。
当我们每打开一个 Activity 的时候它会就往 Activity 任务栈中压入一个 Activity,当我们每销毁一个 Activity 的时候它会从 Activity 任务栈中弹出一个 Activity,由于安卓系统自身的设计,我们只能在手机屏幕上获取当前一个 Activity 的焦点即栈顶元素(最上面的 Activity ),其余的 Activity会暂居后台等待系统调用。

1、关于任务栈的概念:

任务栈是用来提升体验而设计的:

  1. 程序打开时就创建了一个任务栈,用于存储当前程序的 activity,当前程序(包括被当前程序所调用的)所有的 activity 属于一个任务栈。
  2. 一个任务栈包含了一个 activity 的集合,可以有序的选择哪一个 activity 和用户进行交互,只有在任务栈栈顶的 activity 才可以跟用户进行交互。
  3. 任务栈可以移动到后台,并且保留了每一个 activity 的状态. 并且有序的给用户列出它们的任务, 而且还不丢失它们状态信息。
  4. 退出应用程序时,当把所有的任务栈中所有的 activity 清除出栈时,任务栈会被销毁,程序退出。
2、关于任务栈的缺点:
  1. 每开启一次页面都会在任务栈中添加一个 Activity,而只有任务栈中的 Activity 全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用户体验差,需要点击多次返回才可以把程序退出了。
  2. 每开启一次页面都会在任务栈中添加一个 Activity 还会造成数据冗余重复数据太多,会导致内存溢出的问题(OOM)。

今天的内容就到这里,到站了,下车!
告辞

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值