PHP中文网2017-04-17 15:03:49
Android 在進程的入口函數 ActivityThread.main()中,呼叫 Looper.prepareMainLooper
, 為應用程式的主執行緒建立Looper,然後呼叫Looper.loop()
就啟動了進程的訊息循環,然後就可以處理訊息了。
ActivityThread原始碼:
151 public final class ActivityThread {
2202 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
2253 if (activity != null) {
2259 activity.attach(appContext, this, ..., );
5219 public static void main(String[] args) {
// 在这儿调用 Looper.prepareMainLooper, 为应用的主线程创建Looper
5240 Looper.prepareMainLooper();
5242 ActivityThread thread = new ActivityThread();
5245 if (sMainThreadHandler == null) {
5246 sMainThreadHandler = thread.getHandler();
5247 }
5254 Looper.loop();
5257 }
5258}
Looper源碼:
52 public final class Looper {
// Initialize the current thread as a looper, marking it as an application's main looper.
// The main looper for your application is created by the Android environment,
// so you should never need to call this function yourself. See also: prepare()
87 public static void prepareMainLooper() {
88 prepare(false);
89 synchronized (Looper.class) {
90 if (sMainLooper != null) {
91 throw new IllegalStateException("The main Looper has already been prepared.");
92 }
93 sMainLooper = myLooper();
94 }
95 }
Activity源碼:
660 public class Activity extends ContextThemeWrapper {
699 /*package*/ ActivityThread mMainThread;
5922 final void attach(Context context, ActivityThread aThread, ..., ) {
5944 mMainThread = aThread;
參考:
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/ActivityThread.java
http://grepcode .com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/Activity.java
Android應用程式進程啟動過程的原始程式碼分析- by 羅升陽
Android_Message_Handler_訊息處理機制總結筆記