ActivityThreadエントリ手順は、その主な機能では、
- 呼び出さルーパ初期化し、オープンループ関数、及びそれ自体の新しいインスタンスは、コードの一部として、方法を添付します
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
Looper.loop();
新しいアクティビティを作成する前に(存在しない場合)、それは最初のアプリケーションを初期化します。
、最初の呼び出しを作成するプロセスにおける活動
scheduleLaunchActivity()
、彼らは呼び出した後
handleLaunchActivity()
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
handleConfigurationChanged(null, null);
//初始化 WindowManagerService,主要是获取到 WindowManagerService 代理对象
WindowManagerGlobal.initialize();
//初始化Activity
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
//显示布局
handleResumeActivity(r.token, false, r.isForward,
!r.activity.mFinished && !r.startsNotResumed);
}
}
performLaunchActivity法では、新しい活動の意志例方法と行いを添付して
Activity activity = null;
try {
java.lang.ClassLoader cl = appContext.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);
}
}
......
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, window, r.configCallback);
Activity.attach方法は、ウィンドウを初期化し、
mWindow = new PhoneWindow(this, window, activityConfigCallback);
mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
if (mParent != null) {
mWindow.setContainer(mParent.getWindow());
}
mWindowManager = mWindow.getWindowManager();
ウィンドウには、抽象クラスで活動中またはDialogは、phoneWindowに使用されているかどうかを特定の実装PhoneWindow、アンドロイドです。ウィンドウマネージャのオブジェクトを与えると同時に、ウィンドウマネージャは、特にこれがWindowManagerImplウィンドウマネージャにある達成するために、抽象クラスであります
public void setWindowManager(WindowManager wm, IBinder appToken, String appName, boolean hardwareAccelerated) {
mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
}
各アクティビティには、ウィンドウマネージャオブジェクトを持つことになり、これはmWindowManagerとWindowManagerService通信するだけでなく、WindowManagerServiceの特定のキーであることを識別ビュー・アクティビティ作成のmToken時間の入IBinderタイプ属します。
これらを実行した後、実装上の活動にわたって継続performLaunchActivity処理に戻り、方法を添付し、そして、
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
この方法のonCreateメソッドのコールバック・アクティビティ、通常のonCreateに我々はcontentView、設定
:レイアウトウィンドウに設定するウィンドウを呼び出すために、実際には、ちょうどこの時間の活動にレイアウト設定を
Activity.setContentViewを():
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
PhoneWindow.setContentView():
public void setContentView(int layoutResID) {
...
installDecor();
...
}
installDecor方法はDectorViewとmContentParent、mContentParentビューDecorView部分を初期化します。
それからちょうどPhoneWindow、およびDecorViewを作成したが、二つはどんな関係を持っていない、関係がActivityThread.performResumeActivityで生成した後、()を呼び出すr.activity.performResumeされ、r.activity.makeVisibleを呼び出して、現在のDecorViewに追加されますウィンドウ。
したがってActivity.onCreate方法仕上げ、performLaunchActivity handleLaunchActivityは、論理的かつ実質的に実行ActivityThread。
概要]:初期化活動、活動は、ウィンドウ、ウィンドウマネージャに初期化。ウィンドウがDecorView初期化されます
そして実行ActivityThread.handleStartActivity performStartActivity両方これらの方法を実行した後、対応する方法がActivity.onStart実行されます。これらは、UI部品を伴わない、私は詳細には触れません。
その後、handleResumeActivityの上、
final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume) {
//执行到 onResume()
ActivityClientRecord r = performResumeActivity(token, clearHide);
if (r != null) {
final Activity a = r.activity;
boolean willBeVisible = !a.mStartedActivity;
...
if (r.window == null && !a.mFinished && willBeVisible) {
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l);
}
}
...
if (!r.activity.mFinished && willBeVisible
&& r.activity.mDecor != null && !r.hideForNow) {
...
mNumVisibleActivities++;
if (r.activity.mVisibleFromClient) {
//添加视图,详见下面分析
r.activity.makeVisible();
}
}
//resume 完成
if (reallyResume) {
ActivityManagerNative.getDefault().activityResumed(token);
}
} else {
...
}
}
Activity.makeVisible():
void makeVisible() {
if (!mWindowAdded) {
ViewManager wm = getWindowManager();
wm.addView(mDecor, getWindow().getAttributes());
mWindowAdded = true;
}
mDecor.setVisibility(View.VISIBLE);
}
この方法ではperformResumeActivity、performResumeActivityコールバックActivity.onResumeを呼び出します。
これらの方法のどちらにおいても、第一dectorアクティビティ点DectorViewウィンドウのであり、
その後、ウィンドウマネージャを介して添加しました。WindowManagerImplでaddViewコンクリート実現のウィンドウマネージャは、一方addViewのWindowManagerImplがWindowManagerGlobal.addView()を呼び出します。
WindowManagerGlobal.addView():
public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow) {
...
ViewRootImpl root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
root.setView(view, wparams, panelParentView);
...
}
このプロセスはViewRootImplを作成し、以前にパラメータとしてDecoViewを作成し、管理するためのViewRootImplによってDecoViewイベント後、例えば、DecoViewビュー、[削除]ビューを追加します。
ViewRootImplはViewParentにこのインタフェースを実現しました。彼の親コンテナのレイアウトの一般的な見解は、DecorView親がに、ViewRootImplあります
root.setView(view, wparams, panelParentView);
実行するこの方法は、ViewRootImplを結合親を行いました。
実行後、他の手段によって、画面上に表示。