Android外掛程式化開發之OpenAtlas外掛程式啟動方式與外掛程式啟動廣播

來源:互聯網
上載者:User

標籤:android   openatlas   外掛程式化   啟動方式   啟動廣播   

到現在為止已經寫了6篇文章了

  • Android外掛程式化開發之OpenAtlas初體驗
  • Android外掛程式化開發之OpenAtlas產生外掛程式資訊列表
  • Android外掛程式化開發之OpenAtlas資源打包工具補丁aapt的編譯
  • Android外掛程式化開發之OpenAtlas外掛程式適配
  • Android外掛程式化開發之解決OpenAtlas組件在宿主的註冊問題
  • Android外掛程式化開發之OpenAtlas中四大組件與Application功能的驗證

這篇文章主要介紹一下OpenAtlas外掛程式的幾種啟動方式,在AtlasConfig這個類中,有幾個靜態字串數組

public class AtlasConfig {    public static String[] DELAY = new String[]{};    public static String[] AUTO = new String[]{};    public static String[] STORE = new String[]{};}

也就是OpenAtlas的外掛程式的啟動的三種方式,DELAY 為延時載入,即用到的時候才會去載入。AUTO 為隨宿主啟動而啟動,而STORE看名字還不知道他的啟動方式是怎麼樣的。我們看下什麼地方引用了它,其實整個架構中就兩個函數引用了它,在OptDexProcess類中

/**** 對已安裝並且安裝方式為STORE的Bundle進行dexopt操作 ****/    private void optStoreDex() {        for (Bundle bundle : Atlas.getInstance().getBundles()) {            if (!(bundle == null || contains(AtlasConfig.STORE, bundle.getLocation()))) {                try {                    ((BundleImpl) bundle).optDexFile();                    Log.e("OptDexProcess", "optStoreDex");                } catch (Throwable e) {                    if (e instanceof DexLoadException) {                        throw ((RuntimeException) e);                    }                    Log.e("OptDexProcess", "Error while dexopt >>>", e);                }            }        }    }    /**** 對全部安裝方式為Store的Bundle進行dexopt操作 ***/    private void optStoreDex2() {        for (String bundle : AtlasConfig.STORE) {            Bundle bundle2 = Atlas.getInstance().getBundle(bundle);            if (bundle2 != null) {                try {                    ((BundleImpl) bundle2).optDexFile();                    Log.e("OptDexProcess", "optStoreDex2");                } catch (Throwable e) {                    if (e instanceof DexLoadException) {                        throw ((RuntimeException) e);                    }                    Log.e("OptDexProcess", "Error while dexopt >>>", e);                }            }        }    }

看函數好像是對dex繼續最佳化。

在Android系統中,一個App的所有代碼都在一個Dex檔案裡面。Dex是一個類似Jar的存
儲了多有Java編譯位元組碼的歸檔檔案。因為Android系統使用Dalvik虛擬機器,所以需要把
使用Java Compiler編譯之後的class檔案轉換成Dalvik能夠執行的class檔案。這裡需要強
調的是,Dex和Jar一樣是一個歸檔檔案,裡面仍然是Java代碼對應的位元組碼檔案。
當Android系統啟動一個應用的時候,有一步是對Dex進行最佳化,這個過程有一個專門的
工具來處理,叫DexOpt。DexOpt的執行過程是在第一次載入Dex檔案的時候執行的。這
個過程會產生一個ODEX檔案,即Optimised Dex。執行ODex的效率會比直接執行Dex文
件的效率要高很多。

但是呢,我在裡面加入了日誌,看輸出,仍然看不到其輸出,只有隨宿主啟動的才會進行odex最佳化,配置了STORE,也看不到最佳化的日誌輸出,這裡姑且不去理會,也可能是我使用的方式不對,一般我們使用DELAY或者AUTO即可。我們對之前的幾個外掛程式進行配置。讓test隨宿主啟動,讓zxing延時載入,其他幾個為STORE(其實在效果上和DELAY差不多,只不過可能內部真的進行了odex最佳化,然而我看不到日誌輸出而已),配置的位置呢,在我們宿主的Applictaion中即可,使用靜態代碼塊。

public class BootApp extends AtlasApp {    static{        AtlasConfig.DELAY = new String[]{"com.lizhangqu.zxing"};        AtlasConfig.AUTO = new String[]{"com.lizhangqu.test"};        AtlasConfig.STORE = new String[]{"com.lizhangqu.fragment","com.lizhangqu.component"};    }    @Override    public void onCreate() {        super.onCreate();    }}

下面的外掛程式啟動的日誌輸出。隨宿主啟動的外掛程式

延時載入的外掛程式,只要啟動了它才會被載入。


還有一個重要的問題就是外掛程式如果隨宿主啟動,我們要知道外掛程式是否安裝成功。安裝成功後進行頁面跳轉。而外掛程式只需要安裝一次,安裝完後就可直接啟動了。這裡OpenAtlas提供了一個廣播,當外掛程式安裝完成後會廣播該訊息。我們註冊該廣播即可。

public class BootActivity extends Activity {    private BundlesInstallBroadcastReceiver atlasBroadCast;    private class BundlesInstallBroadcastReceiver extends BroadcastReceiver {        private BundlesInstallBroadcastReceiver() {        }        @Override        public void onReceive(Context context, Intent intent) {            try {                startActivity(new Intent(BootActivity.this,MainActivity.class));                BootActivity.this.finish();                Log.e("TAG","BundlesInstallBroadcastReceiver,the bundle has install");            } catch (Exception e) {            }        }    }    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_boot);        if ("false".equals(System.getProperty("BUNDLES_INSTALLED", "false"))) {            this.atlasBroadCast = new BundlesInstallBroadcastReceiver();            registerReceiver(this.atlasBroadCast, new IntentFilter(PlatformConfigure.ACTION_BROADCAST_BUNDLES_INSTALLED));        }else{            startActivity(new Intent(BootActivity.this,MainActivity.class));            BootActivity.this.finish();        }    }}

就這樣,可以監聽到外掛程式的安裝,當時該廣播只有安裝外掛程式的時候會廣播,安裝成功後之後就不會再進行廣播了,使用的時候注意一下就好了。

原始碼,就不傳csdn,放在github上,有興趣的clone下來看看就好了。

  • https://github.com/lizhangqu/OpenAtlasDemo

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android外掛程式化開發之OpenAtlas外掛程式啟動方式與外掛程式啟動廣播

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.