<dl id="opymh"></dl>

<div id="opymh"></div>
      <div id="opymh"><tr id="opymh"></tr></div>

        <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

        <em id="opymh"></em>

        <em id="opymh"><ol id="opymh"></ol></em>

              頻道欄目
              首頁 > 程序開發 > 移動開發 > Android > 正文
              Android 插件化,qihoo360插件方案配置教程
              2018-07-30 14:14:19         來源:再也不做的事  
              收藏   我要投稿

              Android 插件化,qihoo360插件方案

              目錄

              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即可。或者您也可以用“非繼承式”接入。

              public class MainApplication extends RePluginApplication {
              }

              既然聲明了Application,自然還需要在AndroidManifest中配置這個Application

               

              備選:“非繼承式”配置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技術培訓 | 舉報中心

              版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

              极速飞艇好假
              <dl id="opymh"></dl>

              <div id="opymh"></div>
                  <div id="opymh"><tr id="opymh"></tr></div>

                    <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                    <em id="opymh"></em>

                    <em id="opymh"><ol id="opymh"></ol></em>

                          <dl id="opymh"></dl>

                          <div id="opymh"></div>
                              <div id="opymh"><tr id="opymh"></tr></div>

                                <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                                <em id="opymh"></em>

                                <em id="opymh"><ol id="opymh"></ol></em>