android模組化app開發筆記-2外掛間佈局檔案共享
阿新 • • 發佈:2018-12-23
android程式設計時佈局檔案,圖片資源等都是放在同一個資料夾下,這樣照成一個問題就是我們想重用UI佈局檔案和圖片時就還需要其分離這些資料,相信大部分android程式設計師都遇到過這樣的問題,其痛苦程度不亞於世紀末日趕不上諾亞方舟。
今天我用apkplug框架實現將不同的資源放在不同的外掛apk包中,然後通過外掛間類查詢的方式實現外掛機佈局檔案共享。不說廢話了!
一 新建一個外掛myBundle1由它提供佈局檔案供myBundle外掛呼叫
結合上一篇文章本章我再建一個外掛工程myBundle1新增實現3個java類分別是
BundleContextFactory.java 這個類的唯一功能就是儲存外掛啟動時獲取的BundleContext,該類中有我們需要的android.content.Context
public class BundleContextFactory implements BundleInstance{ private static BundleContextFactory _instance=null; private BundleContext mcontext = null; synchronized public static BundleContextFactory getInstance(){ if(_instance==null){ _instance=new BundleContextFactory(); } return _instance; } private BundleContextFactory(){ } public BundleContext getBundleContext() { // TODO Auto-generated method stub return this.mcontext; } public void setBundleContext(BundleContext arg0) { // TODO Auto-generated method stub this.mcontext = arg0; } }
TBSurfaceView.java 一個SurfaceView 用於演示View
myLayout.java 繼承RelativeLayout,通過它外掛myBundle就可以獲取外掛myBundle1的佈局檔案了
public class myLayout extends RelativeLayout{ public myLayout(Context context, AttributeSet attrs) { super(context, attrs); //獲取外掛啟動時得到的Context Context m=BundleContextFactory.getInstance().getBundleContext().getBundleContext(); LayoutInflater mInflater=LayoutInflater.from(context); mInflater = mInflater.cloneInContext(m); mInflater.inflate(R.layout.main11, this, true); } }
佈局檔案 main11.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/tt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是外掛myBundle1" /> <com.example.mybundle1.TBSurfaceView android:layout_below="@+id/tt" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout>
最後外掛myBundle1檔案目錄為
二 修改外掛myBundle佈局檔案activity_main.xml新增View com.example.mybundle1.myLayout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello_world 我是myBundle的Activity" />
<com.example.mybundle1.myLayout
android:layout_below="@+id/tt"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/myLayout1"/>
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:layout_alignBottom="@+id/myLayout1" android:layout_centerHorizontal="true"/>
</RelativeLayout>
三 將兩個編譯好的外掛新增到主應用的assets資料夾中並在PropertyInstance介面的public String[] AutoStart()中新增兩個外掛自動啟動
public String[] AutoStart() {
File f0=null,f1=null;
try {
InputStream in=context.getAssets().open("myBundle.apk");
f0=new File(context.getFilesDir(),"myBundle.apk");
if(!f0.exists())
copy(in, f0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
InputStream in=context.getAssets().open("myBundle1.apk");
f1=new File(context.getFilesDir(),"myBundle1.apk");
if(!f1.exists())
copy(in, f1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new String[]{"file:"+f0.getAbsolutePath(),"file:"+f1.getAbsolutePath()};
}
最後啟動應用檢視效果如圖
最後給出原始碼
注意:1.以上需要注意的問題的是需要引出的類都應該在plugin.xml檔案中新增Export-Package="com.example.mybundle1" 這樣外掛間才能找的到(下一章會實現另一種方式外掛間交換類)