Android Activity 启动拦截器(ActivityStartInterceptor)创建流程, 以及使用

news/2024/11/8 12:15:36/

代码基于 Android 11

ActivityTaskManagerService # initialize

    public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,Looper looper) {mActivityStartController = new ActivityStartController(this);}

ActivityStartController

创建 DefaultFactory 工厂类

    ActivityStartController(ActivityTaskManagerService service) {this(service, service.mStackSupervisor,new DefaultFactory(service, service.mStackSupervisor,new ActivityStartInterceptor(service, service.mStackSupervisor)));}@VisibleForTestingActivityStartController(ActivityTaskManagerService service, ActivityStackSupervisor supervisor,Factory factory) {mService = service;mSupervisor = supervisor;mHandler = new StartHandler(mService.mH.getLooper());mFactory = factory;mFactory.setController(this);mPendingRemoteAnimationRegistry = new PendingRemoteAnimationRegistry(service.mGlobalLock,service.mH);}

DefaultFactory 创建

DefaultFactory 用来生产 ActivityStarter
传递 ActivityStartInterceptor 拦截器给DefaultFactory

    DefaultFactory(ActivityTaskManagerService service,ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {mService = service;mSupervisor = supervisor;mInterceptor = interceptor;}

创建ActivityStarter

传递 ActivityStartInterceptor 拦截器给ActivityStarter

    public ActivityStarter obtain() {ActivityStarter starter = mStarterPool.acquire();if (starter == null) {starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);}return starter;}

构造 ActivityStarter

ActivityStarter 获取拦截器:ActivityStartInterceptor

    ActivityStarter(ActivityStartController controller, ActivityTaskManagerService service,ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {mController = controller;mService = service;mRootWindowContainer = service.mRootWindowContainer;mSupervisor = supervisor;mInterceptor = interceptor;reset(true);}

ActivityStartInterceptor 拦截器的使用

int executeRequest(Request request) {mInterceptor.setStates(userId, realCallingPid, realCallingUid, startFlags, callingPackage,callingFeatureId);if (mInterceptor.intercept(intent, rInfo, aInfo, resolvedType, inTask, callingPid,callingUid, checkedOptions)) {// activity start was intercepted, e.g. because the target user is currently in quiet// mode (turn off work) or the target application is suspendedintent = mInterceptor.mIntent;rInfo = mInterceptor.mRInfo;aInfo = mInterceptor.mAInfo;resolvedType = mInterceptor.mResolvedType;inTask = mInterceptor.mInTask;callingPid = mInterceptor.mCallingPid;callingUid = mInterceptor.mCallingUid;checkedOptions = mInterceptor.mActivityOptions;// The interception target shouldn't get any permission grants// intended for the original destinationintentGrants = null;}
}

http://www.ppmy.cn/news/291328.html

相关文章

如何规划和执行安全测试

如何规划和执行安全测试 在现代软件开发中,安全测试已经成为一个必不可少的环节。在完成软件开发后,需要对应用程序进行安全测试,以确保其可以在生产环境中正常运行并能够抵御各种安全攻击和漏洞。 如何规划和执行安全测试是一个重要的问题&a…

苹果电脑关于命令行的操作

指定文件和文件夹 单个句点表示当前文件夹。两个句点表示当前文件夹的父文件夹。波浪线表示已登录用户的个人文件夹。 纠正键入错误 清除行,control u。清除光标后的文字,control K。清除屏幕command K。option鼠标或触控板点击快速重新定位光标。清…

Win电脑敬业签团队便签怎么修改记事本文字颜色?

一、打开win电脑版敬业签并登录,点击界面左侧的团签名称,或者点击主页面左上角的团签按钮,打开团签列表选择团签点击其右侧的内容,可进入相应团签内容列表; 二、在团签内容列表中选择一条要修改记事本文字颜色的便签内…

计算机的桌面窗户是什么情况,电脑桌面悬浮窗记事本软件怎么添加?适合桌面显示的便签软件...

在选择电脑记事本软件时,很多人都喜欢使用支持悬浮在电脑桌面显示的软件,在悬浮窗口中可以展示自己记录的备忘事项,这样不仅可以方便自己随时查看到待办任务,还能起到实时提醒自己的作用,那么电脑桌面悬浮窗记事本怎么…

mac电脑打不开html文件怎么处理,苹果电脑Mac打不开网页怎么办?Mac打不开网页的解决方法...

刚刚入手Mac的机油们可能会遇到一个非常让人恼火的问题,就是网页时不时的能打开,但是有时候打开速度很慢,甚至有时候根本打不开网页,不管更换什么浏览器都没用,导致这种情况大部分原因是OS X默认的DNS解析服务器是谷歌…

怎么使用电脑记事本便签来办公?

说起记事本便签软件,每个人都有着各种各样的要求,因为工作性质的不同、职位的不同,导致对使用的便签功能也都是不一样的。因为大部分人工作时是使用电脑的,他们对可以在电脑上使用比可以在手机上使用的需求更强烈,而且…

记事本带计算机手机版,有什么手机和电脑能同步的便签记事本

原标题:有什么手机和电脑能同步的便签记事本 Windows电脑上不乏一些用来记事的软件,但很多也仅仅是可以在电脑上用的记事软件,如果需要电脑和手机可以同步记事内容的记事本软件,可以在设备上免费安装敬业签云便签使用。 敬业签是一…

服务器记事本找回文本,如何还原记事本中已删除的内容

原标题:如何还原记事本中已删除的内容 记事本是很多人在使用的生活和工作辅助工具,手机和电脑上都可以使用。电脑上有自带的记事本功能;手机上即便没有记事本,也有便签或者备忘录等类似可以记事的小工具。不过,无论电脑…