Android系统中的进程管理

首先Android以Linux内核为基础,所以进程的管理都离不开Linux本身的机制。因此我们需要知道系统打开App的完整过程。

1.app_process:一个可执行程序,是启动zygote和system_server进程的程序

2.Zygote:所以应用程序的父进程,系统的重要进程

3.ActivityManager:am(缩写)是辅助Android四大组件的管理,并且还掌握了所有应用程序进程的创建和进程的优先级管理

init进程

他是一切的开始,在Android系统中,所有进程的进程号都不确定,唯独init进程的进程号一定是1。

以上就是关于framework工作的大致流程。

在四大组件中的任何一个先起来都会导致应用程序的创建。

Activity

在应用程序中,我们会通过startActivity(Intent intent)startService(Intent service)sendBroadcase(Intent intent)ContentResolver打开的ContentProvider,当然还有一些其他的重载方法。在这里提到的所有方法,最终都是通过Binder调用到ActivityManagerService中,尤其进行处理的。并且应用进程与ActivityManagerService所在进程是相互独立的,两者之间的方法通常是不能之间互相调用的。而Android系统中,专门提供了Binder框架来提供进程间通讯和方法调用的能力。



在ActivityManagerService中,对每一个运行中的Activity都有一个ActivityRecord对象与之对应,这个对象记录Activity的详细状态。

Activity的启动背景:

ActivityManagerService中通过Stack和Task来管理Activity

每一个Activity都属于一个Task,一个Task可能包含多个Activity。一个Stack包含多个Task

ActivityStackSupervisor类负责管理所有的Stack

Activity的启动过程会牵涉到:Intent的解析、Stack,Task的查询或创建、Activity进程的创建、Activitiy窗口的创建、Activity的生命周期调度


在Activity启动的最后,会将前一个Activity pause,将新启动的Activity resume以便被用户看到。


在这个时候,如果发现新启动的Activity进程还没有启动,则会通过startSpecificActivityLocked将其启动。

Service

Service的启动相对与Activity来说要简单一些。

在ActivityManagerService中,对每一个运行中的Service都有一个ServiceRecord对象与之对应,记录Service的详细状态。

Provider

在ActivityManagerService中,对每一个运行中的ContentProvider都有一个ContentProviderRecord对象与之对应,来记录其详细状态。

我们通过ContentResolver中的insert、delete、update、query的API来使用ContentProvider。在ContentResolver的实现中,无论使用这里的哪个接口,ContentResolve都会先通过acquireProvider这个方法来获取到一个类型为IContentProvider的远程接口。这个远程接口对接了ContentProvider的实现提供方。

同一个ContentProvider可能同时被多个模块使用,而调用ContentResolver接口的进程只是ContentProvider的一个客户端而已,真正的ContentProvider提供方是运行自身的进程中的,两个进程的通讯需要通过Binder的远程接口形式来调用。如图:


Receiver

广播是一种一对多的消息形式,广播接收者的数量不确定。因此发送广播本身可能是一个很耗时的过程(因为要逐个通知)。

在ActivityManagerService内部是通过队列的形式来管理广播的:BroadcaseQueue(描述了一个广播队列)、BroadcaseRecord(描述了一个广播事件)。

在ActivityManagerService中,如果收到了一个发送广播的请求,会先创建一个BroadcaseRecord接着将其放入BroadcaseQueue中。然后通知队列自己去处理这个广播。然后ActivityManagerService自己就可以继续处理其他请求了。

广播队列本身是在另一个线程处理广播的发送的,这样保证的ActivityManagerService主线程的负载不会太重。

猜你喜欢

转载自blog.csdn.net/github_34437042/article/details/54095757
今日推荐