Android插件化开发之解决OpenAtlas组件在宿主的注冊问题
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
posted on 2017-08-18 17:45 mthoutai 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/mthoutai/p/7390983.html
總結
以上是生活随笔為你收集整理的Android插件化开发之解决OpenAtlas组件在宿主的注冊问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: logging 模块
- 下一篇: [置顶]星球联盟