8個類搞定外掛程式化 Activity實現方案

2021-09-02 15:48:41 字數 3018 閱讀 7206

前兩篇文章寫完後,有人跟我說怎麼覺得你文章風格突然變了,最近講了這麼多內容變囉嗦了,沒有你高效率精簡的風格了。寶寶心裡苦啊,不是我不想,實在是外掛程式化這東西,如果你不知道理論知識的話,根本沒辦法去理解啊。接下來這幾篇我盡可能的以實踐為主,讓大家都能看得懂。 

在 序文 【android 外掛程式化的過去 現在 未來】中簡單的跟大家講過現在開源社群中所有外掛程式化的基本實現原理。

從本文開始就帶大家用最簡單的辦法實現乙個外掛程式化庫。 

首先講講最主要的功能,activity 的動態載入。檢視原始碼我們知道

.thread

.schedulelaunchactivity

(new

intent(r

.intent),r

.,system

.identityhashcode(r

),r.info

,new

configuration

(mservice

.mconfiguration),r

.compat,r

.task

.voiceinteractor,.

repprocstate,r

.icicle,r

.persistentstate

,results

,newintents

,andresume

,mservice

.isnexttransitionforward

(),profilerinfo

);private

void

sendmessage

(int

what

,object

obj,

intarg1

,int

arg2

,boolean

async)mh

.sendmessage

(msg);}

case

launch_activity:

這樣子就替換掉了系統的instrumentation而在instrumentation中,有乙個方法叫newactivity()

這個方法就是實際建立activity的方法,它的返回值就是我們應用中實際使用的 activity。

我們就可以在這裡,判斷到如果即將載入的 classname 是乙個外掛程式中的activity,那麼就通過classloader.load(classname).newinstance();建立外掛程式activity並返回來替換掉原本系統要建立的activity了。

@override

public

activity

newactivity

(classloadercl,

string

classname

,intent

intent

)throws

instantiationexception

,illegalacces***ception

,classnotfoundexception

if (

isplugin

&&intent

!=null

)else

return

super

.newactivity(cl

,classname

,intent

);}

如果僅僅是啟動乙個未安裝的activity,上面所做的事情已經足夠了。但是如果我們需要從外掛程式中啟動另乙個外掛程式activity,就需要多做一些事了。

activity啟動時,會呼叫instrumentation. execstartactivity()方法,我們所要做的就是重寫這個方法,並且重新定義乙個intent,來替換掉原本**中的intent,這個替換的目的就是為了防止上文提到的activitystacksupervisor.startactivitylocked()安全校驗,我們要把 intent 原本的setclass()方法傳入的 class 給替換成乙個合法的已經註冊過的activity(可以是任何乙個,只要是註冊過就行),接著將原本要啟動的外掛程式 activity 類名作為乙個字串儲存在bundle裡面,這樣到我們的instrumentation.newactivity()執行時判斷如果是乙個外掛程式activity,就不去建立 intent 傳遞的 activity.class,而是建立intent.bundle裡面保留的外掛程式 activity。

/**

* 覆蓋掉原始instrumentation類的對應方法,用於外掛程式內部跳轉activity時適配

* *@override

*/public

activityresult

execstartactivity

(context

who,

ibinder

contextthread

,ibinder

token

,activity

target

,intent

intent

,int

requestcode

,bundle

options

)catch

(exceptione)

}

至此,通過替換掉系統的 instrumentation,我們已經可以將 activity 動態載入到應用中了。但是如果完整實現出來,還會有個問題,就是類可以完美執行,但是資源還不能載入進來,下章就講資源的載入以及 so檔案和 service 的載入了。【8個類搞定外掛程式化——service實現方案】

四個類搞定分層自動化測試框架

我們剛開始做自動化測試,可能寫的 都是基於原生寫的 看起來特別不美觀,而且感覺特別生硬。來看下面一段 具體表現如下 從個人方面來說 從實際方面來說 下面我們將進入大家都比較關注的話題了,這裡我只分享思路哈,跟上步伐,別掉隊哦,看我如何四個類搞定測試框架的 其實就是體現在封裝上,先說下要封裝的部分 好...

pytest外掛程式 8個很棒的pytest外掛程式

pytest外掛程式 我們是pytest的忠實擁護者,並將其用作工作和開源專案的預設python測試工具。在本月的python專欄文章中,我們分享了為什麼我們喜歡pytest以及為什麼使用pytest進行測試非常有趣的一些外掛程式。test pytest 以及作為以test 開頭的函式。然後,pyt...

推薦8個獨特應用的JQuery拖放外掛程式

web2.0很重要的乙個特徵就是互動性的強化,而拖放的引入,可以起到很好的互動效果,jquery ui包已經包含了拖放,但拖放的應用不只應用於層的拖拉,接下來明河推薦幾個獨到的應用拖放的jquery外掛程式。明河是推薦直接使用jquery ui包中的拖放,當你的需求jquery 拖放ui無法滿足時,...