管理Activity和组件运行状态的系统进程--ActivityManagerService(AMS)

本文主要是介绍管理Activity和组件运行状态的系统进程--ActivityManagerService(AMS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系统代码分析基于Android10.0

Android 10引入了许多新特性和改进,其中包括对Android应用程序管理系统(AMS)的一些重大改变。AMS(Activity Manager Service)是Android操作系统的重要组件之一,负责管理应用程序的生命周期、任务栈和任务切换等功能。下面是Android 10系统中AMS的一些主要特点:

活动隔离(Activity Isolation):在Android 10中,引入了一种新的活动隔离模型,称为“ActivityTask”。传统上,Android应用程序在单个进程中运行,并且所有活动都在同一个进程中。但是,ActivityTask允许将每个活动放在单独的进程中,以提高系统的稳定性和安全性。

后台启动限制(Background Start Restrictions):为了提高系统性能和电池寿命,Android 10对后台启动应用程序进行了限制。AMS在Android 10中引入了新的限制规则,以防止应用程序在后台自动运行,并限制了后台应用程序对系统资源的访问。

活动栈管理(Activity Stack Management):Android 10对活动栈管理进行了一些改进。现在,AMS可以在应用程序的任务栈中标记活动,以表明它们的重要性和关联性。这有助于系统更好地管理任务切换和应用程序的多任务处理。

系统级活动(System-level Activities):Android 10引入了一些新的系统级活动,这些活动可以通过系统应用程序启动,而无需用户交互。这些系统级活动可以用于执行特定的系统操作,例如显示系统设置或权限请求。

后台服务限制(Background Service Restrictions):为了增强系统的安全性和性能,Android 10对后台服务进行了限制。AMS现在会更加严格地监控后台服务的运行,并限制它们对系统资源的使用。

一、AMS功能概述

AMS是Android提供的一个用于管理Activity(和其他组件)运行状态的系统进程,也是我们编写APK应用程序时使用的最频繁的一个系统服务。 AMS是寄存于systemServer中的。它会在系统启动时,创建一个线程来循环处理客户的请求。

1.1 AMS启动 

/frameworks/base/services/java/com/android/server/SystemServer.java

    ActivityTaskManagerService atm =mSystemServiceManager.startService( ActivityTaskManagerService.Lifecycle.class).getService();// 通过AMS内部类Lifecycle 来实例化mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);mWindowManagerGlobalLock = atm.getGlobalLock();

我们可以看到通过Android10系统通过了内部静态类Lifecycle来实例化AMS 

  // 通过AMS内部类Lifecycle 来实例化
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
    mSystemServiceManager, atm);

可以看下内部类Lifecycle结构:

最后调用startService是SysemServiceManager的startService  

SystemServiceManager.java  

 实例化ActivityServiceManager后,还在SysetmServer.java调用了 ams的setSystemProcess ()方法,向Service Manager注册 。

1.2 组件状态管理 

这里组件不仅仅指Activity,而是所有四大组件。状态管理包括组件的开启,关闭等一些列操作。 例如: startActivity、startActivityAndWait、activityPaused、startService、stopService、removeContentProvider等  。

查询当前组件运行情况,如:getCallingActivity、getServices等。 

Task相关: removeTask、removeSubTask、moveTaskBackwards、moveTaskToFrom 。

系统运行相关:getMemoryInfo、setDebugApp 

二、管理当前系统中Activity状态--Activity Stack

从名称看,Activity Stack是管理当前系统中所有Activity状态的一个数据结构。

