哪里有AMS-STD-2175标准,如何得到呀

哪里有AMS-STD-2175标准,如何得到呀,第1张

AMS-STD-2175 铸件,分类和检查的范围ndti ;应该用来代替美军标MIL - STD - 2175a ,这是取消了对1999年11月10 可与北京中普科标图书网+国际标准服务网+标准翻译中心联系。

外界无法直接访问ContentProvider,只能通过AMS根据URI来获取对应的ContentProvider的Binder接口IContentProvider,然后再访问响应数据。

contentProvider可以做成多实例,通过属性控制,但是现实中很少采用因为浪费开销。外界访问其增删改查的任何一个方法都会导致contentProvider的创建,并且拉起进程

比如通过query方法启动contentprovider:

1、通过acquireProvider来获取IContentProvider对象。

2、先检查本端ActivityThread中是否存在ContentProvider了,如果存在就直接返回(返回的是IContentProvider客户端接口对象)。如果没有,就通过远程AMSgetContentProvider方法

3、ContentProvider的启动伴随着进程的启动,启动进程靠的是AMS的startProcessLocked,新进程启动后其入口方法为ActivityThreadmain()方法,然后在attach方法中通过attachApplication方法将ApplicationThread作为参数传递给AMS

4、AMS的方法中又调用了ApplicationThreadbindApplication

5、ActivityThread的bindApplication发送BIND_APPLICATION消息给mH使得ActivityThread完成一系列工作,包括(按步骤顺序):

上述四个步骤之后,外部就能在AMS中拿到ContentProvider访问其接口了,但拿到的其实是Binder类型对象IContentProvider。其具体实现是ContentProviderTransport,所以外界调用query方法时候,是通过调用ContentProviderTransport中的query方法,其远程调用ContentProviderquery方法,结果通过Binder返回给调用者。

对其他方法的调用类似。

PendingIntent

PendingIntent 将会发生的意图

主要有四种Activity、BroadcastReceiver、Service

Activity(BroadcastReceiver、Service类似只是在type不同)

PendingIntentRecord是IIntentSender的服务端

内部类Key(重写了equals,hashCode)保存从IIntentSender客户端传来的参数数据

在PendingIntent的getActivity(或Service,BroadcastReceiver),把参数封装在AMS中的mIntentSenderRecords属性中。

PendingIntent主要结合NotificationManager进行使用的。

分析一波NotificationManager

app端主要 使用的是NotificationManager(其他的管理器获取使用类似)

主要通过ContextImpljava

SystemServiceRegistry动态注册许多App端使用的各种Manager(ActivityManager,AlarmManager,NotificationManager)

在获取到NotificationManager,就已经实例化了。

Notification保存要执行的参数属性(pojo)

直接实例化或通过建造者模式实例化

参数

通过Notification封装了PendingIntent

NotificationManager通过notify把Notification发送到状态栏中

在NotificationManagerService的类中

联系点1

关注

NotificationListeners类是ManagedServices的子类

关注

ManagedServiceInfo类(pojo)存储信息,并使用service(IInterface )进行回调

关注属性

介绍完上面,接下来介绍如何启动状态栏PhoneStatusBar,BaeStatusBar,会 *** 作Nitiofication

首先从SystemServer#startOtherServices

然后通过AMS的

拉起SystemUIService把SytemUI的app启动

SystemUIApplicationjava

通过各个子类实现start()方法,执行各个子类定制的属性和逻辑关系

关注子类SystemBars类

SystemBarsjava且实现了ServiceMonitorCallbacks

在BaseStatusBar#start()

关注

//与上面分析的 联系点1 进行关联

// 当回调INotificationListener的方法,就会在这里具体执行

//间接调用NotificationListenerService的方法,子类在BaseStatusBar的内部NotificationListenerService重写

//又间接调用BaseStatusBar自己的方法,由子类再次PhoneStatusBar重写实现

关于Click事件监听

主要通过上面流程,把Notification拿出来,封装在View中,设置 点击相应PendingIntent

大功告成

PhoneStatusBarjava

前面跟着书本整理过 AMS 相关的源码 Android 进阶解密阅读笔记7 ,不过那时对 AIDL 的使用还不理解,后面我就去看了 Binder 机制还有 AIDL 相关的内容,现在在回过头来看看 AMS 具体怎么使用的。

这里我看的是 API 29 的源码,虽然不再是 ActivityManagerService 负责,但主体逻辑还是不变,只不过现在分工更加细致明确而已。原本是分析 AMS 的,这里就拿 ActivityTaskManagerService 来分析吧。

相对于 ActivityManager,同样衍生出一个 ActivityTaskManager,并提供了 getService 方法用于获取 IActivityTaskManager。IActivityTaskManager 一看就是个接口,从源码上看,它是个 aidl 文件。那这么一来,它会生成相对应的 IActivityTaskManagerjava 文件,并在内部还有 Stub,Proxy 这样的内部类。

所以在上面的 create 方法中,首先通过 ServiceManager 获取到 activity_task 服务,返回的 IBinder 类型 b 其实就是在系统服务进程中的 ATMS 服务的 Binder 实体,再通过 IActivityTaskManagerStub 进行了转化成接口引用,这样应用进程就能用了。

不过使用 AIDL 是需要我们做两个工作的,1定义接口上面已经提到,就是 IActivityTaskManager。2实例化静态内部类 Stub。其实 ActivityTaskManagerService 继承了 IActivityTaskManagerStub 也就是为了实现接口定义的方法,所以实例化对象就是系统服务进程启动时创建的。

所以 ATMS 家族包括 IActivityTaskManager 接口,IActivityTaskManagerStub 及其子类 ActivityTaskManagerService,还有我们表面上看不到的 IActivityTaskManagerProxy。这样就得出了和书中一样的结论了。

