广告
返回顶部
首页 > 资讯 > 移动开发 >Android应用程序模型之应用程序,任务,进程,线程分析
  • 580
分享到

Android应用程序模型之应用程序,任务,进程,线程分析

进程程序模型线程Android 2022-06-06 09:06:21 580人浏览 独家记忆
摘要

本文讲述了Android应用程序模型之应用程序,任务,进程,线程。分享给大家供大家参考,具体如下: 大多数操作系统,在应用程序所寄存的可执行程序映像(如windows系统里的.

本文讲述了Android应用程序模型之应用程序,任务,进程,线程。分享给大家供大家参考,具体如下:

大多数操作系统,在应用程序所寄存的可执行程序映像(如windows系统里的.exe)、它所运行的进程以及和用户交互的图标和应用之间有一种严格的1对1关系。在Android系统里,这些关联要松散得多。并且重要的是要理解各种概念怎么样组成整体。

由于Android应用固有的灵活性,当实现这些不同方面的时候有一些基本术语需要加以理解:

① 一个Android包 (.apk)文件,其中包含一个应用程序的代码和资源。这是应用程序分发和下载的文件,用户用来安装该应用程序在他们的设备上。
② 一个任务一般而言是指用户视为的一个可启动应用程序:通常任务在桌面(home screen)有一个可访问的图标,且可以被切换到前台。
③ 一个进程是一个运行着应用程序代码的底层核心过程。通常所有.apk里的代码运行在一个专有的进程里。不过,进程标记也可以用来限定代码运行位置,或者为整个.apk或者为个别的活动activity,接收者receiver,服务或提供者provider,组件。

任务

这里的一个关键点是:当用户看到一个“应用”时,他们实际上在和任务打交道。如果您刚刚创建一个包含若干活动的.apk,其中之一是顶层入口点(通过动作android.intent.action.MaiN的意图过滤器intent-filter和类别android.intent.cateGory.LAUNCHER),那么这事实上将为您的.apk创建一个任务,并且您从那儿起动的任何活动都将作为那个任务的一部分运行。

一个任务,那么,从用户的角度来看是您的应用程序;而从应用程序开发者的角度来看,它是一个或多个用户在那个任务中已经经历过且未关闭的活动,或者说是一个活动栈。一个新的任务通过以Intent.FLAG_ACTIVITY_NEW_TASK标志起动一个活动意图来创建;这一意图将被用来作为任务的根意图,定义任务是什么。任何不以这个标志起动的活动将和起动它的活动在相同的任务中运行(除非该活动已请求特别启动模式,稍后会讨论)。任务可以被重新安排:如果您使用FLAG_ACTIVITY_NEW_TASK标志但已经有一个任务以这个意图运行,则当前任务的活动栈将被切换到前台而不是开始一个新的任务。

FLAG_ACTIVITY_NEW_TASK必 须谨慎使用:使用它意味着,在用户看来,一个新的应用程序由此起动。如果这不是你所期望的行为,你就不该去创建一个新的任务。另外,仅在用户可以从桌面返 回到他原来的地方和以一个新任务启动相同意图的情况下,你才应该使用新的任务标记。否则,如果用户在你已经启动的任务里按桌面(HOME)键,而不是返回(BACK)键,你的任务及其活动将被放置到桌面后面,没有办法再切换回去。

任务共用性Affinity

在某些情况下,Android需要知道一个活动属于哪个任务即使它没有被启动到一个具体的任务里。这是通过任务共用性(Affinities)完成的。任务共用性(Affinities)为这个运行一个或多个活动的任务提供了一个独特的静态名称,默认的一个活动的任务共用性(Affinity)是实现了该活动的.apk包的名字。这提供了预期的标准特性,即所有在一个特定的.apk包里的活动是单个用户应用程序的一部分。

当开始一个没有Intent.FLAG_ACTIVITY_NEW_TASK标志的活动时,任务共用性affinities不会影响将会运行该新活动的任务:它总是运行在启动它的任务里。但是,如果使用了NEW_TASK标志,那么共用性(affinity)将被用来判断是否已经存在一个有相同共用性(affinity)的任务。如果是这样,这项任务将被切换到前面而新的活动会启动于这个任务的顶层。

这种特性在您必须使用NEW_TASK标志的情况下最有用,尤其是从状态栏通知或桌面快捷方式启动活动时。结果是,当用户用这种方式启动您的应用程序时,它的当前任务将被切换到前台,而且想要查看的活动被放在最上面。

你可以在程序清单(Manifest)文件的应用程序application标签中为.apk包中所有的活动分配你自己的任务共用性Affinites,或者在活动标记中为各个活动进行分配。一些说明其如何使用的例子如下:

① 如果您的.apk包含多个用户可以启动的高层应用程序,那么您可能需要对用户看到的每个活动指定不同的affinities。一个不错的命名惯例是以附加一个以冒号分隔的字符串来扩展您的.apk包名。例如,“ com.android.contacts ”.apk可以有affinities:“com.android.contacts:Dialer”和“ com.android.contacts:ContactsList”。
② 如果您正在替换一个通知,快捷方式,或其他可以从外部发起的应用程序的“内部”活动,你可能需要明确设定您替代活动的taskAffinity和您准备替代的应用程序一样。例如,如果您想替换contacts详细信息视图(用户可以创建并调用快捷方式),你得把taskAffinity设置成“com.android.contacts”。

启动模式和启动标志

您控制活动和任务交互的主要途径是通过活动的launchMode 属性和意图相关的标志flags。这两个参数可以以各种方式合作来控制活动启动的结果,正如它们相关文档中描述的那样。在这里,我们将看看一些常见的用例和参数组合。

你将使用的最常见的启动模式(除了默认的standard模式)是singleTop。这并不影响任务;它只是避免多次在一个堆栈顶部起动同一活动。

singleTask启动模式对任务有重大的影响:它使活动始终是开始于一项新的任务(或其现有的任务被带到前台) 。使用这种模式需要谨慎对待你如何与系统其他部分进行交互,因为这影响到这个活动中的每一个路径。它应当仅在活动处于应用程序前台时使用(也就是支持MAIN动作和LAUNCHER类别)。

singleInstance启动模式更是专业,并应仅用于整个就是被实现为一个活动的应用程序中。

有一种你会经常遇到的情况是当另一个实体(如SearchManager 或NotificationManager)开始您的一个活动。在这种情况下,必须使用Intent.FLAG_ACTIVITY_NEW_TASK 标签,因为该项活动是在任务之外起动的(而且应用/任务可能根本不存在)。正如前面所述,这种情况下的标准行为是把匹配新活动affinity的任务带到前台和在此之上起动新的活动。不过,也有其他您可以实施的行为类型。

一种通常的办法是和NEW_TASK联合起来使用Intent.FLAG_ACTIVITY_CLEAR_TOP标志。这样,如果您的任务已经运行,那么它将会被带到前台,除根活动外其它所有堆栈中的活动都被清除,而且这个根活动的方法onNewIntent(Intent)会在该意图起动时被调用。注意这个活动使用这个方法时经常使用singleTop或者singleTask起动模式,这样当前实例被赋予新的意图而不是需要销毁它然后重新起动一个新的实例。

您能采取的另外的方法是设置通知活动的任务affinity为空字符串“”(表示没有affinity),并设置finishOnBackground属性。这种方法是有用的如果你希望这个通知把用户带到一个单独的描述它的活动中,而不是返回到应用程序的任务。通过指定这个属性,该活动将被结束不管用户通过BACK还是HOME离开它;如果这个属性没有指定,按首页将导致这个活动及其任务仍保留在系统里,且可能没有办法返回它。

请务必阅读关于launchMode属性和Intent标志的文档以获取这些选项的详细说明。

进程

在Android里,进程完全是应用的实现细节,而不是用户通常了解的那样。其主要用途就是:

① 通过安置不受信任的或不稳定的代码到另一个进程来提高稳定性或安全性。
② 通过在同一进程里运行多个.apks的代码来减少开销。
③ 通过把重量级代码放在单独的进程中来帮助系统管理资源,该进程可以在不影响应用程序其他部分的情况下被终止。

正如前面所述,这个进程属性用来控制运行着特定应用程序组件的进程,注意,此属性不能用于违反系统安全性:如果有两个不共享相同用户ID的.apks尝试运行在同一进程中,这将不会被允许,相反会为它们每一个创建不同的进程。

参见安全文档以获取更多关于安全限制方面的信息。

线程

每个进程包含一个或多个线程。多数情况下,Android避免在进程里创建额外的线程,以保持应用程序单线程,除非它创建自己的线程。一个重要的结果就是所有对活动Activity,广播接收器BroadcastReceiver以及服务Service实例的调用都是由这个进程的主线程创建的。

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

这里有一些关于这个线程规则的重要的例外:

① 对IBinder或者IBinder实现的接口的调用由调用线程或本地进程的线程池(如果该呼叫来自其他进程)分发,而不是它们的进程的主线程。特殊情况下,一个服务的IBinder可以这样调用。(尽管调用服务里的方法已经在主线程里完成。)这意味着IBinder接口的实现必须要有一种线程安全的方法,这样任意线程才能同时访问它。
② 对ContentProvider主要方法的调用由调用线程或者主线程分发,如同IBinder一样。被指定的方法在内容提供器的类里有记录。这意味着实现这些方法必须要有一种线程安全的模式,这样任意其它线程可以同时访问它。
③ 视图及其子类中的调用由正在运行着视图的线程产生。通常情况下,这会被作为进程的主线程,如果你创建一个线程并显示一个窗口,那么继承的窗口视图将从那个线程里启动。

希望本文所述对大家Android程序设计有所帮助。

您可能感兴趣的文章:Android开发中多进程共享数据简析Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析Android 跨进程通Messenger(简单易懂)详解Android进程和线程实例讲解Android中的AIDL内部进程通信接口使用Android结束进程的方法详解Android中进程生命周期的优先级Android 多进程资料总结


--结束END--

本文标题: Android应用程序模型之应用程序,任务,进程,线程分析

本文链接: https://www.lsjlt.com/news/25975.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android应用程序模型之应用程序,任务,进程,线程分析
    本文讲述了Android应用程序模型之应用程序,任务,进程,线程。分享给大家供大家参考,具体如下: 大多数操作系统,在应用程序所寄存的可执行程序映像(如Windows系统里的....
    99+
    2022-06-06
    进程 程序 模型 线程 Android
  • Flex应用程序模型的示例分析
    这篇文章主要介绍Flex应用程序模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建一个Flex应用程序Flex应用程序模型Flex创建一个应用程序时,你使用组件(容器/containers和控件/con...
    99+
    2023-06-17
  • WCF编程应用程序举例分析
    这篇文章主要讲解了“WCF编程应用程序举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WCF编程应用程序举例分析”吧!在后台运行WCF编程应用程序。出现提示后,单击OK按钮激活Web....
    99+
    2023-06-17
  • VB.NET应用程序的示例分析
    小编给大家分享一下VB.NET应用程序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!VB.NET应用程序入门指南并不打算涵盖该编程语言的所有方面。它们只...
    99+
    2023-06-17
  • 解析Android应用程序运行机制
    在标准的Windows和Linux桌面操作系统中,同时可以在不同的窗口中运行多个应用程序,每次只有一个应用程序是当前焦点状态,但其他的应用程序都是一个平等的位置。用户可以随时切...
    99+
    2022-06-06
    运行 程序 Android
  • Android编程之退出整个应用程序的方法
    本文实例讲述了Android编程之退出整个应用程序的方法。分享给大家供大家参考,具体如下: 我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退...
    99+
    2022-06-06
    程之 程序 方法 应用程序 Android
  • 如何进行ASP.NET MVC应用程序执行过程的分析
    本篇文章给大家分享的是有关如何进行ASP.NET MVC应用程序执行过程的分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建一个简单的ASP.NET MVC应用程序ASP....
    99+
    2023-06-17
  • 应用程序与驱动程序通信DeviceIoControl的示例分析
    这篇文章主要介绍了应用程序与驱动程序通信DeviceIoControl的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、定义IO控制码 其实可以看作是一种...
    99+
    2023-06-15
  • Android Handler主线程和一般线程通信的应用分析
    Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管...
    99+
    2022-06-06
    handler 通信 线程 Android
  • Android编程之重力感应用法分析
    本文实例讲述了Android编程之重力感应用法。分享给大家供大家参考,具体如下: 重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开...
    99+
    2022-06-06
    程之 重力感应 Android
  • 如何分析Java应用程序和Hibernate
    本篇文章为大家展示了如何分析Java应用程序和Hibernate,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Hibernate有很多值得学习的地方,这里我们主要介绍Java应用程序和Hiberna...
    99+
    2023-06-17
  • Flex模块化应用程序开发的示例分析
    这篇文章主要介绍了Flex模块化应用程序开发的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex模块化应用程序开发如果你没有看过RogerGonzalez的Blo...
    99+
    2023-06-17
  • 如何进行Python应用程序简析
    本篇文章为大家展示了如何进行Python应用程序简析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。最初设计Python应用程序的人并没有想到今天Python会在工业和科研上获得如此广泛的使用,这大大...
    99+
    2023-06-17
  • ANDROID应用程序的混淆打包分享
    android应用程序的混淆打包1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示:targe...
    99+
    2022-06-06
    程序 Android
  • 如何进行Jerry的spark演示应用程序分析
    如何进行Jerry的spark演示应用程序分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java应用程序入口:输入一个文本文件,这个Java应用会利用Spa...
    99+
    2023-06-02
  • Android中使用GridView进行应用程序UI布局的教程
    0.简介 GridView 和 ListView 有共同的父类:AbsListView,因此 GridView 和 ListView 具有一定 的相似性。GridView与Li...
    99+
    2022-06-06
    gridview 教程 Android
  • Web应用程序中Resource Bundle技术分析
    本篇内容介绍了“Web应用程序中Resource Bundle技术分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够...
    99+
    2022-10-19
  • Laravel应用程序中怎么使用模型工厂
    本文小编为大家详细介绍“Laravel应用程序中怎么使用模型工厂”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel应用程序中怎么使用模型工厂”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Laravel...
    99+
    2023-07-04
  • 构建J2EE应用程序的任务列表 (转)
    构建J2EE应用程序的任务列表 (转)[@more@]构建J2EE应用程序的任务列表XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />1、完成...
    99+
    2023-06-03
  • Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
    一、问题描述   Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Service都可以进行跨进程。在上一...
    99+
    2022-06-06
    service 进程 程序 aidl Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作