在大多数操作系统里,存在独立的一个1对1的可执行文件(如Windows里的exe文件), 它可以产生进程,并能和界面图标、应用进行用户交互。但在Android里,这是不固定的,理解将这些分散的部分如何进行组合是非常重要的。

由于Android这种可灵活变通的,在实现一个应用不同部分时你需要理解一些基础技术:

一个android包 (简称 .apk ) ,里面包含应用程序的代码以及资源。这是一个应用发布,用户能下载并安装他们设备上的文件。

一个 任务,通常用户能当它为一个“应用程序”来启动:通常在桌面上会有一个图标可以来启动任务,这是一个上层的应用,可以将你的任务切换到前台来。

一个进程是一个底层的代码运行级别的核心进程。通常.apk包里所有代码运行在一个进程里,一个进程对于一个.apk包;然而, 进程标签常用来改变代码运行的位置,可以是全部的.apk包或者是独立的活动, 接收器, 服务, 或者提供器组件。

任务

记住关键的一点:当用户看到的“应用”,无论实际是如何处理的,它都是一个任务。如果你仅仅通过一些活动来创建一个.apk包,其中有一个肯定是上层入口(通过动作的intent-filter以及分类android.intent.category.LAUNCHER),然后你的.apk包就创建了一个单独任务,无论你启动哪个活动都会是这个任务的一部分。

一个任务,从使用者的观点,他是一个应用程序;对开发者来讲,它是贯穿活动着任务的一个或者多个视图,或者一个活动栈。当设置Intent.FLAG_ACTIVITY_NEW_TASK标志启动一个活动意图时,任务就被创建了;这个意图被用作任务的根用途,定义区分哪个任务。如果活动启动时没有这个标记将被运行在同一个任务里(除非你的活动以特殊模式被启动,这个后面会讨论)。如果你使用 FLAG_ACTIVITY_NEW_TASK标记并且这个意图的任务已经启动,任务将被切换到前台而不是重新加载。

FLAG_ACTIVITY_NEW_TASK必须小心使用:在用户看来,一个新的应用程序由此启动。如果这不是你期望的,你想要创建一个新的任务。另外,如果用户需要从桌面退出到他原来的地方然后使用同样的意图打开一个新的任务,你需要使用新的任务标记。否则,如果用户在你刚启动的任务里按桌面(HOME)键,而不是退出(BACK)键,你的任务以及任务的活动将被放在桌面程序的后面,没有办法再切换过去。

任务亲和力(Affinities)

一些情况下Android需要知道哪个任务的活动附属于一个特殊的任务,即使该任务还没有被启动。这通过任务亲和力来完成,它为任务中一个或多个可能要运行的活动提供一个独一无二的静态名字。默认为活动命名的任务亲和力的名字,就是实现该活动.apk包的名字。这提供一种通用的特性,对用户来说,所有在.apk包里的活动都是单一应用的一部分。

当不带 Intent.FLAG_ACTIVITY_NEW_TASK标记启动一个新的活动,任务亲和力对新启动的活动将没有影响作用:它将一直运行在它启动的那个任务里。然而,如果使用NEW_TASK标记,亲和力会检测已经存在的任务是否具有相同的亲和力。如果是,该任务会被切换到前台,新的活动会在任务的最上面被启动。

你可以在你的表现文件里的应用程序标签里为.apk包里所有的活动设置你自己的任务亲和力,当然也可以为单独的活动设置标签。这里有些例子演示如何使用:

如果你的.apk包里包含多个用户可启动的上层应用程序,那么你可能想要为每个活动分配不同的亲和力。这里有一个不错的协定,你可以将不同的名字字串加上冒号附加在.apk包名字的后面 。 例如,”com.android.contacts”的亲和力命名可以是”com.android.contacts:Dialer” and “com.android.contacts:ContactsList”。
如果你想替换一个通知,快捷键,或者其它能从外部启动的应用程序的内部活动,你需要在你想替换的活动里明确的设置任务亲和力(taskAffinity)。例如,如果你想替换联系人详细信息浏览界面(用户可以直接操作或者通过快捷方式调用),你需要设置任务亲和力(taskAffinity)为“com.android.contacts”。

启动模式以及启动标记

你控制活动和任务通信的最主要的方法是通过设置启动模式的属性以及意图相应的标记。这两个参数能以不同的组合来共同控制活动的启动结果,这在相应的文档里有描述。这里我们只描述一些通用的用法以及几种不同的组合方式。

