AMS管理android四大组件

来源:互联网 发布:lt1028数据手册 编辑:程序博客网 时间:2024/06/07 04:48

ActivityManageService管理四大组件

AMS是android中SystemServer进程中的一个线程,单从名字看以为只是管理Activity ,其实AMS是管理四大组件运行状态的系统服务线程。
Screen_Shot_2016_03_25_at_8_22_03

1.SystemServer进程启动AMS

SystemServer.java中的关键源码,如下:

private void startBootstrapServices() {            // Activity manager runs the show.        mActivityManagerService = mSystemServiceManager.startService(                ActivityManagerService.Lifecycle.class).getService();        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);}

SystemServiceManager.startService(Class clazz)通过反射的技术的启动Service,关键源码如下

 public <T extends SystemService> T startService(Class<T> serviceClass) {       //...            Constructor<T> constructor = serviceClass.getConstructor(Context.class);            service = constructor.newInstance(mContext);        //...                // Register it.        mServices.add(service);        // Start it.        try {            service.onStart();        } catch (RuntimeException ex) {            throw new RuntimeException("Failed to start service " + name                    + ": onStart threw an exception", ex);        }        return service;    }

SystemServiceManager.startService入参是ActivityManagerService.Lifecycle.class,追踪源码,如下

    public static final class Lifecycle extends SystemService {        private final ActivityManagerService mService;        public Lifecycle(Context context) {            super(context);            mService = new ActivityManagerService(context);        }        @Override        public void onStart() {            mService.start();        }        public ActivityManagerService getService() {            return mService;        }    }

从源码可以知道Lifecycle封装了AMS还继承了SystemService的功能。Lifecycle构造函数创建了一个AMS对象,调用了AMS的构造函数,关键源码如下:

 public ActivityManagerService(Context systemContext) {        mContext = systemContext;        mFactoryTest = FactoryTest.getMode();        mSystemThread = ActivityThread.currentActivityThread();        //创建一个 ServiceThread,TAG        mHandlerThread = new ServiceThread(TAG,                android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);        mHandlerThread.start();        //对应的Handler        mHandler = new MainHandler(mHandlerThread.getLooper());

这里SystemServer主线程调用Thread.start真正启动AMS线程ServiceThread。

2.AMS线程采用循环机制来处理同一进程内的请求

ServiceThread是HandlerThread的子类,其run方法源码如下

public void run() {        mTid = Process.myTid();        Looper.prepare();        synchronized (this) {            mLooper = Looper.myLooper();            notifyAll();        }        Process.setThreadPriority(mPriority);        onLooperPrepared();        Looper.loop();        mTid = -1;    }

这源码可以知道,AMS线程也是采用Hander,Looper,MessageQueue的循环机制来处理客户的请求。

3.循环机制处理客户的请求类型

AMS是通过mHandler来处理客户请求,查看其源码

final class MainHandler extends Handler {        public MainHandler(Looper looper) {            super(looper, null, true);        }        @Override        public void handleMessage(Message msg) {            switch (msg.what) {            case SHOW_ERROR_MSG: {            case SHOW_NOT_RESPONDING_MSG: {            case SHOW_STRICT_MODE_VIOLATION_MSG: {            case SHOW_FACTORY_ERROR_MSG: {            case WAIT_FOR_DEBUGGER_MSG: {            case SERVICE_TIMEOUT_MSG: {            case UPDATE_TIME_ZONE: {            case CLEAR_DNS_CACHE_MSG: {            case UPDATE_HTTP_PROXY_MSG: {            case SHOW_UID_ERROR_MSG: {            case IM_FEELING_LUCKY_MSG: {            case DO_PENDING_ACTIVITY_LAUNCHES_MSG: {            case FINALIZE_PENDING_INTENT_MSG: {            case CANCEL_HEAVY_NOTIFICATION_MSG: {            case CHECK_EXCESSIVE_WAKE_LOCKS_MSG: {            case SHOW_COMPAT_MODE_DIALOG_MSG: {            case DISPATCH_PROCESSES_CHANGED: {            case DISPATCH_PROCESS_DIED: {            case START_USER_SWITCH_MSG: {            case REPORT_USER_SWITCH_MSG: {            case CONTINUE_USER_SWITCH_MSG: {            case USER_SWITCH_TIMEOUT_MSG: {            case IMMERSIVE_MODE_LOCK_MSG: {            case PERSIST_URI_GRANTS_MSG: {            case REQUEST_ALL_PSS_MSG: {            case START_PROFILES_MSG: {            case UPDATE_TIME: {            case SYSTEM_USER_START_MSG: {            case SYSTEM_USER_CURRENT_MSG: {            case ENTER_ANIMATION_COMPLETE_MSG: {            case FINISH_BOOTING_MSG: {            case SEND_LOCALE_TO_MOUNT_DAEMON_MSG: {        }

4.AMS向ServiceManager登记Binder

ActivityManagerService向ServiceManager登记多种Binder Server。包括“actvity”、“meminfo”、“gfxinfo”、“dbinfo”。其中最主要的是“actvity” Binder Server,

 // Set up the Application instance for the system process and get started.        mActivityManagerService.setSystemProcess();  public void setSystemProcess() {        try {            ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);            ServiceManager.addService("meminfo", new MemBinder(this));            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));            ServiceManager.addService("dbinfo", new DbBinder(this));            if (MONITOR_CPU_USAGE) {                ServiceManager.addService("cpuinfo", new CpuBinder(this));            }            ServiceManager.addService("permission", new PermissionController(this));

这是一种实名的Binder Server,其他进程可以向ServiceManager查询该Binder的引用,进而跟AMS通信,例如启动activity、service等。

5.四大组件都是由AMS管理的

AMS的职责不仅仅是Activity,还包括Service、BroadCast Receiver、ContentProvider。
应用程序通过Binder机制与AMS通信,进而由AMS管理四大组件,包括启动、停止等。

public final class ActivityManagerService extends ActivityManagerNative        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {        //...        public int startActivity(...)  {...}        public final void activityStopped(...) {...}        public ComponentName startService(...){...}        public Intent registerReceiver(...) {...}        public final ContentProviderHolder getContentProvider(...}        //...}

6.ActivityRecord对应一个Activity

系统中每一个Activity都需要在AMS中做记录,对应一个ActivityRecord,ActivityRecord记录着对应activity的信息,其源码如下

/** * An entry in the history stack, representing an activity. */final class ActivityRecord {    final ActivityManagerService service; // owner    final IApplicationToken.Stub appToken; // window manager token    final ActivityInfo info; // all about me    final ApplicationInfo appInfo; // information about activity's app    final int launchedFromUid; // always the uid who started the activity.    final String launchedFromPackage; // always the package who started the activity.    final int userId;          // Which user is this running for?    final Intent intent;    // the original intent that generated us    final ComponentName realActivity;  // the intent component, or target of an alias.    final String shortComponentName; // the short component name of the intent    final String resolvedType; // as per original caller;    final String packageName; // the package implementing intent's component    final String processName; // process where this component wants to run    final String taskAffinity; // as per ActivityInfo.taskAffinity

7.ActivityStack管理当前系统所有Activity和状态

主要的几个变量,mTaskHistory记录着历史的activity,mLRUActivities记录的activity是根据LRU排序的,mPausingActivity切换activity时,正在暂停的activity。其源码如下

    //...   private ArrayList<TaskRecord> mTaskHistory = new ArrayList<TaskRecord>();   final ArrayList<TaskGroup> mValidateAppTokens = new ArrayList<TaskGroup>();   final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>();   ActivityRecord mPausingActivity = null;   ActivityRecord mLastPausedActivity = null;   ActivityRecord mLastNoHistoryActivity = null;   ActivityRecord mResumedActivity = null;   ActivityRecord mLastStartedActivity = null;   //...

8.ActiveServices管理当前系统所有Service和状态

ActiveServices有一些常量规定Services执行的超时时间,一些list用记录各种状态的Service。
其部分源码如下

public final class ActiveServices {    //...    // How long we wait for a service to finish executing.    static final int SERVICE_TIMEOUT = 20*1000;    // How long we wait for a service to finish executing.    static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10;    //...    final SparseArray<ServiceMap> mServiceMap = new SparseArray<ServiceMap>();    /**     * All currently bound service connections.  Keys are the IBinder of     * the client's IServiceConnection.     */    final ArrayMap<IBinder, ArrayList<ConnectionRecord>> mServiceConnections            = new ArrayMap<IBinder, ArrayList<ConnectionRecord>>();    /**     * List of services that we have been asked to start,     * but haven't yet been able to.  It is used to hold start requests     * while waiting for their corresponding application thread to get     * going.     */    final ArrayList<ServiceRecord> mPendingServices            = new ArrayList<ServiceRecord>();    /**     * List of services that are scheduled to restart following a crash.     */    final ArrayList<ServiceRecord> mRestartingServices            = new ArrayList<ServiceRecord>();    /**     * List of services that are in the process of being destroyed.     */    final ArrayList<ServiceRecord> mDestroyingServices            = new ArrayList<ServiceRecord>();    static final class DelayingProcess extends ArrayList<ServiceRecord> {        long timeoout;    }

9.管理当前系统所有BroadCastReceiver和状态

AMS中保存着系统BroadCastReceiver,管理着广播接收器的调度和运行的超时时间等,其关键源码如下

    // How long we allow a receiver to run before giving up on it.    static final int BROADCAST_FG_TIMEOUT = 10*1000;    static final int BROADCAST_BG_TIMEOUT = 60*1000;    /**     * Keeps track of all IIntentReceivers that have been registered for     * broadcasts.  Hash keys are the receiver IBinder, hash value is     * a ReceiverList.     */    final HashMap<IBinder, ReceiverList> mRegisteredReceivers =            new HashMap<IBinder, ReceiverList>();    BroadcastQueue mFgBroadcastQueue;    BroadcastQueue mBgBroadcastQueue;    // Convenient for easy iteration over the queues. Foreground is first    // so that dispatch of foreground broadcasts gets precedence.    final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[2];
0 0