标签:
一个应用启动时,入口方法为ActivityThread.main(),要注意ActivityThread只是一个普通的类,并不是继承于Thread也不是实现了Runnable。如下:
public static void main(String[] args) { //略一部分代码 <span style="white-space:pre"> </span>//启动主线程中的Looper Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false);//调用attach方法 if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler();//返回一个H对象。H是一个Handler。 } if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); } Looper.loop();//主线程开始loop <span style="white-space:pre"> </span>//loop()是阻塞式的,如果执行到这步,就意味着程序挂了 throw new RuntimeException("Main thread loop unexpectedly exited"); }因此,该方法分两部分:第一部分调用attach(),第二部分启动主线程的Looper。
if (!system) {//system就是attach()的参数 ViewRootImpl.addFirstDrawHandler(new Runnable() { @Override public void run() { ensureJitEnabled(); } }); android.ddm.DdmHandleAppName.setAppName("<pre-initialized>", UserHandle.myUserId()); RuntimeInit.setApplicationObject(mAppThread.asBinder()); final IActivityManager mgr = ActivityManagerNative.getDefault();//getDefault()调用的是gDefault.get() try { mgr.attachApplication(mAppThread); } catch (RemoteException ex) { // Ignore } // Watch for getting close to heap limit. BinderInternal.addGcWatcher(new Runnable() { @Override public void run() { if (!mSomeActivitiesChanged) { return; } Runtime runtime = Runtime.getRuntime(); long dalvikMax = runtime.maxMemory(); long dalvikUsed = runtime.totalMemory() - runtime.freeMemory(); if (dalvikUsed > ((3*dalvikMax)/4)) { if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024) + " total=" + (runtime.totalMemory()/1024) + " used=" + (dalvikUsed/1024)); mSomeActivitiesChanged = false; try { mgr.releaseSomeActivities(mAppThread); } catch (RemoteException e) { } } } }); }gDefault()的定义如下:
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() { protected IActivityManager create() { IBinder b = ServiceManager.getService("activity"); if (false) { Log.v("ActivityManager", "default service binder = " + b); } IActivityManager am = asInterface(b);//远程服务返回的IBinder对象 if (false) { Log.v("ActivityManager", "default service = " + am); } return am; } };从中可以看出gDefault.get()返回的是一个远程的IActivityManager对象。这个接口的实现类为ActivityManagerService。
因此,可以看出在attach()中拿到的mgr对象是远程的ActivityManagerService对象。然后又调用了它的attachApplication(),并将一个ApplicationThread对象(即mAppThread)当作参数传递进去了。
而ApplicationThread继承于ApplicationThreadNative,后者又继承了Binder并实现了IApplicationThread,而IApplicationThread又继承了IInterface。因此ApplicationThread是可以进行IPC的。
通过attach()将ApplicationThread对象传递到ActivityManagerService(简称AMS)对象中的,AMS就可以通过它和ApplicationThread进行IPC了。
而ApplicationThread内部的大部分方法基本上都调用ActivityThread#sendMessage(),如下:
private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) { if (DEBUG_MESSAGES) Slog.v( TAG, "SCHEDULE " + what + " " + mH.codeToString(what) + ": " + arg1 + " / " + obj); Message msg = Message.obtain(); msg.what = what; msg.obj = obj; msg.arg1 = arg1; msg.arg2 = arg2; if (async) { msg.setAsynchronous(true); } mH.sendMessage(msg);//mH为一个Handler对象 }从中可以看出,通过Handler将AMS中调用的方法(IPC是被调方执行在Binder池中,不是执行在主线程中)切换到了ActivityThread所在的线程(即主线程)中执行。
上面就是AMS与UI线程通信的机制:通过ApplicationThread进行中转,再通过Handler转发到ActivityThread所在的线程中执行。
在AMS的attach()中,又会调用ApplicationThread#bindApplication(),最终会调用到ActivityThread#handleBindApplication(),而在该方法中如下一句代码:
Application app = data.info.makeApplication(data.restrictedBackupMode, null);
其中data.info是LoadedApk对象,在该LoadedApk#makeApplication()中会建立Application对象。其代码如下:
public Application makeApplication(boolean forceDefaultAppClass, Instrumentation instrumentation) { if (mApplication != null) {//已有有application对象,直接返回 return mApplication; } Application app = null; String appClass = mApplicationInfo.className; if (forceDefaultAppClass || (appClass == null)) {//没有配置,加载系统的Application appClass = "android.app.Application"; } try { java.lang.ClassLoader cl = getClassLoader(); if (!mPackageName.equals("android")) { initializeJavaContextClassLoader(); } ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this); app = mActivityThread.mInstrumentation.newApplication( cl, appClass, appContext);//创建Application appContext.setOuterContext(app); } catch (Exception e) { if (!mActivityThread.mInstrumentation.onException(app, e)) { throw new RuntimeException( "Unable to instantiate application " + appClass + ": " + e.toString(), e); } } mActivityThread.mAllApplications.add(app); mApplication = app; if (instrumentation != null) {//在调用该方法是,传入的是null,所以判断不会执行 try { instrumentation.callApplicationOnCreate(app); } catch (Exception e) { if (!instrumentation.onException(app, e)) { throw new RuntimeException( "Unable to create application " + app.getClass().getName() + ": " + e.toString(), e); } } } // Rewrite the R 'constants' for all library apks. SparseArray<String> packageIdentifiers = getAssets(mActivityThread) .getAssignedPackageIdentifiers(); final int N = packageIdentifiers.size(); for (int i = 0; i < N; i++) { final int id = packageIdentifiers.keyAt(i); if (id == 0x01 || id == 0x7f) { continue; } rewriteRValues(getClassLoader(), packageIdentifiers.valueAt(i), id); } return app;//返回新创建的Application对象 }
从上面可以看出创建完Application对象后,并没有立即调用Application#onCreate(),handleBindApplication()后继代码为:
if (!data.restrictedBackupMode) { List<ProviderInfo> providers = data.providers; if (providers != null) {//安装ContentProvider installContentProviders(app, providers); mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10*1000); } } //略一部分代码 try { mInstrumentation.callApplicationOnCreate(app);//才调用Application#onCreate() } catch (Exception e) { if (!mInstrumentation.onException(app, e)) { throw new RuntimeException( "Unable to create application " + app.getClass().getName() + ": " + e.toString(), e); } }
这上面可以看出,Application#onCreate()是会晚于ContentProvider#onCreate()。
所有的startActivity()最终都会执行到下Activity#startActivityForResult
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) { if (mParent == null) { Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options); if (ar != null) { mMainThread.sendActivityResult( mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData()); } if (requestCode >= 0) { // If this start is requesting a result, we can avoid making // the activity visible until the result is received. Setting // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the // activity hidden during this time, to avoid flickering. // This can only be done when a result is requested because // that guarantees we will get information back when the // activity is finished, no matter what happens to it. mStartedActivity = true; } cancelInputsAndStartExitTransition(options); // TODO Consider clearing/flushing other event sources and events for child windows. } else { if (options != null) { mParent.startActivityFromChild(this, intent, requestCode, options); } else { // Note we want to go through this method for compatibility with // existing applications that may have overridden it. mParent.startActivityFromChild(this, intent, requestCode); } } }虽然上面通过mParent进行判断生成两部分调用,但他们殊途同归,最终都调用mInstrumentation.execStartActivity()。
另外要记住mMainThread.getApplicationThread()返回的是一个ApplicationThread类型的对象。而sInstrumentation是一个Instrumentation的对象。
上述execStartActivity()方法中有如下代码:
int result = ActivityManagerNative.getDefault() .startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mWho : null, requestCode, 0, null, options); checkStartActivityResult(result, intent);//其作用主要是判断result的值,如果值代表着错误就扔个异常出去。略再看ActivityManagerNative.getDefault().startActivity()经过百转千回,最终调用的是ApplicationThread#scheduleLaunchActivity,该方法内容又通过类名为H的handler发送了一个what为LAUNCH_ACTIVITY的msg。在该部分中又调用了handleLaunchActivity,再接着调用了performLaunchActivity。其主体代码如下:
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ActivityInfo aInfo = r.activityInfo; if (r.packageInfo == null) { r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo, Context.CONTEXT_INCLUDE_CODE); } ComponentName component = r.intent.getComponent(); if (component == null) { component = r.intent.resolveActivity( mInitialApplication.getPackageManager()); r.intent.setComponent(component); } if (r.activityInfo.targetActivity != null) { component = new ComponentName(r.activityInfo.packageName, r.activityInfo.targetActivity); } //上面是获取待启动activity的信息,并组装成一个ComponentName对象。 Activity activity = null; try { java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); StrictMode.incrementExpectedActivityCount(activity.getClass()); r.intent.setExtrasClassLoader(cl); r.intent.prepareToEnterProcess(); if (r.state != null) { r.state.setClassLoader(cl); } } catch (Exception e) { if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException( "Unable to instantiate activity " + component + ": " + e.toString(), e); } } //在newActivity中,是通过反射拿到一个activity的实例对象的,这里就创建了新的activity对象。 try { Application app = r.packageInfo.makeApplication(false, mInstrumentation); //makeApplication 反射拿application对象,如果已经存储就直接返回。并调用Application#onCreate()方法。 //一些输出语句,略 if (activity != null) { Context appContext = createBaseContextForActivity(r, activity); CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager()); Configuration config = new Configuration(mCompatConfiguration); //调用新创建的activity对象的attack()方法,主要是进行一系列的初始化工作,如创建PhoneWindow对象等 activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, r.intent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config, r.referrer, r.voiceInteractor); if (customIntent != null) { activity.mIntent = customIntent; } r.lastNonConfigurationInstances = null; activity.mStartedActivity = false; int theme = r.activityInfo.getThemeResource(); if (theme != 0) { activity.setTheme(theme); } activity.mCalled = false; if (r.isPersistable()) {//调用到onCreate(),只不过前者调用的是onCreate(Bundle,PersistableBundle),后者调用的是onCreate(Bundle) mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnCreate(activity, r.state); } if (!activity.mCalled) { throw new SuperNotCalledException( "Activity " + r.intent.getComponent().toShortString() + " did not call through to super.onCreate()"); } r.activity = activity; r.stopped = true; if (!r.activity.mFinished) { activity.performStart();//调用Activity#onStart() r.stopped = false; } if (!r.activity.mFinished) {//调用onRestoreInstanceState() if (r.isPersistable()) { if (r.state != null || r.persistentState != null) { mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state, r.persistentState); } } else if (r.state != null) { mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state); } } //由上述两个的判断顺序可以知道,onRestoreInstanceState()是在onStart()之后调用的,并且在有Bundle对象的时候才调用 if (!r.activity.mFinished) {//调用Activity#onPostCreate() activity.mCalled = false; if (r.isPersistable()) { mInstrumentation.callActivityOnPostCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnPostCreate(activity, r.state); } if (!activity.mCalled) { throw new SuperNotCalledException( "Activity " + r.intent.getComponent().toShortString() + " did not call through to super.onPostCreate()"); } } } r.paused = true; mActivities.put(r.token, r); } catch (SuperNotCalledException e) { throw e; } catch (Exception e) { if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException( "Unable to start activity " + component + ": " + e.toString(), e); } } return activity; }整体思考在注释中。
private Context createBaseContextForActivity(ActivityClientRecord r, final Activity activity) { ContextImpl appContext = ContextImpl.createActivityContext(this, r.packageInfo, r.token); appContext.setOuterContext(activity); Context baseContext = appContext; final DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); try { final int displayId = ActivityManagerNative.getDefault().getActivityDisplayId(r.token); if (displayId > Display.DEFAULT_DISPLAY) { Display display = dm.getRealDisplay(displayId, r.token); baseContext = appContext.createDisplayContext(display);//也是直接new一个ContextImpl对象返回的 } } catch (RemoteException e) { } // For debugging purposes, if the activity's package name contains the value of // the "debug.use-second-display" system property as a substring, then show // its content on a secondary display if there is one. String pkgName = SystemProperties.get("debug.second-display.pkg"); if (pkgName != null && !pkgName.isEmpty() && r.packageInfo.mPackageName.contains(pkgName)) { for (int displayId : dm.getDisplayIds()) { if (displayId != Display.DEFAULT_DISPLAY) { Display display = dm.getRealDisplay(displayId, r.token); baseContext = appContext.createDisplayContext(display); break; } } } return baseContext; }
我们可以发现在整个过程中,baseContext都是ContextImpl类型的。而该对象会传递到Activity#attach()中,并且最终被赋值到ContextWrapper#mBase(Activity也是间接继承于ContextWrapper)属性。
1,由上面的整个过程可以发现,在activity整个启动过程中最重要的两个类是ActivityThread(关键是其内部类ApplicationThread)与Instrumentation。
2,Activity中涉及到的Context都是ContextImpl对象。常用的startService(),stopService(),registerReceiver(),unregisterReceiver(),sendBroadcast(),getAssets(),getResource(),bindService(),unbindService()与getContentResolver()等都是直接调用ContextImpl中的方法的。
标签:
原文地址:http://blog.csdn.net/u010410408/article/details/51352403