我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

本文讲述了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 多进程资料总结


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

本文讲述了Android应用程序模型之应用程序,任务,进程,线程。分享给大家供大家参考,具体如下: 大多数操作系统,在应用程序所寄存的可执行程序映像(如Windows系统里的.exe)、它所运行的进程以及和用户交互的图标和应用之间有一种严格
2022-06-06

Flex应用程序模型的示例分析

这篇文章主要介绍Flex应用程序模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建一个Flex应用程序Flex应用程序模型Flex创建一个应用程序时,你使用组件(容器/containers和控件/con
2023-06-17

WCF编程应用程序举例分析

这篇文章主要讲解了“WCF编程应用程序举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WCF编程应用程序举例分析”吧!在后台运行WCF编程应用程序。出现提示后,单击OK按钮激活Web.
2023-06-17

如何进行ASP.NET MVC应用程序执行过程的分析

本篇文章给大家分享的是有关如何进行ASP.NET MVC应用程序执行过程的分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建一个简单的ASP.NET MVC应用程序ASP.
2023-06-17

VB.NET应用程序的示例分析

小编给大家分享一下VB.NET应用程序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!VB.NET应用程序入门指南并不打算涵盖该编程语言的所有方面。它们只
2023-06-17

解析Android应用程序运行机制

在标准的Windows和Linux桌面操作系统中,同时可以在不同的窗口中运行多个应用程序,每次只有一个应用程序是当前焦点状态,但其他的应用程序都是一个平等的位置。用户可以随时切换每个应用程序,在不需要应用程序时,也需要用户来关闭应用程序。
2022-06-06

如何进行Python应用程序简析

本篇文章为大家展示了如何进行Python应用程序简析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。最初设计Python应用程序的人并没有想到今天Python会在工业和科研上获得如此广泛的使用,这大大
2023-06-17

应用程序与驱动程序通信DeviceIoControl的示例分析

这篇文章主要介绍了应用程序与驱动程序通信DeviceIoControl的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、定义IO控制码 其实可以看作是一种通信协议看
2023-06-15

Android编程之退出整个应用程序的方法

本文实例讲述了Android编程之退出整个应用程序的方法。分享给大家供大家参考,具体如下: 我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者直接按home键直接
2022-06-06

Python Logging 模块在大型应用程序中的应用

Python Logging 模块在大型应用程序中发挥着至关重要的作用,它提供了日志记录、错误处理和调试的强大功能。本文着重探讨 Logging 模块在大型应用程序中的应用,展示如何使用它来捕获、过滤和存储日志信息。
Python Logging 模块在大型应用程序中的应用
2024-02-20

Android Handler主线程和一般线程通信的应用分析

Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 B
2022-06-06

Android中使用GridView进行应用程序UI布局的教程

0.简介 GridView 和 ListView 有共同的父类:AbsListView,因此 GridView 和 ListView 具有一定 的相似性。GridView与ListView的主要区别在于:ListView只是在一个方向上分布
2022-06-06

如何分析Java应用程序和Hibernate

本篇文章为大家展示了如何分析Java应用程序和Hibernate,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Hibernate有很多值得学习的地方,这里我们主要介绍Java应用程序和Hiberna
2023-06-17

如何进行Jerry的spark演示应用程序分析

如何进行Jerry的spark演示应用程序分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java应用程序入口:输入一个文本文件,这个Java应用会利用Spa
2023-06-02

Flex模块化应用程序开发的示例分析

这篇文章主要介绍了Flex模块化应用程序开发的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex模块化应用程序开发如果你没有看过RogerGonzalez的Blo
2023-06-17

OpenHarmony南向设备应用程序启动流程分析

本文采用倒序的方式,初步梳理了从Hi3861芯片上电到OpenHarmony应用程序启动运行的流程。

ANDROID应用程序的混淆打包分享

android应用程序的混淆打包1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示:target=android-8 proguard.config=prog
2022-06-06

Android应用程序四大组件之使用AIDL如何实现跨进程调用Service

一、问题描述Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Service都可以进行跨进程。在上一篇我们通过ContentProvider实现了不同应用之间的跨进程调用
2022-06-06

Android编程之重力感应用法分析

本文实例讲述了Android编程之重力感应用法。分享给大家供大家参考,具体如下: 重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器。因为很
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录