来自《Android4高级编程》

Android应用程序不能控制自己的生命周期,应用程序组件(Activity、Service等其他组件)必须监听应用程序状态的变化并做出适当的反应,而且特别要注意为随时被终止做好准备。

默认情况下,每个Android应用程序都是通过他们自己的进程运行的,每一个进程都运行在独立的Dalvik实例中。每一个应用程序的内存和进程管理都是由运行时专门进行处理的。

通过在Manifest内对每一个收到影响的应用程序组件节点使用android:process属性,可以使同一个应用程序的组件运行在不同的进程中,或者让多个应用程序共享同一个进程。

1. Android应用程序类型

前台应用程序:只能运行在前台的应用程序,当它不可见时就会被挂起(比如:游戏)。

后台应用程序:和用户交互非常有限,出了配置期间,其生存期的其他时间都是隐藏的(比如:SMS自动回复程序和闹钟程序)。

间歇式应用程序:大多数设计良好的应用程序都归为这类。存在两种极端:更偏向于前台(比如:电子邮件程序和新闻阅读程序)和更偏向于后台(比如:媒体播放器程序)。

Widget和Live Wallpaper:一些应用程序只作为主屏幕Widget或Live Wallpaper出现。

当创建应用程序时,首先需要考虑用户可能使用应用程序的方式,然后再相应地进行设计。

P.S. 此处的挂起是什么含义?

2. 设计考量(都有哪些应用程序状态?)

2.1 前台应用程序

创建前台应用程序,需要仔细考虑Activity的生命周期,这样Activity才能在前台和后台之间连贯流畅地切换。

没有正在运行服务的后台程序将是Android Resource Manager首先要清除的对象。这就意味着,当应用程序进入后台时需要保存其状态, 这样当它返回到前台时,就可以正确地恢复到相同的状态。

对前台应用程序来说,呈现出直观的绚丽用户体验也是非常重要的。

2.2 后台应用程序

这些应用程序自动在后台运行,几乎没有用户输入。经常侦听由硬件、系统或其他应用程序产生的消息或动作,而不是依赖用户交互。

创建完全不可见的服务也是可以的,最好能够提供用户控制入口,让用户确信这些服务正在运行。

Service和Broadcast Receiver两者是后台应用程序的驱动力。

2.3 间歇式应用程序

通常情况下,可能需要创建能够对用户输入做出反应且当它不是前台Activity的时候仍然能够发挥作用的应用程序。需要考虑应用程序和用户交互时的状态:当应用程序可见时,更新Activity UI;不可见时,发送通知来让用户了解其最新状态。

在开发这种类型的应用程序时,必须确保应用程序的后台进程表现良好,对设备的电量造成最小的影响。

2.4 Widget和Live Wallpaper

通过创建Widget和Live Wallpaper,可以创建一些交互式可视组件,使用户的主屏幕上增加一些功能。

只包含Widget的应用程序通常用于显示动态信息,例如电量、天气或者日期。

Android主动管理它的资源,它会采取任何措施来保证稳定流畅的用户体验。也就是说:在必要的时候,进程有时候会在没有警告的情况下被终止,这样就可以为高优先级的应用程序释放资源。

Android系统是如何回收资源的?和上述讲到的应用程序优先级有什么关系?

Android系统回收资源的时候,进程被终止的顺序是由他们的应用程序的优先级所决定的。一个应用程序的优先级等同于它的优先级最高的组件的优先级。所有Android应用程序都会保持在内存中运行,直到系统需要释放它的资源供其他应用程序使用为止。

通过合理的组织应用程序来保证他具有能够正常工作的适当的优先级是非常重要的(也就是让应用程序具备某个级别的优先级)。如果没有做到这一点,则应用程序就可能在执行某些比较重要的操作时被终止,或者在不再需要的时候保持运行。

活动进程Active Process:活动进程也称为是前台进程,指那些有组件正和用户进行交互的应用程序组件。这些进程的数量非常少,只有到最后关头才会终止这些进程。包括:处于活动状态的Activity,即那些位于前台并对用户事件进行响应;正在执行onReceive()事件处理程序的Broadcast Receiver;正在执行相关回调的的Service;正在运行、且已被标记为在前台运行的Service。

