Android插件化开发之解决OpenAtlas组件在宿主的注冊问题
OpenAtlas有一個問題,就是四大組件必須在Manifest文件里進行注冊,那么就必定帶來一個問題,插件中的組件都要反復(fù)在宿主中注冊。像Service,ContentProvider等組件眼下沒有什么好的解決方法。僅僅能在宿主中注冊。
可是像Activity,顯然是有解決方法的。就是使用Fragment取代Activity,Activity僅僅是作為一個放Fragment的容器,那么不僅在插件中不用再清單文件里注冊,就連宿主的注冊問題也一并攻克了。那么,解決方式呢,沒錯,就是之前寫的一篇博文Android使用Fragment打造萬能頁面切換框架。
在閱讀下文前,請務(wù)必先閱讀該文章。
可是使用該頁面切換框架也帶來一個問題。就是該框架中是通過反射調(diào)用Fragment,可是在宿主中假設(shè)直接使用反射,會報java.lang.ClassNotFoundException的錯誤。我們必須使用OpenAtlas提供的插件的ClassLoader來載入,為了支持OpenAtlas。我對該框架進行了改動,使其支持OpenAtlas
在配置類CoreConfig中添加兩個變量。控制是否啟用OpenAtlas,以及用于設(shè)置和獲得ClassLoader。并提供靜態(tài)的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*/改動原來的核心函數(shù)。推斷CoreConfig中的布爾變量。是否啟用了OpenAtlas,默認是不啟用的。假設(shè)啟用了,則通過getBundleClassLoader函數(shù)獲得ClassLoader,可是前提是你調(diào)用了setBundleClassLoader函數(shù)設(shè)置了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*/之后在宿主中調(diào)用的時候,記得開啟OpenAtlas的支持。并設(shè)置ClassLoader,而ClassLoader的獲取是通過Atlas的成員函數(shù)getBundleClassLoader()來獲取,該函數(shù)須要傳遞一個參數(shù),該參數(shù)就是相應(yīng)插件的包名,也就是之前生成的插件信息列表的json中的pkgName
之后的開發(fā)就是正常程序的開發(fā)了。可是注意一點,就是宿主的入口Activity必須繼承頁面切換框架中的BaseActivity,而且不須要調(diào)用setContentView進行頁面設(shè)置。直接使用openPage函數(shù)打開Fragment就可以。插件中的Fragment必須繼承頁面切換框架中的BaseFragment,而且記得在宿主Application中調(diào)用 CoreConfig.init(this);進行該框架的初始化。
然后在宿主中調(diào)用。記得設(shè)置ClassLoader和開啟OpenAtlas的支持。Fragment的配置文件page.json 不須要拷到宿主中。
CoreConfig.setIsOpenAtlas(true); ClassLoader bundleClassLoader = Atlas.getInstance().getBundleClassLoader("com.lizhangqu.fragment"); CoreConfig.setBundleClassLoader(bundleClassLoader); openPage("test", null, CoreAnim.none);而插件中,不應(yīng)該將該框架打包進去,僅僅是編譯的時候提供,詳細的適配工作見上一篇文章Android插件化開發(fā)之Atlas插件適配
最后,提供一個例子源代碼
http://download.csdn.net/detail/sbsujjbcy/9031679
posted on 2017-08-18 17:45 mthoutai 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/mthoutai/p/7390983.html
總結(jié)
以上是生活随笔為你收集整理的Android插件化开发之解决OpenAtlas组件在宿主的注冊问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: logging 模块
- 下一篇: Android Device Monit