1. 程式人生 > >android模組化app開發筆記-2外掛間佈局檔案共享

android模組化app開發筆記-2外掛間佈局檔案共享

  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"  這樣外掛間才能找的到(下一章會實現另一種方式外掛間交換類)