你最通常使用的模式是singleTop(除了默认为standard模式)。这不会对任务产生什么影响;仅仅是防止在栈顶多次启动同一个活动。
singleTask模式对任务有一些影响:它能使得活动总是在新的任务里被打开(或者将已经打开的任务切换到前台来)。使用这个模式需要加倍小心该进程是如何和系统其他部分交互的,它可能影响所有的活动。这个模式最好被用于应用程序入口活动的标记中。(支持MAIN活动和LAUNCHER分类)。

singleInstance启动模式更加特殊,该模式只能当整个应用只有一个活动时使用。

有一种情况你会经常遇到,其它实体(如搜索管理器SearchManager或者通知管理器NotificationManager)会启动你的活动。这种情况下,你需要使用 Intent.FLAG_ACTIVITY_NEW_TASK标记,因为活动在任务(这个应用/任务还没有被启动)之外被启动。就像之前描述的一样, 这种情况下标准特性就是当前和任务和新的活动的亲和性匹配的任务将会切换到前台,然后在最顶端启动一个新的活动。当然,你也可以实现其它类型的特性。

一个常用的做法就是将Intent.FLAG_ACTIVITY_CLEAR_TOP和NEW_TASK一起使用。这样做,如果你的任务已经处于运行中,任务将会被切换到前台来, 在栈里的所有的活动除了根活动,都将被清空,根活动的onNewIntent(Intent) 方法传入意图参数后被调用。当使用这种方法的时候singleTop或者singleTask启动模式经常被使用,这样当前实例会被置入一个新的意图,而不是销毁原先的任务然后启动一个新的实例。

另外你可以使用的一个方法是设置活动的任务亲和力为空字串(表示没有亲和力),然后设置finishOnBackground属性。如果你想让用户给你提供一个单独的活动描述的通知,倒不如返回到应用的任务里,这个比较管用。要指定这个属性,不管用户使用BACK还是HOME,活动都会结束;如果这个属性没有指定,按HOME键将会导致活动以及任务还留在系统里,并且没有办法返回到该任务里。

请确保阅读过文档启动模式属性(launchMode attribute)以及 意图标记(Intent flags),关注这些选项的详细信息。

进程

在Android中,进程是应用程序的完整实现,而不是用户通常了解的那样。他们主要用途很简单:
提高稳定性和安全性,将不信任或者不稳定的代码移动到其他进程。
可将多个.apk包运行在同一个进程里减少系统开销。

帮助系统管理资源,将重要的代码放在一个单独的进程里,这样就可以单独销毁应用程序的其他部分。

像前面描述的一样,进程的属性被用来控制那些有特殊应用组件运行的进程。注意这个属性不能违反系统安全: 如果两个.apk包不能共享同一个用户ID,却试图运行在通一个进程里,这种情况是不被允许的,事实上系统将会创建两个不同的进程。

请查看安全相关文档以获取更多关于安全限制方面的信息。

线程

每个进程包含一个或多个线程。多数情况下,Android避免在进程里创建多余的线程,除非它创建它自己的线程,我们应保持应用程序的单线程性。一个重要的结论就是所有呼叫实例, 广播接收器, 以及服务的实例都是由这个进程里运行的主线程创建的。

注意新的线程不是为活动,广播接收器,服务或者内容提供器实例创建:这些应用程序的组件在进程里被实例化(除非另有说明,都在同一个进程处理),实际上是进程的主线程。这说明当系统调用时这些组件(包括服务)不需要进程远距离或者封锁操作(就像网络呼叫或者计算循环),因为这将阻止进程中的所有其他组件。你可以使用标准的线程 类或者Android的HandlerThread 类去对其它线程执行远程操作。
这里有一些关于创建线程规则的例外:

呼叫IBinder或者IBinder实现的接口,如果该呼叫来自其他进程,你可以通过线程发送的IBinder或者本地进程中的线程池呼叫它们,从进程的主线程呼叫是不可以的。特殊情况下,呼叫一个服务的IBinder可以这样处理。(虽然在服务里呼叫方法在主线程里已经完成。)这意味着IBinder接口的实现必须要有一种线程安全的方法,这样任意线程才能同时访问它。

