Android Activity.startActivity流程简介

1. 基本概念1.1Instrumentation是什么?

顾名思义,仪器仪表,用于在应用程序中进行“测量”和“管理”工作。一个应用程序中只有一个Instrumentation实例对象,且每个Activity都有此对象的引用。Instrumentation将在任何应用程序运行前初始化,可以通过它监测系统与应用程序之间的所有交互,即类似于在系统与应用程序之间安装了个“窃听器”。

当ActivityThread 创建(callActivityOnCreate)、暂停、恢复某个Activity时,通过调用此对象的方法来实现,如:

1)创建:callActivityOnCreate

2)暂停:callActivityOnPause

3)恢复:callActivityOnResume

Instrumentation和ActivityThread的关系,类似于老板与经理的关系,老板负责对外交流(如与Activity Manager Service<AMS>),Instrumentation负责管理并完成老板交待的任务。

它通过以下两个成员变量来对当前应用进程中的Activity进行管理:

private List<ActivityWaiter> mWaitingActivities;private List<ActivityMonitor> mActivityMonitors;

其功能函数下表所示:

功能函数

增加删除MonitoraddMonitor(ActivityMonitor monitor)removeMonitor(ActivityMonitor monitor)

Application与Activity生命周期控制newApplication(Class<?> clazz, Context context)newActivity(ClassLoader cl, String className,Intent intent)callActivityOnCreate(Activity activity, Bundle icicle)callActivityOnDestroy(Activity activity)callActivityOnStart(Activity activity)callActivityOnRestart(Activity activity)callActivityOnResume(Activity activity)callActivityOnStop(Activity activity)callActivityOnPause(Activity activity)

Instrumentation生命周期控制onCreate(Bundle arguments)start()onStart()finish(int resultCode, Bundle results)onDestroy()

发送用户操控信息到当前窗口sendCharacterSync(int keyCode)sendPointerSync(MotionEvent event)sendTrackballEventSync(MotionEvent event)sendTrackballEventSync(MotionEvent event)

同步操作startActivitySync(Intent intent) //它调用Context.startActivityrunOnMainSync(Runnable runner)waitForIdle()

2.Android应用程序启动过程(MainActivity)

即MainActivity的启动过程,在此过程中,将创建一个新的进程来执行此MainActivity。

Android应用程序从Launcher启动流程如下所示:

