RePlugin外掛啟動原始碼分析
大年初一,先祝各位新年快樂!今天還在看部落格學習的兄dei很強大,如果能把一年節日假期時間分配到自己成長上,那你的一年 = 別人一年 * 1.1。如果能夠做到年年如此,10年後你就相當於活了11年。而這期間,學習複利效應的效果是呈現指數增長的。當然,朋友關係也不能落下,但在節假日做無聊的事情就是浪費時間了。
之前搭建了RePlugin原始碼閱讀環境,詳情請參考部落格RePlugin閱讀原始碼環境搭建
。
今天來分析一下RePlugin啟動外掛(RePlugin.startActivity)的流程。
下圖是我用StarUML畫的時序圖-SequenceDiagram,簡單表現了RePlugin.startActivity呼叫後發生的事情及其先後順序。
下面進行詳細分析。
1. RePlugin.startActivity
RePlugin中啟動外掛,就是通過呼叫以下方法。
RePlugin.startActivity(context, intent);
// 或者
RePlugin.startActivity(context, intent, pluginName, activity);
RePlugin是一個有很多靜態方法的類。集成了安裝解除安裝外掛、啟動外掛等功能。使用RePlugin框架,一般來說只需要操作RePlugin類就行。
2. Factory.startActivityWithNoInjectCN
這兩個startActivity方法,最終都會呼叫
Factory.startActivityWithNoInjectCN(context, intent, plugin, activity, process);
但startActivity(context, intent, pluginName, activity)
方法,中間多了一步,就是給intent設定ComponentName。會先呼叫以下方法初始化componentName,然後呼叫startActivityWithNoInjectCN
方法。
Factory.startActivity
Factory是框架內部的一個工具類,主要集成了查詢外掛、查詢外掛資源、查詢Activity資訊、載入外掛等功能。在啟動外掛中,Factory中所做的工作就是設定ComponentName給Intent。其中ComponentName主要包括兩個屬性:pkgName和clsName。這兩個屬性和外掛屬性對應關係:pkgName == pluginName、clsName == activityName。
startActivityWithNoInjectCN
方法的程式碼如下:
boolean result = sPluginManager.startActivity(context, intent, plugin, activity, process);
RePlugin.getConfig().getEventCallbacks().onStartActivityCompleted(plugin, activity, result);
startActivityWithNoInjectCN
就包括兩部分,第一行程式碼是直接呼叫PluginCommImpl的startActivity方法啟動Activity,這個在下一部分繼續說。
第二行是呼叫RePluginConfig的方法回撥,告知已經啟動Activity。這裡的RePluginConfig回撥,是可以在自己宿主的application中設定的。設定回撥後,就可以在application中進行各個事件的處理,比如外掛安裝失敗事件回撥方法onInstallPluginFailed
。以官方samplehost程式碼為例,設定回撥的程式碼如下。
// SampleApplication.java
repluginConfig.setEventCallbacks(new HostEventCallbacks(this));
3. PluginCommImpl.startActivity
在Factory.startActivityWithNoInjectCN
中,呼叫了pluginCommImpl.startActivity
方法,而在此方法中沒有做任何實質的工作,直接呼叫了PluginLibraryInternalProxy.startActivity
方法。
4. pluginLibraryInternalProxy.startActivity
PluginLibraryInternalProxy
是最終實現啟動外掛的地方,也是做了最多工作的地方。流程圖見下圖。
在PluginLibraryInternalProxy中,先判斷download標籤和plugin是否為null。download標籤預設為true,目前沒有手動修改的辦法。如果判斷成立,則回撥application中的方法。
然後判斷是否是動態類,是的話設定Intent、啟動Activity即可。否則進入下一步。
如果外掛還沒有載入,呼叫onLoadLargePluginForActivity
方法載入外掛。然後初始化ComponentName,設定Intent,呼叫context.startActivity
啟動外掛中指定的Activity。最後呼叫回撥方法,通知application已經啟動完畢。
總結
這樣來看,RePlugin啟動外掛,也就是RePlugin.startActivity方法的呼叫過程,最終還是呼叫context.startActivity
方法實現的。RePlugin框架所做的就是對Activity的pkgName、activityName進行處理:使用這兩個屬性建立ComponentName,並傳遞給Intent;以及在啟動外掛的不同時期,對RePluginConfig的回撥,如未找到外掛時會回撥onPluginNotExistsForActivity
方法。
最後,RePlugin啟動外掛可以說是RePlugin框架原始碼的入口,接下來會對外掛安裝、解除安裝等功能的原始碼進行分析,以此一步步的對RePlugin框架整體建立系統的認識,對RePlugin的實現機制有所瞭解。學習框架中的設計模式,最終能夠應用到自己的程式碼中去。
版權宣告
本文首發自簡書:搜尋作者 QinGeneral
同步發於CSDN部落格:搜尋作者 迷失
無需授權即可轉載,甚至無需保留以上版權宣告;
轉載時請務必註明作者。