Intent原始碼原理初探

2021-10-07 15:35:51 字數 2495 閱讀 1890

cloneable       clone      new intent(this)

setaction  component_name addcategory            addflags

getintent   parseuri setdata    category identified launchflags 

package component schemas extra 

getaction getdata getscheme gettype        getcategories

getextra

activity

public boolean dispatchtouchevent(motionevent ev)

2742        if (getwindow().superdispatchtouchevent(ev))

2745        return ontouchevent(ev);

2746    }

2747

phonewindow

superdispatchtouchevent

@override

1718    public boolean superdispatchtouchevent(motionevent event)

mdecor = decorview

private final class decorview extends framelayout implements rootviewsu***cetaker

superdispatchtouchevent

dispatchtouchevent

viewgroup

dispatchtouchevent

activity

startactivity

startactivityforresult 

instrumentation

executestartactivity     

activitymanagernative.startactivity

startactivityforresult

上面這個方法就是intent獲取到activityinfo的核心,它的大致過程如下:

首先獲取intent的component物件,如果不為空,說明指定了component,

那麼就直接通過component找到activityinfo列表,並且這個列表size為1,

所以這個activityinfo就是指定需要跳轉的元件。

如果沒有指定component,那就是隱式intent呼叫,

接著獲取intent傳遞的需要跳轉的包名。

如果包名為空,則會通過activityintentresolver等進行模糊匹配,

比如根據action、category等。

如果包名不為空,則直接根據包名來獲取到對應的activityinfo物件,

而mactivities就是pms儲存的activity資訊表。

// 獲取intent的component物件

componentname comp = intent.getcomponent();

if (comp == null)

}// 不為空,是顯式intent,直接獲取到activityinfo返回

if (comp != null)

return list;

}// 為空,是隱式intent

synchronized (mpackages)

// 通過包名獲取到package物件

final packageparser.package pkg = mpackages.get(pkgname);

if (pkg != null)

return new arraylist();

}}   

packagemanagerservice 

queryintentactivities 

componentname 

mpackages.get pkgname

packagemanager 

contextwraper 

@override

public packagemanager getpackagemanager()

activitythread 

getpackagemanager

servicemanager.getservice

systemserver       systemserver  run 

msystemservicemanager = new systemservicemanager(msystemcontext);

localservices.addservice(systemservicemanager.class, msystemservicemanager);

packagemanagerservice  main函式建立出來,並通過servicemanager

addservice

OkHttp原始碼初探

在之前的文章我中我們介紹了okhttp的基本使用方法並簡單說明了原始碼下各個module的功能作用,從這篇開始我們將要開始分析okhttp的原始碼。首先,我們先來回憶一下okhttp的使用過程 1.建立乙個okhttpclient物件 2.建立乙個request物件 3.呼叫okhttpclient...

RequireJS原始碼初探

前兩天跟著葉小釵的部落格,看了下requirejs的原始碼,大體了解了其中的執行過程。不過在何時進行依賴項的載入,以及具體的 在何處執行,還沒有搞透徹,奈何能力不夠,只能先記錄一下了。看原始碼從頭開始看,肯定是不切實際的。按照葉小釵的方法,是從data main開始的,所以我們也從那裡開始把!首先,...

RequireJS原始碼初探

前兩天跟著葉小釵的部落格,看了下requirejs的原始碼,大體了解了其中的執行過程。不過在何時進行依賴項的載入,以及具體的 在何處執行,還沒有搞透徹,奈何能力不夠,只能先記錄一下了。看原始碼從頭開始看,肯定是不切實際的。按照葉小釵的方法,是從data main開始的,所以我們也從那裡開始把!首先,...