呼叫由正在被调用的线程或者主线程以及IBinder派发的内容提供器的主方法。被指定的方法在内容提供器的类里有记录。这意味着实现这些方法必须要有一种线程安全的模式,这样任意其它线程同时可以访问它。
呼叫视图以及由视图里正在运行的线程组成的子类。通常情况下,这会被作为进程的主线程,如果你创建一个线程并显示一个窗口,那么继承的窗口视图将从那个线程里启动。

Android应用程序模块:应用、任务、进程和线程相关推荐

  1. android线程安全ppt,Android 应用程序模块 应用, 任务, 进程, 和线程.ppt

    <Android 应用程序模块 应用, 任务, 进程, 和线程.ppt>由会员分享,可在线阅读,更多相关<Android 应用程序模块 应用, 任务, 进程, 和线程.ppt(12页 ...

  2. Android系统(40)---进程与线程

    Android是基于Linux的移动操作系统,但是和Linux本身还是有差别的面试过程中常常会问到相关线程和进程的问题,我们不妨来了解一哈.. 受限给一张大图构建一下总体的概念 由上图可知: 一.线程 ...

  3. android 获取手机运行的进程

    今天,简单讲讲如何获取系统运行的进程. ActivityManager.RunningAppProcessInfo类与获取正在运行的应用程序 每一个应用程序都会运行在它独立的进程里,但是为了节省资源或 ...

  4. Android中进程与线程

    常说的主线程(UI线程)是什么? 当一个Android程序刚启动的时候,我们的android系统就会启动一个带有一个单一线程的linux进程.默认情况下,所有的组件比如Activity都运行在同样的一 ...

  5. Android之进程与线程的讲解

    安卓平台中当首次启动运行一个组件的时候,Android会相应的启动了一个进程.默认的,所有的组件和程序运行在这个进程和线程中,也可以安排组件在其他的进程或者线程中运行. 进程:组件运行的进程由mani ...

  6. android任务 进程 线程详解,Android任务、进程、线程详解

    singleTop模式,基本上于standard分歧,仅正在请求的Activity反好位于栈顶时,无所区别.此时,配放成singleTop的Activity,不再会构制新的实例加入到Task栈外,而是 ...

  7. 掌握Android中的进程和线程

    进程和线程是现代网络操作系统的核心概念.Android作为一种优秀的.承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题.本文将详细介绍Android中的进程.线 ...

  8. android 获取linux线程状态,Android 的进程与线程总结

    本文翻译自Android官方文档 当一个Android应用程序组件启动时候,如果此时这个程序的其他组件没有正在运行,那么系统会为这个程序以单一线程的形式启动一个新的Linux 进程. 默认情况下,同一 ...

  9. Android中的进程和线程

    写在前面的话 一个Android应用就是一个Linux进程,每个应用在各自的进程中运行,互不干扰,比较安全. 一个应用对应一个主线程,就是通常所说的UI线程,android遵守的就是单线程模型,所以说 ...

最新文章

  1. 第五周周记(国庆第一天)
  2. 网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置)
  3. 视学AI,这群大学生做了个牛逼的项目!
  4. 外包干了四年,废了!
  5. svn数据库自动备份脚本
  6. 6.mysql 锁机制
  7. Mono Compatibility
  8. java设计模式-简单工厂模式
  9. 数据结构练手02 双向链表实现
  10. little w and Sum(思维)
  11. L2-2 口罩发放 (25 分)
  12. Android简单实现汉字笔顺动画——Java版
  13. 普林斯顿微积分读本篇六:求解微分问题
  14. 《Python实用爬虫案例》练习8:获取搜狗搜索引擎微信文章
  15. 飞鱼星路由器常见问题解答
  16. Edge浏览器查看请求头(2022)
  17. 添加178源未能链接服务器,添加178源_在cydia中添加178源_178插件源-Guide信息网
  18. 是什么撑起了极兔快递近200亿美元的估值?
  19. WPS Office 2019文字组件插入和改写状态的切换
  20. 【博学谷学习记录】超强总结,用心分享 | shell基础

热门文章

  1. mysql多启动与日志调优
  2. Redis和Memcached,干货来一波
  3. phpcms数据库操作
  4. SDWAN动态路径选择是什么?SDWAN成本降低的意义是什么?
  5. 【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)
  6. app启动页的设计技巧(一)
  7. UVA - 1346 Songs (贪心+排序)
  8. 查看文档(API) (NSString)
  9. MySQL order by 是怎么工作的?
  10. 2020年女人体重表,看看你是不是标准的模特体重