首页 > 其他分享 >Android 11.0 Framework AMS服务

Android 11.0 Framework AMS服务

时间:2024-02-26 15:12:35浏览次数:27  
标签:Service 11.0 Framework 前台 Activity 进程 Android ADJ AMS

Android 11.0 Framework

ActivityManagerService.java == AMS 服务 它是Android系统的核心,
它管理了系统的四大组件:Activity、Service、ContentProvider、Broadcast。
它除了管理四大组件外,同时也负责管理和调度所有的进程。
参考链接AMS

AMS 进程部分知识1

进程在AMS中由一个ProcessRecord来表示,该对象记录了一个进程的所有信息.

//启动Activity的时候,如果当前Activity的宿主进程尚未创建,则需要先创建对应的进程
ActivityStackSupervisor::startSpecificActivity()

//realStartActivityLocked,正如方法名字面上的意义,该方法是真正开启Activity的地方
ActivityStackSupervisor::realStartActivityLocked()

//启动一个Service组件的时候,Service组件的宿主进程尚未创建,需要先创建对应的进程
ActiveServices::startServiceInnerLocked() --> ActiveServices::bringUpServiceLocked()

//停止某个服务进程
ActiveServices::stopServiceLocked(ServiceRecord service)
{
    // not kill a service (ServiceRecord.java -->final ComponentName name; (// service component.))
    if(service.name.getPackageName().equals("com.xxx.vito")){
            return;
        }
}

AMS 进程部分知识2

AMS自己会根据一些逻辑来杀死部分进程, App也会主动调用ActivityManager的接口来杀死指定进程,
当进程侥幸逃脱AMS或者应用的屠刀后,就会被保存到内存中。
此时这些进程就会交由LowMemoryKiller来监控了,这些进程的生死就转移到了LMK的手上.
Android 进程分为6个等级,每个等级对应不同的内存阀值。
当lmkd监控的系统内存小于某一个阀值的时候,就会开始查杀小于或等于对应优先级的进程,当释放的内存达到最大阀值之后就停止查杀!

前台进程 FOREGROUND_APP_ADJ (0)
可感知进程 PERCEPTIBLE_APP_ADJ (200) 

//仅启动支持加密的持久应用程序 == 添加开机启动的app
systemReady() ---> startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE)--->ProcessRecord addAppLocked(...)
{

if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
            app.setPersistent(true);
            app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ;
        }
        
 //添加开机启动的前台app       
if((info.packageName).contains("com.xxx.vito")){
            app.setPersistent(false);
            app.maxAdj = ProcessList.FOREGROUND_APP_ADJ;
        }

}

Android进程的优先级 值越小优先级越高,小于0的优先级的进程基本上不会被杀死的,这些都是系统的重要进程!

NATIVE_ADJ(-1000):是由init进程fork出来的Native进程,并不受system管控;

SYSTEM_ADJ(-900):是指system_server进程;

PERSISTENT_PROC_ADJ(-800): 是指在AndroidManifest.xml中申明android:persistent=”true”的系统(即带有FLAG_SYSTEM标记)进程,persistent进程一般情况并不会被杀,即便被杀或者发生Crash系统会立即重新拉起该进程。

PERSISTENT_SERVICE_ADJ(-700):是由startIsolatedProcess()方式启动的进程,或者是由system_server或者persistent进程所绑定(并且带有BIND_ABOVE_CLIENT或者BIND_IMPORTANT)的服务进程

前台进程 FOREGROUND_APP_ADJ (0)
前台进程是指存在有组件正和用户进行交互的app的进程,也称为Active进程)。
比如你打开某个app时,它的界面显示在前台,用户可以跟它进行交互,它就是前台进程。
和用户交互的进程,不到万不得已不能杀死。
如果一个进程满足以下任一条件,即视为前台进程:
(1)托管处于活动状态的Activity,也就是说,它们位于前台并对用户事件进行响应,此时的情形为响应了Activity中的onResume()生命周期方法,但没有响应onPause()。
(2)托管正在执行onReceive()方法处理事件程序的BroadcastReceiver。
(3)托管正在执行onStart()、onCreate()或onDestroy()事件处理程序的Service。
(4)托管正在运行且被标记为在前台运行的Service,即调用了该Service的startForeground()方法。
(5)托管某个Service,且该Service正绑定在用户正在交互的Activity的Service,即该Activity正处于活动状态。

可见进程 VISIBLE_APP_ADJ (100)
如果一个进程满足以下任一条件,即视为可见进程:
(1)托管不在前台、但仍对用户可见的Activity(已调用其onPause()方法)。
例如:如果前台Acitivty启动了一个对话框,或者启动了一个非全屏,亦或是一个透明的Activity,允许在其后显示上一个Activity,则可能会发生这种情况,这类Activity不在前台运行,也不能对用户事件作出反应。
(2)托管绑定到可见Activity的Service
可见进程被视为是极其重要的进程,这类进程的数量也很少,只有在资源极度匮乏的环境下,为保证前台进程继续执行时才会终止。

可感知进程 PERCEPTIBLE_APP_ADJ (200)
如后台播放音乐,视频的进程

备份进程 BACKUP_APP_ADJ (300)
处于备份过程中的进程

CACHED_APP_MIN (900)
缓存进程ADJ最小值

CACHED_APP_MAX (906)
缓存进程ADJ最大值

ActivityTaskManagerService.java
//Launcher  activity 启动流程-->
ActivityTaskManagerService :: startActivity(...) -->startActivityAsUser(...)-->ActivityStarter::execute()

//真正的开启Activity
ActivityStack::resumeTopActivityUncheckedLocked(...) --->ActivityStackSupervisor::startSpecificActivity()
AMS 常用函数范例
private String getTopActivityPackageName() {
        ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);
        if (rti.size() <= 0) return "";
        Log.d("tww", "getTopActivityPackageName: " + rti.get(0).topActivity.getPackageName());
        return rti.get(0).topActivity.getPackageName();
    }


private void PopBgAppFromStack(String packagename) {
        ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> rti = mActivityManager.getRunningTasks(20);
        int rtiSize = rti.size();
        int i = 0;
        for (i = 0; i < rtiSize; i++) {
            if (rti.get(i).baseActivity.getPackageName().contains(packagename)) {
                mActivityManager.moveTaskToFront(rti.get(i).id, 0, null);
                break;
            }
        }
    }

标签:Service,11.0,Framework,前台,Activity,进程,Android,ADJ,AMS
From: https://www.cnblogs.com/kato-T/p/17310380.html

相关文章

  • Android 多渠道配置
    Android多包名,icon本篇文章主要记录下android下的同一工程,打包时配置不同的包名,icon,名称等信息.1:多包名首先讲述下如何配置多包名.在build.gralde的android标签下添加:productFlavors{xiaomi{applicationId"com.test.usagetest"}......
  • NanoFramework操作ESP32(一)_基础元器件篇(十七)_ KY-019继电器(1路5V继电器)
    一、元器件介绍 1、针脚介绍针脚(左到右)介绍S控制针脚+电源+-电源-二、示例代码元器件的针脚ESP32模块的针脚SIO16+3.3V-GND1、代码 publicstaticvoidMain(){#region激光头KY008HelperkY008=newKY008H......
  • NanoFramework操作ESP32(一)_基础元器件篇(三十五)_ KY-040解码器
    一、元器件介绍    旋转编码器(增量式编码器)可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。旋转编码器目前被广泛的应用在数控机床、印刷设备、包装机械......
  • opencv android studio build.gradle修改为build.gradle.kts 文件示例
    注意将openCVersionName,openCVersionCode,compileSdk,minSdk进行相应的修改即可.plugins{id("com.android.library")id("org.jetbrains.kotlin.android")}valopenCVersionName="4.9.0"valopenCVersionCode=((4*100+9)*1......
  • Android Studio 引入 OpenCV 之后 出现 Plugin was not found in any of the followin
    网上看了各种方法,什么设置代理啊,清缓存啊,重启啊之类的都试过了,都不行,后来看到帖子说OpenCV的包用的是Groovy的,即build.gradle文件而不是Kotlin的build.gradle.kts文件,然后我改了还是会报错后来我发现我遗漏了一个重点!!!要将项目根目录下的setting.gradl......
  • 52pj2024春节红包题-Android
    初级一小猫游戏,改一下判断将t.LOSE的值改为win,然后将casei.LOSE的代码段删掉,重新签名安装即可游戏结束会播放原神启动,播完会输出flag结果为flag{happy_new_year_2024}初级二flag是跟着签名走的,所以没法重新编译看代码可以看到是出金启动FlagActivity所以直接上obj......
  • NanoFramework操作ESP32(一)_基础元器件篇(四十三)_ KY-010光遮断传感器
    一、元器件介绍1、针脚用途编号名称功能1GND电源地2+5V电源正3S信号脚;倾斜时输出低电平二、示例代码1、代码:元器件的针脚ESP32模块的针脚GND;供电脚-GND+5V;供电脚++5VS;信号脚IO16  #regionKY-010光遮断传感器......
  • NanoFramework操作ESP32(一)_基础元器件篇(四十二)_ KYY-031敲击传感器
    一、元器件介绍  本开关在静止时为开路(OFF)状态,当受到外力碰触而达到适当震动力时,或移动速度达到适当离(偏)心力时,导电接脚会发生瞬间导通(ON)状态,使电气特性改变,而当外力消失时电气特性恢复开路(0FF)状态。可使用数字信号接收。1、针脚用途编号名称功能1GND电......
  • 清除缓存解决viewBinding不生效没提示,+ 新手,android stdio,kotlin,viewBinding笔记,2024
    我的问题是缓存导致的,文件->清除缓存->清楚并重启头一次用,我也不知道为什么是缓存问题。官方文档链接:https://developer.android.com/topic/libraries/view-binding?hl=zh-cn官方博客链接:https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c......
  • SharePoint Online Framework Extension 简介
    前言可以使用SharePoint框架(SPFx)扩展来扩展SharePoint用户体验。使用SPFx扩展,可以自定义SharePoint体验的更多方面,包括通知区域、工具栏、列表数据视图和表单。SPFx扩展在生产使用的所有Microsoft365订阅中可用。SPFx扩展使你能够在新式页面和文档......