Android的Activity啟動與子執行緒更新UI
最近會將以前閱讀過的一些原始碼做些沉澱與總結
我們知道現在大多數的GUI框架都是採用單執行緒模型來處理訊息佇列和UI更新的,Android自然也是如此。
啟動
在APK首次啟動的時候,Zygote程式會fork個子程式,並在子程式中呼叫ActivityThread的main函式,主執行緒的訊息佇列和ActivityThread例項的初始化都是在此完成的。
與AMS的通訊
ActivtyManagerService控制著Activity的啟動與生命週期,並通過ApplicationThread與ActivityThread進行IPC通訊。
onCreate
AMS通過ApplicationThread的scheduleLaunchActivity啟動一個新的Activity,並通過Handler呼叫ActivityThread的handleLaunchActivity方法。
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
Bundle oldState = r.state;
handleResumeActivity(r.token, false, r.isForward,
!r.activity.mFinished && !r.startsNotResumed);
......
}
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
}
else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
......
}
Instrumentation.java
public void callActivityOnCreate(Activity activity, Bundle icicle, PersistableBundle persistentState) {
prePerformCreate(activity);
activity.performCreate(icicle, persistentState);
postPerformCreate(activity);
}
Activity.java
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
onCreate(icicle, persistentState);
mActivityTransitionState.readState(icicle);
performCreateCommon();
}
onResume
ActivtyThread通過performLaunchActivity的呼叫做些Activity的初始化,包括建立例項和最終呼叫Activity的onCreate方法。之後通過呼叫handleResumeActivity方法
final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume) {
......
// TODO Push resumeArgs into the activity for consideration
ActivityClientRecord r = performResumeActivity(token, clearHide);
......
if (r.window == null && !a.mFinished && willBeVisible) {
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l);
}
}
.....
public final ActivityClientRecord performResumeActivity(IBinder token, boolean clearHide) {
......
r.activity.performResume();
......
}
ActivtyThread通過handleResumeActivity呼叫Activity的onResume方法之後,並在當前Activity的Window為null等情況下,呼叫WindowMangerGlobal的addView方法將Activity的decorView新增在Window中。
WindowMangerGlobal.java
public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow) {
......
root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);
try {
root.setView(view, wparams, panelParentView);
} catch (RuntimeException e) {
......
}
重點來了,在Activity的onCreate和onResume呼叫之後,ActivityThread才建立了ViewRootImpl,並呼叫setView方法
ViewRootImpl.java
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
......
requestLayout();
......
view.assignParent(this);
......
}
@Override
public void requestLayout() {
if (!mHandlingLayoutInLayoutRequest) {
checkThread();
mLayoutRequested = true;
scheduleTraversals();
}
}
void invalidate() {
mDirty.set(0, 0, mWidth, mHeight);
if (!mWillDrawSoon) {
scheduleTraversals();
}
}
在此才會檢查當前執行緒是否為主執行緒,並設定了view的parent,之後一些系統view元件或自定義view會通過呼叫requestlayout或者invalidate實現view的重新渲染(scheduleTraversals通過Handelr實現)。
結論
通過上訴Activity的啟動過程可知,我們在Activity的onCreate和onResume中,通過子執行緒的確可以實現更新某些系統view元件。
@Override
protected void onResume() {
super.onResume();
new NoUIThread().start();
}
class NoUIThread extends Thread {
@Override
public void run() {
mNoUITextView.setText("Penner");
}
}
相關文章
- Android複習之旅--子執行緒更新UIAndroid執行緒UI
- Android子執行緒真的不能更新UI麼Android執行緒UI
- 如何在子執行緒中更新UI執行緒UI
- 子執行緒與UI執行緒的通訊(委託)執行緒UI
- Android 不能在子執行緒中更新 UI 的討論和分析Android執行緒UI
- 老問題:Android子執行緒中更新UI的3種方法Android執行緒UI
- Android中子執行緒更新主執行緒UI和ProgressBar的應用Android執行緒UI
- android 關於關於子執行緒更新UI的一些事Android執行緒UI
- Android中子執行緒真的不能更新UI嗎?Android執行緒UI
- Android 中子執行緒真的不能更新UI嗎?Android執行緒UI
- Android新執行緒中更新主執行緒UI中的View方法彙總Android執行緒UIView
- Android中UI執行緒與後臺執行緒互動設計的5種方法AndroidUI執行緒
- Android 子執行緒 UI 操作真的不可以?Android執行緒UI
- 執行緒的啟動執行緒
- 子執行緒 UI 問題捉蟲執行緒UI
- 為何要在主執行緒上更新UI執行緒UI
- 執行緒啟動原理執行緒
- Android程式啟動與Activity顯示Android
- Android程式框架:執行緒與執行緒池Android框架執行緒
- Android的程式與執行緒Android執行緒
- android 主執行緒和子執行緒之間的訊息傳遞Android執行緒
- android程式與執行緒詳解二:執行緒Android執行緒
- Android程式與執行緒Android執行緒
- MFC UI執行緒UI執行緒
- [原] Android performClick無效,UI執行緒理解AndroidORMUI執行緒
- C#多執行緒程式設計(1):執行緒的啟動C#執行緒程式設計
- Android-Activity的啟動模式Android模式
- Android Activity的啟動過程Android
- C#多執行緒與UI響應C#執行緒UI
- Android的執行緒和執行緒池Android執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- 完全理解android Activity啟動模式LauchMode (深入Activity與任務棧)Android模式
- android UI結構 (1)Activity 與 WindowAndroidUI
- 關於“UI執行緒”UI執行緒
- Android執行緒的建立與銷燬Android執行緒
- 面試官:Java 執行緒如何啟動的?面試Java執行緒
- Java多執行緒的建立和啟動Java執行緒
- 【JUC】1-Java執行緒的啟動Java執行緒