/***************************************************************** * Launcher通过Binder告诉ActivityManagerService, * 它将要启动一个新的Activity; ****************************************************************/Launcher.startActivitySafely-> Launcher.startActivity-> //要求在新的Task中启动此Activity //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) Activity.startActivity-> Activity.startActivityForResult-> Instrumentation.execStartActivity->// ActivityManagerNative.getDefault()返回AMS Proxy接口ActivityManagerNative.getDefault().startActivity->ActivityManagerProxy.startActivity->ActivityManagerService.startActivity-> (AMS)ActivityManagerService.startActivityAsUser->ActivityStack.startActivityMayWait->ActivityStack.resolveActivity(获取ActivityInfo)//aInfo.name为main Activity,如:com.my.test.MainActivity//aInfo.applicationInfo.packageName为包名,如com.my.testActivityStack.startActivityLocked->//ProcessRecord callerApp; 调用者即Launcher信息//ActivityRecord sourceRecord; Launcher Activity相关信息//ActivityRecord r=new ActivityRecord(…),将要创建的Activity相关信息ActivityStack.startActivityUncheckedLocked->//Activity启动方式:ActivityInfo.LAUNCH_MULTIPLE/LAUNCH_SINGLE_INSTANCE///ActivityInfo.LAUNCH_SINGLE_TASK/LAUNCH_SINGLE_TOP)// 创建一个新的task,即TaskRecord,并保存在ActivityRecord.task中//r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true)// 把新创建的Activity放在栈顶ActivityStack.startActivityLocked->ActivityStack.resumeTopActivityLocked->ActivityStack.startPausingLocked (使Launcher进入Paused状态)->/****************************************************************** AMS通过Binder通知Launcher进入Paused状态****************************************************************/ApplicationThreadProxy.schedulePauseActivity->//private class ApplicationThread extends ApplicationThreadNativeApplicationThread.schedulePauseActivity->ActivityThread.queueOrSendMessage->// 调用Activity.onUserLeaveHint// 调用Activity.onPause// 通知activity manager我进入了pause状态ActivityThread.handlePauseActivity->/****************************************************************** Launcher通过Binder告诉AMS,它已经进入Paused状态****************************************************************/ActivityManagerProxy.activityPaused->ActivityManagerService.activityPaused->ActivityStack.activityPaused->(把Activity状态修改为PAUSED)ActivityStack.completePauseLocked->// 参数为代表Launcher这个Activity的ActivityRecord// 使用栈顶的Activity进入RESUME状态ActivityStack.resumeTopActivityLokced->//topRunningActivityLocked将刚创建的放于栈顶的activity取回来// 即在ActivityStack.startActivityUncheckedLocked中创建的/****************************************************************** AMS创建一个新的进程,用来启动一个ActivityThread实例,* 即将要启动的Activity就是在这个ActivityThread实例中运行****************************************************************/ActivityStack.startSpecificActivityLocked->// 创建对应的ProcessRecordActivityManagerService.startProcessLocked->// 启动一个新的进程// 新的进程会导入android.app.ActivityThread类,,并且执行它的main函数,// 即实例化ActivityThread, 每个应用有且仅有一个ActivityThread实例Process.start("android.app.ActivityThread",…)->// 通过zygote机制创建一个新的进程Process.startViaZygote->// 这个函数在进程中创建一个ActivityThread实例,然后调用// 它的attach函数,接着就进入消息循环ActivityThread.main->/****************************************************************** ActivityThread通过Binder将一个ApplicationThread类的Binder对象* 传递给AMS,以便AMS通过此Binder对象来控制Activity整个生命周期****************************************************************/ActivityThread.attach->IActivityManager.attachApplication(mAppThread)->ActivityManagerProxy.attachApplication->ActivityManagerService.attachApplication->// 把在ActivityManagerService.startProcessLocked中创建的ProcessRecord取出来ActivityManagerService.attachApplicationLocked->/****************************************************************** AMS通过Binder通知ActivityThread一切准备OK,它可以真正启动新的Activity了****************************************************************/// 真正启动ActivityActivityStack.realStartActivityLocked->ApplicationThreadProxy.scheduleLaunchActivity->ApplicationThread.scheduleLaunchActivity->ActivityThread.handleLaunchActivity->// 加载新的Activity类,并执行它的onCreateActivityThread.performLaunchActivity/*1) Instrumentation.newActivity: 加载新类,即创建Activity对象;2) ActivityClientRecord.packageInfo.makeApplication:创建Application对象;<LoadedApk.makeApplication>3) Activity.attach(Context context, ActivityThread aThread,Instrumentation instr, IBinder token, int ident,Application application, Intent intent, ActivityInfo info,CharSequence title, Activity parent, String id,NonConfigurationInstances lastNonConfigurationInstances,Configuration config):把Application attach到Activity, 即把Activtiy相关信息设置到新创建的Activity中4) Instrumentation.callActivityOnCreate:调用onCreate;*/// 使用Activity进入RESUMED状态,并调用onResumeActivityThread.handleResumeActivity 3. ActivityManagerService3.1 类中关键信息public final class ActivityManagerService extends ActivityManagerNativeimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {…// Maximum number of recent tasks that we can remember.static final int MAX_RECENT_TASKS = 20;public ActivityStack mMainStack; // 管理Activity堆栈// Whether we should show our dialogs (ANR, crash, etc) or just perform their// default actuion automatically. Important for devices without direct input// devices.private boolean mShowDialogs = true;/*** Description of a request to start a new activity, which has been held* due to app switches being disabled.*/static class PendingActivityLaunch {ActivityRecord r;ActivityRecord sourceRecord;int startFlags;}/*** Activity we have told the window manager to have key focus.*/ActivityRecord mFocusedActivity = null;/*** List of intents that were used to start the most recent tasks.*/final ArrayList<TaskRecord> mRecentTasks = new ArrayList<TaskRecord>();/*** Process management.*/final ProcessList mProcessList = new ProcessList();/*** All of the applications we currently have running organized by name.* The keys are strings of the application package name (as* returned by the package manager), and the keys are ApplicationRecord* objects.*/final ProcessMap<ProcessRecord> mProcessNames = new ProcessMap<ProcessRecord>();/*** The currently running isolated processes.*/final SparseArray<ProcessRecord> mIsolatedProcesses = new SparseArray<ProcessRecord>();…public static final Context main(int factoryTest) { //main入口函数AThread thr = new AThread();thr.start();synchronized (thr) {while (thr.mService == null) {try {thr.wait();} catch (InterruptedException e) {}}}ActivityManagerService m = thr.mService;mSelf = m;ActivityThread at = ActivityThread.systemMain();mSystemThread = at;Context context = at.getSystemContext();context.setTheme(android.R.style.Theme_Holo);m.mContext = context;m.mFactoryTest = factoryTest;m.mMainStack = new ActivityStack(m, context, true); // 创建ActivityStackm.mBatteryStatsService.publish(context);m.mUsageStatsService.publish(context);synchronized (thr) {thr.mReady = true;thr.notifyAll();}m.startRunning(null, null, null, null);return context;}}

3.2 家族图谱无论何时何地,只要创造就有收获,只有不息的奋进,才能证明生命的存在。

Android Activity.startActivity流程简介

相关文章:

你感兴趣的文章:

标签云: