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