AMS管理android四大组件
来源:互联网 发布:lt1028数据手册 编辑:程序博客网 时间:2024/06/07 04:48
ActivityManageService管理四大组件
AMS是android中SystemServer进程中的一个线程,单从名字看以为只是管理Activity ,其实AMS是管理四大组件运行状态的系统服务线程。
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];
- AMS管理android四大组件
- Android ActivityManagerService(AMS)的进程管理
- Android ActivityManagerService(AMS)的Activity管理
- Android ActivityManagerService(AMS)的进程管理
- Android ActivityManagerService(AMS)的Activity管理
- Android应用程序四大组件
- Android应用程序四大组件
- Android应用程序四大组件
- android 四大组件
- Android应用程序四大组件
- android应用程序四大组件
- Android四大组件
- Android应用程序四大组件
- Android四大组件
- Android四大组件
- android之四大组件
- Android四大组件介绍
- android四大组件
- hostname -i 无法识别hostname的解决的方法
- 图片: blueimp-Bootstrap-Image-Gallery-3.1.1-0-gbee85fa
- Android SystemProperties设置/取得系统属性的用法总结
- Android 退出应用程序问题
- FMDatabaseQueue 数据库多线程操作、事务处理
- AMS管理android四大组件
- 笔试题_红包问题
- VC ClistCtrl不同行背景色
- ViewPage,TabHost与Fragment(上)
- php为图片填加水印
- 新闻轮播banner轮播解析
- 【hihocoder】hiho密码
- 方阵的生成、显示、检查
- Sqoop