分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
是android中乙個很重要的概念,堪稱四大元件之首,關於activity有很多內容,比如生命週期和啟動flags,這二者想要說清楚,恐怕又要寫兩篇長文,更何況分析它們的原始碼呢。不過本文的側重點不是它們,我要介紹的是乙個activity典型的啟動過程,本文會從原始碼的角度對其進行分析。我們知道,當startactivity被呼叫的時候,可以啟動乙個activity,但是你知道這個activity是如何被啟動的嗎?每個activity也是乙個物件,你知道這個物件是啥時候被建立的嗎(也就是說它的構造方法是什麼時候被呼叫的)?為什麼oncreate是activity的執行入口?所有的這一切都被系統封裝好了,對我們來說是透明的,我們使用的時候僅僅是傳遞乙個intent然後startactivity就可以達到目的了,不過,閱讀了本文以後,你將會了解它的背後到底做了哪些事情。在分析之前,我先介紹幾個類:
instrumentation:用來輔助activity完成啟動activity的過程
首先看入口
code:activity#startactivity
@override
public
void
startactivity
(intent intent)
@override
public
void
startactivity
(intent intent, bundle options)
else
說明:顯然,從上往下,最終都是由startactivityforresult來實現的
接著看code:activity#startactivityforresult
public
void
startactivityforresult
(intent intent, int requestcode, bundle options)
else break; } } } } try catch (remoteexception e) return
null;}
說明:我想再說一下這個方法checkstartactivityresult,它也專業拋異常的,看**,相信大家對下面的異常資訊不陌生吧,就是它幹的,其中最熟悉的非unable to find explicit activity class莫屬了,如果你在xml中沒有註冊目標activity,此異常將會丟擲。
說明:上述**很好理解,構造乙個activity記錄,然後傳送乙個訊息,所以,我們要看看handler是如何處理這個訊息的,現在轉到這個handler,它有個很短的名字叫做h
code:activitythread#h
//這個類太長,我只帖出了我們用到的部分
private
class
hextends
handler
// make sure we are running with the most recent config. handleconfigurationchanged(null, null); if (locallogv) slog.v( tag, "handling launch of " + r); //終於到底了,大家都有點不耐煩了吧,從方法名可以看出,
//performlaunchactivity真正完成了activity的調起,
//同時activity會被例項化,並且oncreate會被呼叫 activity a = performlaunchactivity(r, customintent); if (a != null) if (!r.activity.mcalled) } catch (supernotcalledexception e) catch (exception e) } r.paused = true; } } else catch (remoteexception ex) }}
說明:關於原activity和新activity之間的狀態同步,如果大家感興趣可以自己研究下,因為邏輯太複雜,我沒法把所有問題都說清楚,否則就太深入細節而淹沒了整體邏輯,研究原始碼要的就是清楚整體邏輯。下面看最後乙個方法,這個方法是activity的啟動過程的真正實現。
code:activitythread#performlaunchactivity
private activity performlaunchactivity
(activityclientrecord r, intent customintent)
//其實就是通過activity的無參構造方法來new乙個物件,物件就是在這裡new出來的。 activity = minstrumentation.newactivity( cl, component.getclassname(), r.intent); strictmode.incrementexpectedactivitycount(activity.getclass()); r.intent.setextrasclassloader(cl); if (r.state != null) } catch (exception e) r.activity = activity; r.stopped = true; if (!r.activity.mfinished) if (!r.activity.mfinished) } if (!r.activity.mfinished) } } r.paused = true; mactivities.put(r.token, r); } catch (supernotcalledexception e) catch (exception e) } return activity;}
相信當你看到這裡的時候,你對activity的啟動過程應該有了乙個感性的認識。activity很複雜,特性很多,本文沒法對各個細節進行深入分析,而且就算真的對各個細節都進行了深入分析,那文章要有多長啊,還有人有耐心看下去嗎?希望本文能夠給大家帶來一些幫助,謝謝大家閱讀。
給我老師的人工智慧教程打call!
Android 訊息機制原始碼分析
threadlocal 乙個執行緒內部的資料儲存類,可以在指定執行緒中儲存資料,資料儲存以後,只有在指定執行緒中可以獲取到儲存的資料。先看下以下 主要是重寫了initialvalue方法 請看下面的原始碼 test public void test abc system.out.println th...
android 執行緒池原始碼分析
一直覺得這塊比較複雜,原因在於需要對資料結構和多執行緒開發比較熟悉。現在從threadpoolexecutor 出發。先看這個建構函式。public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,...
android系統原始碼結構大致分析
android原始碼專案結構分析 1.android原始碼的是乙個類似於應用軟體的專案,那麼android原始碼這個專案就必定需要模組化,這一點需要清楚。那麼我們就來看看原始碼的目錄模組 ls bionic cts device hardware libcore out sdk bootable d...