Android外掛程式化開發之解決Atlas組件在宿主的註冊問題

來源:互聯網
上載者:User

標籤:android   openatlas   組件註冊   fragment   activity   

OpenAtlas有一個問題,就是四大組件必須在Manifest檔案中進行註冊,那麼就必然帶來一個問題,外掛程式中的組件都要重複在宿主中註冊。像Service,ContentProvider等組件目前沒有什麼好的解決方案,只能在宿主中註冊。但是像Activity,顯然是有解決方案的,就是使用Fragment代替Activity,Activity只是作為一個放Fragment的容器,那麼不僅在外掛程式中不用再資訊清單檔中註冊,就連宿主的註冊問題也一併解決了。那麼,解決方案呢,沒錯,就是之前寫的一篇博文Android使用Fragment打造萬能頁面切換架構。在閱讀下文前,請務必先閱讀該文章。

但是使用該頁面切換架構也帶來一個問題,就是該架構中是通過反射調用Fragment,但是在宿主中如果直接使用反射,會報java.lang.ClassNotFoundException的錯誤,我們必須使用OpenAtlas提供的外掛程式的ClassLoader來載入,為了支援OpenAtlas,我對該架構進行了修改,使其支援OpenAtlas

在配置類CoreConfig中增加兩個變數,控制是否啟用OpenAtlas,以及用於設定和獲得ClassLoader,並提供靜態getter和setter方法

/** * Atlas支援 start */private static boolean isOpenAtlas=false;private static ClassLoader mBundleClassLoader =null;public static boolean isOpenAtlas() {    return isOpenAtlas;}public static void setIsOpenAtlas(boolean isOpenAtlasFlag) {    isOpenAtlas = isOpenAtlasFlag;}public static ClassLoader getBundleClassLoader() {    return mBundleClassLoader;}public static void setBundleClassLoader(ClassLoader classLoader) {    mBundleClassLoader = classLoader;}/** * Atlas支援 end */

修改原來的核心函數,判斷CoreConfig中的布爾變數,是否啟用了OpenAtlas,預設是不啟用的。如果啟用了,則通過getBundleClassLoader函數獲得ClassLoader,但是前提是你調用了setBundleClassLoader函數設定了ClassLoader,返回的才不是空

/** * Atlas的支援 start */if (CoreConfig.isOpenAtlas()){    ClassLoader bundleClassLoader = CoreConfig.getBundleClassLoader();    if(bundleClassLoader==null){        Log.d(TAG, "OpenAtlas bundle ClassLoader is null!");        return null;    }    fragment = (BaseFragment) CoreConfig.getBundleClassLoader().loadClass(corePage.getClazz()).newInstance();}else{    fragment = (BaseFragment) Class.forName(corePage.getClazz()).newInstance();}/** * Atlas的支援 end */

之後在宿主中調用的時候,記得開啟OpenAtlas的支援,並設定ClassLoader,而ClassLoader的擷取是通過Atlas的成員函數getBundleClassLoader()來擷取,該函數需要傳遞一個參數,該參數就是對應外掛程式的包名,也就是之前產生的外掛程式資訊列表的json中的pkgName

之後的開發就是正常程式的開發了。但是注意一點,就是宿主的入口Activity必須繼承頁面切換架構中的BaseActivity,並且不需要調用setContentView進行版面設定,直接使用openPage函數開啟Fragment即可,外掛程式中的Fragment必須繼承頁面切換架構中的BaseFragment,並且記得在宿主Application中調用 CoreConfig.init(this);進行該架構的初始化。

然後在宿主中調用,記得設定ClassLoader和開啟OpenAtlas的支援。Fragment的設定檔page.json**不用拷到宿主中**,可直接讀取。

CoreConfig.setIsOpenAtlas(true);ClassLoader bundleClassLoader = Atlas.getInstance().getBundleClassLoader("com.lizhangqu.fragment");CoreConfig.setBundleClassLoader(bundleClassLoader);openPage("test", null, CoreAnim.none);

而外掛程式中,不應該將該架構打包進去,只是編譯的時候提供,具體的適配工作見上一篇文章Android外掛程式化開發之Atlas外掛程式適配

最後,提供一個範例源碼

http://download.csdn.net/detail/sbsujjbcy/9031679

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android外掛程式化開發之解決Atlas組件在宿主的註冊問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.