2.1 ActivityState 

  enum ActivityState {INITIALIZING,  // 正在初始化RESUMED,       // 回复PAUSING,       //正在暂停PAUSED,        // 已经暂停STOPPING,      //正在停止STOPPED,       //已经停止FINISHING,     //正在完成 DESTROYING,    //正在销毁DESTROYED,      // 已经销毁RESTARTING_PROCESS   // 重启过程 }

结合Activity状态改变时其自身所能收到的回调函数,如下图:

 

有一些在ActivityStack中, 有一些在ActivityStackSupervisor中 , 下列是几个重要的ArrayList :

ArrayListDescription
mTaskHistory (ActivityStack)
所有Activity的信息都在之类记录,直到它被destroy
 mLRUActivities (ActivityStack)
正在运行的Activity的列表集合,以最近使用情况来排序,既队头是最近使用最少得元素 
mStopingActivitys (ActivityStackSupervisor)已经可以被Stop,但是还的等待下一个Activity处于就绪状态
mGoingToSleepActivities (ActivityStackSupervisor)正在进入睡眠状态
mNoAnimActivities (ActivityStackSupervisor)不考虑状态间迁移动画
mFinishingActivities (ActivityStackSupervisor)已经可以被finiished,但还需要等待一个上一个Activity就绪 

 记录特殊状态 :

ActivityRecordDescription
mPausingActivity
当前正在被暂停(pasuing)的Activity
mLastPausedActivity
上一个被暂停的Activity
 mResumedActivity
当前被恢复(resumed)的Activity,可以为null
mLastNoHistoryActivity
一旦用户离开指定“无历史记录”的活动,就必须将其删除。

2.2  AMS的主要工作就是管理、记录、查询

2.3 AMS是系统进程的一部分,且独立运行独立的线程中 

从内核角度,AMS是普通进程中的一部分,它提供的是全局性的系统服务。 AMS的任务自负责保管组件的状态信息,像Activity的UI界面如何绘制如何在物理屏幕上显示等工作则是由WindowManagerService和SurfaceFlinger来完成的 。

三、startActivity流程

大家对startActivity(Intent) 功能一定不陌生,用于启动一个目标Activity,但是它到底经历哪些事情呢?首先从startActivity()所经历的函数调用流程来看

Activity -->  startActivity@ContextImpl.java -->execStartActivity@Instrumentation.java --> startActivity@ActivityManagerService.java  

所以最后都是在AMS中实现的,接下来就要分析AMS内部对startActivity做了哪些工作?

AMS最后会把startActivity这些函数转到ActivityTaskManagerService里面处理 。

/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

   int startActivityAsUser(IApplicationThread caller, String callingPackage,Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,boolean validateIncomingUser) {enforceNotIsolatedCaller("startActivityAsUser");userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");// TODO: Switch to user app stacks here.return getActivityStartController().obtainStarter(intent, "startActivityAsUser").setCaller(caller).setCallingPackage(callingPackage).setResolvedType(resolvedType).setResultTo(resultTo).setResultWho(resultWho).setRequestCode(requestCode).setStartFlags(startFlags).setProfilerInfo(profilerInfo).setActivityOptions(bOptions).setMayWait(userId).execute();}

 enforceNotIsolatedCaller("startActivityAsUser"); 检查调用者是否属于被隔离的对象。 

getActivityStartController().checkTargetUser(userId, validateIncomingUser,
                  Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");

转到了 /frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java 

代码如下:

handleIncoming检查调用者是否有权利执行这一操作。  

getActivityStartController().obtainStarter获得了 ActivityStater ,我们看一下ActivityStarter的execute代码: 

startActivityMayWait()逻辑非常多,核心逻辑大概如下:

1.  首先确定这个目标的Activity:如果是显式的Intent,Intent信息中就已经带有目标Activity相关信息 ,否则就调用resolveActivity()进行查找 。

2. 判断目标Activity所属进程是不是重量级(heavy-weight)的,如果当前系统已经存在重量级进程不是即将要启动的这个,那么就要给Intent重新赋值。 

3.权限判断,Activity调度。

4.  Activity实例化

5.Activity启动 。AMS会调用该活动的onCreate,onStart,onResume方法,从背景状态切换到前台。 

6. 结果返回 。

7.释放资源 。

四、完成同一任务的“集合”---Activity Task

4.1 后进先出 --- Last In,First out 

假设在一个Activity中,用户又启动了另一个Activity ,那么当用户按下Back键后,栈顶元素会自动被销魂 。

4.2 管理ActivityTask 

应用程序可以通过2种方法来影响Activty Task的默认行为 

方法1:在<Activity>标签中指定属性

android:taskAffinity 

android:launchMode

android:allowTaskReparenting 

android:clearTaskOnLaunch 

android:alwaysRetainTaskStae 

android:finishOnTaskLaunch 

方法2:使用Intent标志

启动一个Activity我们也可以通过Intent来动态指定所需的task的属性值。

五、Instrumentation机制

在Android 10系统中,Instrumentation是一个用于监视和控制的强大工具。它提供了一种机制,允许应用程序和系统服务对其他应用程序的行为进行监控和修改。Instrumentation在Android的内部实现中起着至关重要的作用,尤其是在系统服务和应用程序生命周期管理方面。

Instrumentation的主要功能包括:

  1. 监视应用程序行为:Instrumentation可以监视应用程序的执行和操作,包括应用程序的启动、停止、资源使用等。这有助于开发者进行性能分析、调试和错误排查。
  2. 修改应用程序行为:通过Instrumentation,可以对应用程序的行为进行修改或增强。这包括修改应用程序的内部逻辑、拦截和处理特定事件等。
  3. 安全性与权限管理:Instrumentation可以用于实现安全性检查和权限管理。它可以帮助防止恶意应用程序的行为,保护用户数据和隐私。
  4. 测试和调试:Instrumentation还可以用于开发和测试阶段,帮助开发者进行应用程序的测试和调试。

要使用Instrumentation,通常需要编写一个Instrumentation类,该类继承自android.app.Instrumentation类,并实现必要的方法。然后,将该Instrumentation类配置到AndroidManifest.xml文件中,或在代码中动态设置。需要注意的是,由于Instrumentation涉及到对应用程序和系统行为的深入监控和控制,因此在使用时需要谨慎处理权限和安全性问题。在普通应用程序开发中,通常不需要直接使用Instrumentation,但在系统级开发和测试中,它是一个非常有用的工具。

总结:

     Android 10系统的AMS通过引入活动隔离、后台启动限制、活动栈管理、系统级活动和后台服务限制等功能,提高了系统的性能、安全性和资源管理能力。这些改进使得应用程序在Android 10上更加稳定、高效,并提供了更好的用户体验。

这篇关于管理Activity和组件运行状态的系统进程--ActivityManagerService(AMS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654244

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听