android模塊化app開發筆記-2插件間佈局文件共享

android編程時佈局文件,圖片資源等都是放在同一個文件夾下,這樣照成一個問題就是咱們想重用UI佈局文件和圖片時就還須要其分離這些資料,相信大部分android程序員都遇到過這樣的問題,其痛苦程度不亞於世紀末日趕不上諾亞方舟。 java

   今天我用apkplug框架實現將不一樣的資源放在不一樣的插件apk包中,而後經過插件間類查找的方式實現插件機佈局文件共享。不說廢話了! android

一 新建一個插件myBundle1由它提供佈局文件供myBundle插件調用 程序員

結合上一篇文章本章我再建一個插件工程myBundle1新增實現3個java類分別是 編程

  BundleContextFactory.java 這個類的惟一功能就是存儲插件啓動時獲取的BundleContext,該類中有咱們須要的android.content.Context app

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 this

<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文件目錄爲 spa

 

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

       2.apkplug官網爲:www.apkplug.com

相關文章
相關標籤/搜索