Android应用程序模型:应用程序,任务,进程,和线程。

在大多数操作系统中可执行文件镜像和图标及其应用程序有很强的一一对应关系;可执行文件镜像中保存这应用程序信息,它是进程执行的基础;图标及其应用程序是给用户交互。在Android系统中,可执行文件镜像和图标及其应用程序间的关系要灵活得多,而且更重要的是要理解不同的程序片段如何被组合到起来。

由于Android应用程序的这种灵活性,当实现一个应用程序的片段时,有些基础术语需要解释一下:

  • 一个android 包(或简写成.apk)就是一个包含应用程序代码和其资源的文件。每个应用程序就是分布在这种文件中,在用户安装应用程序时用户下载这中文件到用户的机器上。

  • 一个任务就是用户感觉上能被加载执行的“应用程序”:通常一个任务在主界面上有一个用来访问它的图标;同时任务也可以作为顶层项目访问的,它能够被提到其它任务之前来作为前台运行。

  • 一个进程就是一个底层内核的处理过程,应用程序的代码在此运行。通常一个.apk文件中的所有代码是作为一个整体执行,也就是该apk的专门进程。然而,这个进程碎片能够在运行的地方被修改,要么是修改整个 .apk要么单独的修改activity,receiver,service, 或者provider, 组件等.

Tasks

这儿是一个关键点:当用户看到一个"应用程序"时,他们实际上是在同一个task打交到。如果你创建一个带有多个activity的.apk,那么其中一个 activity 是顶层入口点( 通过它的 actionandroid.intent.action.MAIN和 categoryandroid.intent.category.LAUNCHERintent-filter实现),那么会确实存在一个task创建你的.apk,而且任何你从那开始的activity都将作为该task的以部分运行。

从用户的角度透视你的应用程序和从开发这的角度透视你的应用程序,一个 task 就是一个 ativity 堆栈,或一个也可能是多个用户打开使用的activities。一个新的 task 是通过开始一个带有Intent.FLAG_ACTIVITY_NEW_TASK标签的activity Intent创建;这个Intent会被当成该task的根Intent,它定义task的类型。任何不带有该标签的,运行在同一个task内的activity,都像是只运行了一个activity,也就是启动的第一个activity(直到那个activity已经请求个别的启动模式,后面会讨论这个)。Task能够被重新排序:如果你使用一个已经运行且带有FLAG_ACTIVITY_NEW_TASK属性的task,则那个task的activity栈将被提到前端来,而不是重新开始个task。

FLAG_ACTIVITY_NEW_TASK必须小心使用:从用户的角度来说,使用它就意味着从使用点开始了一个新的应用程序。如果这不是你期望的行为,你就不应该创建一个新task。此外,这样的新task标签你仅应在这种情况下使用:它能使用户在主界面返回到他们原来所处的位置,并启动Intent就如同一个新task的一样。否则,如果用户在已经加载task后按下HOME键盘而不是BACK键,那么task和它的activities都将被调配到主屏后而没有一种方式能重新找回它们。

Task的亲和力

在一些情况下Android系统需要指导一个activity属于那个task,甚至什么时候它没有被加载到某个特定的task。这点通过task的亲和力复杂的实现,这种亲和力为task提供一个唯一的静态名字,该task就是一个或更多activities将运行的环境。一个activity的默认task亲和力就是该activity的实现所在的.apk包的名字,这提供的通常所期望的行为,对用户来说一个特别的.apk里的所有activities就是一个独立应用程序的一部分。

当启动一个新的不带Intent.FLAG_ACTIVITY_NEW_TASK标签的activity时,task亲和里就不影响该activity所在的task:它将一直运行在它启动时所在的task里。然而,如果这种NEW_TASK标签被使用了,那么这种亲和力就会被用来判断一个带有同样亲和力的task是否已经存在。若果然存在,那么该task将会被提到前端来,而且这个新的activity会被加载到该task的最顶层。

这个行为特性在必须使用NEW_TASK的情况下很有用,特别是从状态栏通知或主界面快捷方式启动activities。结果就是,当用户以这种方式启动你的应用程序时,应用程序当前的task将被提到后端,而且用户要查看的activity就被放置到应用程序的顶层。

你可以在你的清单的application标签中为.apt里的所有activities设置task亲和力,或者在众多独立activitiies的activity标签里设置。下面是一些如何使用这点的例子:

未完, 待续......

更多相关文章

  1. android 4实战开发:扩展用户体验
  2. Android(安卓)APP第三方授权登陆,分享等功能合集
  3. 如何安装Android应用程序到sdcard上
  4. Flutter教程(一) 十分钟了解Flutter
  5. Android显示原理
  6. Android(安卓)study(1)--Intent
  7. Android触摸事件onScroll和onFling特别重要啊,要区分
  8. Android最佳实践之响应灵敏性(ANR)
  9. Android数据存储---数据备份(Data Backup)(二)

随机推荐

  1. Python String 的replace()与List的remov
  2. 通过抢红包插件学习Accessibility Servic
  3. Android(安卓)线程消息循环机制
  4. android DHCP流程
  5. Android运行模式 未验证
  6. Android(安卓)Studio打包,jar,arr,apk
  7. android textview在code(代码)中设置图片
  8. android - Actionbar 上的 MenuItem 的 使
  9. Android之使用硬盘模拟SD卡
  10. rxjava2+okhttp3+retrofit2(请求参数按照