android模块化app开发笔记-2插件间布局文件共享

android编程时布局文件,图片资源等都是放在同一个文件夹下,这样照成一个问题就是我们想重用UI布局文件和图片时就还需要其分离这些资料,相信大部分android程序员都遇到过这样的问题,其痛苦程度不亚于世纪末日赶不上诺亚方舟。

   今天我用apkplug框架实现将不同的资源放在不同的插件apk包中,然后通过插件间类查找的方式实现插件机布局文件共享。不说废话了!

一 新建一个插件myBundle1由它提供布局文件供myBundle插件调用

结合上一篇文章本章我再建一个插件工程myBundle1新增实现3个java类分别是

  BundleContextFactory.java 这个类的唯一功能就是存储插件启动时获取的BundleContext,该类中有我们需要的android.content.Context

[java] view plaincopy
  1. public class BundleContextFactory implements BundleInstance{  
  2. private static BundleContextFactory _instance=null;  
  3.    private BundleContext mcontext = null;  
  4.    synchronized public static BundleContextFactory getInstance(){  
  5.     if(_instance==null){  
  6.     _instance=new BundleContextFactory();  
  7.     }  
  8.     return _instance;  
  9.     }   
  10.     private BundleContextFactory(){  
  11.       
  12.     }  
  13.   
  14.     public BundleContext getBundleContext() {  
  15.         // TODO Auto-generated method stub  
  16.         return this.mcontext;  
  17.     }  
  18.     public void setBundleContext(BundleContext arg0) {  
  19.         // TODO Auto-generated method stub  
  20.         this.mcontext = arg0;  
  21.     }  
  22.   
  23. }  

TBSurfaceView.java 一个SurfaceView 用于演示View

myLayout.java 继承RelativeLayout,通过它插件myBundle就可以获取插件myBundle1的布局文件了

[java] view plaincopy
  1. public class myLayout extends RelativeLayout{  
  2.   
  3.     public myLayout(Context context, AttributeSet attrs) {  
  4.         super(context, attrs);  
  5.         //获取插件启动时得到的Context  
  6.         Context m=BundleContextFactory.getInstance().getBundleContext().getBundleContext();  
  7.         LayoutInflater mInflater=LayoutInflater.from(context);  
  8.         mInflater = mInflater.cloneInContext(m);   
  9.         mInflater.inflate(R.layout.main11, thistrue);    
  10.     }  
  11. }  

布局文件 main11.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <TextView  
  12.         android:id="@+id/tt"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="我是插件myBundle1" />  
  16.  <com.example.mybundle1.TBSurfaceView  
  17.          android:layout_below="@+id/tt"  
  18.          android:layout_width="fill_parent"  
  19.         android:layout_height="fill_parent"  
  20.         />  
  21. </RelativeLayout>  

最后插件myBundle1文件目录为

android模块化app开发笔记-2插件间布局文件共享

 

二 修改插件myBundle布局文件activity_main.xml添加View com.example.mybundle1.myLayout

 

[java] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <TextView  
  12.         android:id="@+id/tt"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="hello_world 我是myBundle的Activity" />  
  16.  <com.example.mybundle1.myLayout  
  17.      android:layout_below="@+id/tt"  
  18.          android:layout_width="fill_parent"  
  19.         android:layout_height="fill_parent"  
  20.         android:id="@+id/myLayout1"/>  
  21.  <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"/>  
  22. </RelativeLayout>  

三 将两个编译好的插件添加到主应用的assets文件夹中并在PropertyInstance接口的public String[] AutoStart()中添加两个插件自动启动

[java] view plaincopy
  1. public String[] AutoStart() {  
  2.         File f0=null,f1=null;  
  3.         try {  
  4.             InputStream in=context.getAssets().open("myBundle.apk");  
  5.             f0=new File(context.getFilesDir(),"myBundle.apk");  
  6.             if(!f0.exists())  
  7.              copy(in, f0);  
  8.         } catch (IOException e) {  
  9.             // TODO Auto-generated catch block  
  10.             e.printStackTrace();  
  11.         }  
  12.         try {  
  13.             InputStream in=context.getAssets().open("myBundle1.apk");  
  14.             f1=new File(context.getFilesDir(),"myBundle1.apk");  
  15.             if(!f1.exists())  
  16.              copy(in, f1);  
  17.         } catch (IOException e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.         }  
  21.     return new String[]{"file:"+f0.getAbsolutePath(),"file:"+f1.getAbsolutePath()};  
  22.     }  

最后启动应用查看效果如图

 android模块化app开发笔记-2插件间布局文件共享

最后给出源码

注意:1.以上需要注意的问题的是需要引出的类都应该在plugin.xml文件中添加Export-Package="com.example.mybundle1"  这样插件间才能找的到(下一章会实现另一种方式插件间交换类)

       2.apkplug官网为:www.apkplug.com

android模块化app开发笔记-2插件间布局文件共享,布布扣,bubuko.com

android模块化app开发笔记-2插件间布局文件共享

上一篇:IOS - SDWebImage 非ARC 问题


下一篇:android基础入门AcitonBar使用(7)