虽然启动 Activity 不再交给 AMS 了,但 AMS 在其他功能还是有用的,并且其实现及使用过程和 ATMS 几乎没有区别,我理解的 ATMS 其实像是 AMS 分出来的一部分,专门提供 Activity 相关的服务吧。

如果是自发AMS的话,需要分别发给美国海关及船公司。如果由船公司代发AMS的话,只要把信息发给船公司就行了。

船公司也要发送AMS信息给美国海关,包括了提单上的收发货人,品名,毛件体,唛头,箱封号等,这边很多的信息就需要由货代公司提供的。

1概要

startActivity启动一个activity的源码分析,涉及概念较多,比如binder,aidl跨进程通信(ipc),栈管理概念;启动的时序图如下图(来自其他blog)所示:

接下来基于sdk 23 源码里面看看,每个流程分别做了什么。主要分为 APP进程部分 、 Server进程部分 ;

2APP进程(上)

21 Context,ApplicationThread(在ActivityThread里面),Instrumentation

首先启动一个页面,比如activity里面通过contextstartActivity,会调用到startActivityForResult方法,接着会调用Instrumentation的execStartActivity方法,里面有几个入参需要注意的,第一个context自身,一个是ApplicationThread(它是一个binder本地对象,或者说是server对象,它是抽象类ApplicationThreadNative的实现类,具体能力的承载类,为后续AMS持有它的proxy进行启动activity使用),还有一个参数intent(传递参数);

22 ActivityManagerNative,ActivityManagerService(AMS),ActivityManagerProxy(asInterface,它入参就是从sm那里拿来的binder代理对象),ServiceManager,

ServiceManager只是一个装饰类,最终调用的方法是binder内核驱动的方法,是通过BinderInterner里获取的binder对象,如:addService,registerService等方法。它对应的也有serviceManagerNative等,所有的binder服务(AMS/PMS/)等都是从这边获取到对应client对象。

通过ActivityManagerProxystartActivity,他的里面调用transact,接着通过binder IPC进入AMS;到此为止都是在 APP进程中

3Server进程

-------------------- Server进程部分 -------------------

该部分主要是做一些启动前的校验,创建和管理Activity stack ,创建进程,绑定ApplicationThreadProxy

31 AMNonTransact

接下来我们就在, AMN是个抽象类,是个System server进程里面的本地服务,onTransact方法被调用,里面是真正的StartActivity方法的实现是在AMS中。

32 AMSonTransact

在里面会调用startActivityAsUser,在SDK 23中是进入ActivityStackSupervisor,24中进入ActivityStarter的startActivityMayWait。

ActivityStackSupervisor 为了多屏而出现,管理多个ActivityStack

33 ASSstartActivityMayWait

这个方法的作用主要是获取ActivityInfo信息(如果有多个activity会d框让用户选择),里面会经过PMS获取ActivityInfo信息,并保存在intent对象中,接着进入startActivityLocked,它的返回值里,如果大于等于0标识启动成功,小于零标识启动失败。

34 ASSstartActivityLocked

该方法会进行一系列的常规检查,比如activity是否在AndroidManifest注册,是否存在这个activity等等,常规检查通过之后,会进行权限的检查;如果在都成功的情况下,进行ActivityRecrd(一个Activity可以对应多个ActivityRecord)的创建;并校验App切换是否允许,如果不允许则要启动的Activity添加到pending中,并直接返回,相当于检查下是否又被阻塞的activity,优先启动。

35 ASSstartActivityUncheckedLocked (栈管理相关的 *** 作)

这个阶段就不需要做些权限的检查;这个函数的主要作用就是找到或者创建新的Activity所属于的task对象,之后调用ActivityStack的startActivityLocked。其中会根据我的ActivityRecord的属性,从标签中获取,进行Standard、singleTop、singleTask、singleInstance相关要求的处理。比如是否需要新建栈,或者 已有 栈中是否存在此Activity,如果应用之前 没有 起来过,那找不到task如何处理等等。

如果不存在该Activity,则需要创建进入

ActivityStack (栈的管理,activity是否显示等等)

36 ASstartActivityLocked

入参里面,ActivityRecord,是否需要立马显示,是否需要创建新的task等等。

如果新启动一个app,表示宿主栈ActivityStack中没有历史任务,或者强制要求在新的任务中启动Activity, 既然是一个新任务,那么就需要需要将任务插入宿主栈顶。放入并放在栈顶之后,将Activity推入显示状态。

37 ASresumeTopActivityLocked-> resumeTopActivityInnerLocked

找到第一个没有finishing的栈顶activity,找不到直接回到桌面,找到了,就执行startPausingLocked暂停activity,接着进入startSpecificActivityLocked

38 ASresumeTopActivityInnerLocked

尝试将ActivityRecord迁移到显示状态(Resumed),如果发现待显示的Activity的宿主进程可能没有启动,则需要回到ASSstartSpecificActivityLocked。

ActivityStackSupervisor

39 ASS startSpecificActivityLocked

如果通过包名,发现才宿主进程不存在,则启动一个新的应用进程。这时候会调用AMSnewProcessRecord来创建一个新的ProcessRecord,然后再调用另外一个重载的AMSstartProcessLocked()函数,来创建一个进程。进入AMSstartProccesslocked。 如果已经存在则直接进入realStartActivityLocked方法,进行启动activity。

ActivityManagerService

310 AMSstartProccesslocked (参考: >

以上就是关于哪里有AMS-STD-2175标准,如何得到呀全部的内容,包括:哪里有AMS-STD-2175标准,如何得到呀、ContentProvider原理、PendingIntent产生以及响应等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9318386.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存