现在的位置: 首页 > 综合 > 正文

android插件化-apkplugdemo源码阅读指南-10

2018年02月23日 ⁄ 综合 ⁄ 共 3166字 ⁄ 字号 评论关闭

阅读本节内容前可先了解 apkplug基础教程

本教程是基于apkplug V1.6.8 版本编写  最新开发方式以官网为准

可下载最新的apkplugdemo源码http://git.oschina.net/plug/apkplugDemos

apkplugdemo演示图

 

一 apkplugdemo工程源码结构

    src

        |-com.apkplugdemo.adapter             --插件列表Adapter

        |-com.apkplugdemo.adapter.base      --adapter 基类

        |-com.apkplugdemo.FileUtil               --文件操作类

        |-com.apkplugdemo.FileUtil.filter        --文件类型过滤类

        |-com.apkplugdemo.util                    --项目通用工具类

        |-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启动插件

01 public void onCreate()
{  
02     super.onCreate();
03     try{
04         List
activators=
new java.util.ArrayList<BundleActivator>();
05         //将服务加入框架,框架将在启动时启动这些服务
06         activators.add(new appServiceManager());
07        frame=FrameworkFactory.getInstance().start(activators,this,new MyProperty(this.getApplicationContext()));
08         BundleContext
context =frame.getSystemBundleContext();
09    //安装assets文件夹下的插件
该类替代了MyProperty.AutoStart()方法 ,1.6.7以上建议使用新方式
10         InstallBundle
ib=
new InstallBundle();
11        ib.installBundle(getApplicationContext(),
context,
12             new installCallback(){
13                 @Override
14                 public void callback(int arg0,
Bundle arg1) {
15                     if(arg0==installCallback.stutas5||arg0==installCallback.stutas7){
16             Log.d("",String.format("插件安装
%s : %d"
,arg1.getName(),arg0));
17                     return;
18                     }else{
19                         Log.d("","插件安装失败
:%s"
+arg1.getName());
20                     }
21                 }
22         });
23        }catch (Exception
ex){
24             System.err.println("Could
not create : "
 +
ex);
25             ex.printStackTrace();
26        int nPid
= android.os.Process.myPid();
27             android.os.Process.killProcess(nPid);
28         }
29 }


  

四 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框架的调用就是这些了,其他工具性的代码感兴趣的同学可以自己看。

抱歉!评论已关闭.