本教程是基於apkplug V1.6.8 版本編寫 最新開發方式以官網爲準 java
可下載最新的apkplugdemo源碼http://git.oschina.net/plug/apkplugDemos android
apkplugdemo演示圖 git
一 apkplugdemo工程源碼結構 設計模式
src app
|-com.apkplugdemo.adapter --插件列表Adapter 框架
|-com.apkplugdemo.adapter.base --adapter 基類 ide
|-com.apkplugdemo.FileUtil --文件操做類 函數
|-com.apkplugdemo.FileUtil.filter --文件類型過濾類 工具
|-com.apkplugdemo.util --項目通用工具類 post
|-com.apkplugdemo.util.Observer --java觀察者設計模式類
|-com.apkplugdemo.util.preferencesFactory --preferences操做類
|-com.example.apkplugdemo --項目application 和activity類
|-huahua.viewpager --與com.example.apkplugdemo功能相同 只是提供fragment方式展現
二 閱讀方式
根據以上結構能夠看出除去工具類咱們須要閱讀的代碼並很少
com.apkplugdemo.adapter.ListBundleAdapter --負責首頁列表Item展現以及 "運行"按鈕事件
com.example.apkplugdemo.ProxyApplication --負責啓動apkplug框架,以及安裝assets目錄下的插件 (經過InstallBundle類安裝)
com.example.apkplugdemo.MyProperty --啓動框架須要的接口類,爲框架提供本地化變量保存於獲取的接口 (老版本還提供自啓插件的安裝 v1.6.8版本用BundleControl服務替代)
com.example.apkplugdemo.MainActivity --項目啓動類,展現已安裝插件列表,提供安裝SD卡中插件的按鈕等功能
com.example.apkplugdemo.InstallBundle --啓動assets目錄下的插件
三 ProxyApplication
ProxyApplication 只啓動框架 而後調用InstallBundle啓動插件
public void onCreate() { super.onCreate(); try{ List activators=new java.util.ArrayList<BundleActivator>(); //將服務加入框架,框架將在啓動時啓動這些服務 activators.add(new appServiceManager()); frame=FrameworkFactory.getInstance().start(activators,this,new MyProperty(this.getApplicationContext())); BundleContext context =frame.getSystemBundleContext(); //安裝assets文件夾下的插件 該類替代了MyProperty.AutoStart()方法 ,1.6.7以上建議使用新方式 InstallBundle ib=new InstallBundle(); ib.installBundle(getApplicationContext(), context, new installCallback(){ @Override public void callback(int arg0, Bundle arg1) { if(arg0==installCallback.stutas5||arg0==installCallback.stutas7){ Log.d("",String.format("插件安裝 %s : %d",arg1.getName(),arg0)); return; }else{ Log.d("","插件安裝失敗 :%s"+arg1.getName()); } } }); }catch (Exception ex){ System.err.println("Could not create : " + ex); ex.printStackTrace(); int nPid = android.os.Process.myPid(); android.os.Process.killProcess(nPid); } }
四 InstallBundle 安裝插件實現
InstallBundle 是調用BundleControl實現將assets目錄中的apk文件安裝到宿主應用中的,詳細可看 <apkplug插件安裝-04>
//從assets目錄中複製apk文件到SD卡中 InputStream in=context.getAssets().open("BundleDemoOSGIService1.apk"); File f0=new File(context.getFilesDir(),"BundleDemoOSGIService1.apk"); if(!f0.exists()){ copy(in, f0); //第一次啓動時執行安裝,之後就不執行了 // startlevel設置爲1插件會自啓 isCheckVersion不檢測插件版本覆蓋更新 this.install(mBundleContext,"file:"+f0.getAbsolutePath(),callback,1,false); }
五 MainActivity 界面代碼
MainActivity 初始化函數
initBundleList() -- 獲取已安裝插件 <獲取apkplug已安裝插件-03>
ListenerBundleEvent() --監聽插件安裝事件 <監聽apkplug插件安裝事件>
apkplugdemo有關於apkplug框架的調用就是這些了,其餘工具性的代碼感興趣的同窗能夠本身看。