• 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06
  • 频道栏目
    神奇公式秒杀全国11选5 > 程序开发 > 移动开发 > Android > 正文
    Android 插件化,qihoo360插件方案配置教程
    2018-07-30 14:14:19         来源:再也不做的事  
    收藏   我要投稿

    11选5任8 8注必中:Android 插件化,qihoo360插件方案

    神奇公式秒杀全国11选5 www.2zfa.com 目录

    Android 插件化,qihoo360插件方案


    宿主App插件化: 插件App插件配置: 宿主调用插件App:

    新建一个项目,开始配置

    宿主插件化配置:

    在项目的根目录build.gradle中配置

    classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.4'

    在App module的build.gradle中引入

    apply plugin: 'replugin-host-gradle'

    其中repluginHostConfig 要看你是否使用AppCompat 来进行个性化配置

    repluginHostConfig {
     /**
      * 是否使用 AppCompat 库
      * 不需要个性化配置时,无需添加
      */
     useAppCompat = true
    }
    
    

    3.添加依赖:

    compile 'com.qihoo360.replugin:replugin-host-lib:2.2.4'

    4.配置 Application 类

    让工程的 Application 直接继承自 RePluginApplication。

    如果您的工程已有Application类,则可以将基类切换到RePluginApplication即可?;蛘吣部梢杂?ldquo;非继承式”接入。

    public class MainApplication extends RePluginApplication {
    }

    既然声明了Application,自然还需要在AndroidManifest中配置这个Application。

     

    备?。?ldquo;非继承式”配置Application

    若您的应用对Application类继承关系的修改有限制,或想自定义RePlugin加载过程(慎用?。?,则可以直接调用相关方法来使用RePlugin。

    public class MainApplication extends Application {
    
     @Override
     protected void attachBaseContext(Context base) {
      super.attachBaseContext(base);
    
      RePlugin.App.attachBaseContext(this);
      ....
     }
    
     @Override
     public void onCreate() {
      super.onCreate();
      
      RePlugin.App.onCreate();
      ....
     }
    
     @Override
     public void onLowMemory() {
      super.onLowMemory();
    
      /* Not need to be called if your application's minSdkVersion > = 14 */
      RePlugin.App.onLowMemory();
      ....
     }
    
     @Override
     public void onTrimMemory(int level) {
      super.onTrimMemory(level);
    
      /* Not need to be called if your application's minSdkVersion > = 14 */
      RePlugin.App.onTrimMemory(level);
      ....
     }
    
     @Override
     public void onConfigurationChanged(Configuration config) {
      super.onConfigurationChanged(config);
    
      /* Not need to be called if your application's minSdkVersion > = 14 */
      RePlugin.App.onConfigurationChanged(config);
      ....
     }
    }

    针对“非继承式”的注意点

    所有方法必须在UI线程来“同步”调用。切勿放到工作线程,或者通过post方法来执行 所有方法必须一一对应,例如 RePlugin.App.attachBaseContext 方法只在Application.attachBaseContext中调用 请将RePlugin.App的调用方法,放在“仅次于super.xxx()”方法的后面

    插件App的配置:

    在根目录下的build.gradle中添加依赖:

     classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.4'

    在App module中的builder.gradle中引入:

    apply plugin: 'replugin-plugin-gradle'

    添加dependencies依赖:

     compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.4'

    4.配置别名信息:

    /*插件名配置*/
    repluginPluginConfig {
     //插件名
     pluginName = "androidgo"
     //宿主app的包名
     hostApplicationId = "com.newdicooker.tempetek.hostreplugin"
     //宿主app的启动activity
     hostAppLauncherActivity = "com.newdicooker.tempetek.hostreplugin.MainActivity"
    }
    

    以上步骤完后才能就是见证奇迹的时刻了:

    宿主调用插件App:

    调用内置插件 调用外置插件

    调用内置插件:

    插件App生成apk,将APK改名为:[插件名].jar 将[插件名].jar放入主程序的Assets/plugins目录下 可通过别名:”

     RePlugin.startActivity(MainActivity.this,
     RePlugin.createIntent("androidgo", "com.newdicooker.tempetek.androidgo.MainActivity"));

    androidgo:是插件App的别名
    com.newdicooker.tempetek.androidgo.MainActivity:要启动App的启动页

    可通过包名来进行访问:

    RePlugin.startActivity(MainActivity.this,
     RePlugin.createIntent("com.newdicooker.tempetek.androidgo", "com.newdicooker.tempetek.androidgo.MainActivity"));

    调用外置插件:通过网络下载插件apk调用RePlugin.install(path)安装;

    通过开启服务来进行异步下载任务的:

    RePlugin.isPluginInstalled("image")是通过别名来判断插件是否安装,如果未安装则下载安装,如果已经安装则直接进入。
     public void jumpToOut(View view) {
      if (RePlugin.isPluginInstalled("image")) {
    RePlugin.startActivity(MainActivity.this,
      RePlugin.createIntent("image", "com.xq.imageplugindemo.MainActivity"));
    return;
      }
    
      // 插件下载地址
      String urlPath = "https://raw.githubusercontent.com/ZhangZeQiao/ImagePluginDemo/7c5866db83b57c455302fac12ea72af30d9a5364/app/src/main/assets/image.apk";
      // 插件下载后的存放路径
      String downloadDir = Environment.getExternalStorageDirectory().getAbsolutePath();
      Intent intent = new Intent(this, DownloadAndUpdateService.class);
      intent.putExtra("urlPath", urlPath);
      intent.putExtra("downloadDir", downloadDir);
      startService(intent);
     }
    

    下载安装:

    public class DownloadAndUpdateService extends IntentService {
    
     public DownloadAndUpdateService() {
      // 实现父类的构造方法,用于命名工作线程,只用于调试。
      super("DownloadAndUpdateService");
     }
    
     @Override
     protected void onHandleIntent(@Nullable Intent intent) {
      // Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务
      // 插件下载地址
      String urlPath = intent.getStringExtra("urlPath");
      // 插件下载后的存放路径
      String downloadDir = intent.getStringExtra("downloadDir");
    
      File file = null;
      try {
    // 统一资源
    URL url = new URL(urlPath);
    // 连接类的父类,抽象类
    URLConnection urlConnection = url.openConnection();
    // http的连接类
    HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
    // 设定请求的方法,默认是GET
    httpURLConnection.setRequestMethod("GET");
    // 设置字符编码
    httpURLConnection.setRequestProperty("Charset", "UTF-8");
    // 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。
    httpURLConnection.connect();
    
    // 文件大小
    int fileLength = httpURLConnection.getContentLength();
    // 文件名
    String filePathUrl = httpURLConnection.getURL().getFile();
    String fileFullName = filePathUrl.substring(filePathUrl.lastIndexOf(File.separatorChar) + 1);
    
    URLConnection con = url.openConnection();
    BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
    
    String path = downloadDir + File.separatorChar + fileFullName;
    file = new File(path);
    if (!file.getParentFile().exists()) {
     file.getParentFile().mkdirs();
    }
    OutputStream out = new FileOutputStream(file);
    int size = 0;
    int len = 0;
    byte[] buf = new byte[1024];
    while ((size = bin.read(buf)) != -1) {
     len += size;
     out.write(buf, 0, size);
     // 下载百分比
     Log.v("xq", "下载了-------> " + len * 100 / fileLength);
    }
    bin.close();
    out.close();
    // 升级安装插件新版本
    RePlugin.install(path);
    Log.v("xq", "下载完成 : " + path);
      } catch (MalformedURLException e) {
    e.printStackTrace();
      } catch (IOException e) {
    e.printStackTrace();
      } finally {
    
      }
     }
    }
    
    点击复制链接 与好友分享!回本站首页
    上一篇:Android开发之广播的基本使用说明
    下一篇:android 获取当前手机的 DHCP 信息ip,server 等操作实例教程
    相关文章
    图文推荐
    点击排行

    关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 神奇公式秒杀全国11选5

    版权所有: 神奇公式秒杀全国11选5--致力于做实用的IT技术学习网站

  • 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06