可见进程:可见但是非活动的进程指那些驻留“可见”Activity的进程。

启动Service进程:已经启动的Service的进程。或者称为是后台的Service,该Service没有直接和用户交互,比可见Activity和前台Service的优先级别低。

后台进程:不可见、并且没有任何正在运行的Service的Activity的进程。

空进程:为了提高系统整体性能,Android经常在应用程序的生存期结束之后仍然把它们保留在内存中,Android通过维护这个缓存来减少应用个程序被再次启动时的启动时间。通常这些进程会根据需要被定期终止。

Android应用程序类型和进程状态的更多相关文章

  1. Android平台程序崩溃的类型及原因列举

    Android平台程序崩溃大家都应该遇到过,force close和ANR应该是大家遇到较多的. 这里把Android平台程序崩溃的各种类型做一个简述和原因列举. 1.ANR(可见ANR): 发生场景 ...

  2. Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB

    Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...

  3. 与Android应用程序相关的文件目录都有哪些?(转载)

    与Android应用程序相关的文件目录都有哪些? | 浏览:1312 | 更新:2014-09-28 19:43 | 标签:android 一.方法介绍:   每个Android应用程序都可以通过Co ...

  4. android的程序运行数据存放在哪里?

    Android应用开发中,给我们提供了5种数据的存储方式1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 ...

  5. Android应用程序窗口(Activity)与WindowManagerService服务的连接过程分析

    在前两文中,我们分析了Activity组件的窗口对象和视图对象的创建过程.Activity组件在其窗口对象和视图对象创建完成之后,就会请求与WindowManagerService建立一个连接,即请求 ...

  6. Android应用程序窗口(Activity)的视图对象(View)的创建过程分析

    从前文可知道,每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口.每一个应用程序窗口内部又包含有一个View对象,用来描述应用程序窗口的视图.应用程序窗口视图是真正用来 ...

  7. Android开发之 Android应用程序目录结构解析

    建立的HelloWorld的应用项目,其代码是由ADT插件自动生成的,形成Android项目特有的结构框架. 接下来让我带领大家解析一个Android程序的各个组成部分,这次我们拿一个Hello,Wo ...

  8. Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析(转)

    在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程.由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一 ...

  9. Android应用程序构成

    一个Android应用程序一般是由以下4个组件构成的: 活动(Activity) 意图(Intent) 服务(Service) 内容提供器(Content Provider) 这4个组件是构成andr ...

随机推荐

  1. 友盟冲突解决com.umeng.weixin.handler.UmengWXHandler cannot be cast to com.umeng.socialize.handler.UMWXHandler

    删掉一个试试

  2. css 函数

    css还有一些强大的函数: 1. calc 可以混合多种单位来计算 div { font-size: calc(100vw/5 + 1rem - 100px) } 2. max.min.clamp m ...

  3. python去除html标签的几种方法

    import re from bs4 import BeautifulSoup from lxml import etree html = '<p>你好</p><br/& ...

  4. Java实现AES加密

    一)什么是AES? 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用. ...

  5. IDEA打印gc日志,设置JVM参数方法

    打印gc日志 1.对指定运行程序输出GC日志: 点击edit configurations... 在vm options处加入-XX:+PrintGCDetails 测试:代码调用system.gc后 ...

  6. axios发送post请求,如何提交表单数据?

    axios发送post请求,提交表单数据的方式 默认情况下,axios将JavaScript对象序列化为JSON.要以application / x-www-form-urlencoded格式发送数据 ...

  7. Windows下VSCode编译调试c/c++

    参考链接:  https://blog.csdn.net/c_duoduo/article/details/51615381 支持makefile编译: https://www.cnblogs.com ...

  8. 安装scala

    Linux 环境 安装 下载的scala linux 压缩包放在目录 "/usr/scala “下 解压 tar -zxvf scala-2.11.8.tgz 再配置环境, 编辑文件 ”vi ...

  9. Spring Cloud 2-Ribbon 客户端负载均衡(二)

    Spring Cloud Eureka  1.Hello-Service服务端配置 pom.xml application.yml 启动两个service 2.Ribbon客户端配置 pom.xml ...

  10. linux异步IO的两种方式【转】

    转自:https://blog.csdn.net/shixin_0125/article/details/78898146 知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个C ...