在开发java工程时,一个项目可能分为多个模块,为了实现模块间的解耦和独立,提高模块的复用性,通常将项目按模块分为多个java工程进行开发,最后通过jar包等工程依赖的方式实现系统集成,提高模块的耦合和复用。

  现在开发Android项目通过实践和总结,发现这种方式特别有必要,比如开发一个android端的视频播放功能,肯定有播放和下载模块,如果不分开放在一个工程里面不断的添加新的功能,产品的每一个研发都不断的添加修改功能,最后维护越来越难,bug越来越多,并相互推诿,这种方式能避免这种情况,此为有点一。其二呢,下载模块是很多APP都会用到的模块,将其独立出来不断的完善和优化,可以变成一个组件给不同的APP使用,这就提高了模块的代码的解耦,提高的复用性,提高的工作效率,好处大大的哦。

  由于Android的特殊性,android不仅有java文件还有res文件,需要研究如何将资源文件以及Activity文件打包成jar文件供其他项目调用,最终多方尝试,找到如下两种解决方案。

方案一:

根据Android的官方文档,将其中一个项目设置为引用库,在另一个项目中添加这个库的引用。
注意将libary project中的activity在target project 中的 Manifest.xml
中声明一下。

方案二:

通过导出JAR包的方式供给其他项目去引用,没有资源包就不多说了直接导出jar包就可以直接引用,下面说一下在有资源包存在的时候打包Jar及引用方式。

实现步骤:

1.MResource这个类很重要,主要是它的作用,利用反射根据资源名字获取资源ID(其实系统也自带了根据资源名字获取资源ID的方法getResources().getIdentifier(“main_activity”, “layout”, getPackageName());第一个参数是资源的名字,第二个参数是资源的类型,例如layout, string等,第三个是包名字)

MRsource.java代码如下:

package com.example.testjar;
import android.content.Context;
/**
* 根据资源的名字获取其ID值
*
* @author yangzy
*/
public class MResource {
public static int getIdByName(Context context, String className, String name) {
String packageName = context.getPackageName();
Class r = null;
int id = 0;
try {
r = Class.forName(packageName + ".R");
Class[] classes = r.getClasses();
Class desireClass = null;
for (int i = 0; i < classes.length; ++i) {
if (classes[i].getName().split("\\$")[1].equals(className)) {
desireClass = classes[i];
break;
}
}
if (desireClass != null)
id = desireClass.getField(name).getInt(desireClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return id;
}
}

2.以特定的方式使用引用需要使用R的地方

public class TestUtilJar extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(****MResource.getIdByName(getApplication(), "layout", "jar_activity_main")****);      }}

3.将将以Jar包形式导出,除去一切资源文件,只导出源码(Eclipse中的操作步骤如下)



4.将导出的jar包copy 到target project的libs文件夹下,加入到build path,并且在Java Build Path中的Order and Export 将添加的jar包,打上√。
5.将Libary Project中引用到的资源文件全部拷贝到Target Project中去,这样就可以顺利的引用资源文件了,还有要用到Jar包中的Activity也需要再Target Project中的AndroidManifest.xml配置对应包名的Activity。
6.然后就可以向应用本地文件一样,引用jar中的文件了。

转载地址:[http://www.devnote.cn/article/266.html](http://www.devnote.cn/article/266.html)

更多相关文章

  1. 让你“过五关,斩六将”轻松入大厂。类比于微信,如何对Apk进行极限
  2. Android应用瘦身,从18MB到12.5MB
  3. 第三部分:Android(安卓)应用程序接口指南---第三节:应用程序资源--
  4. 别再抱怨了,国内这么多优秀的Android资源你都知道吗?
  5. Android一种实现夜间模式方式,同时解决调用recreate() 时闪屏问题
  6. 【Android7.1.2源码解析系列】Android编译系统翻译------Android
  7. Android(安卓)内容提供器---创建内容提供器(设计内容资源标识(URI))
  8. Assets 与 Res android的两大资源的获取 与android studio中asse
  9. [置顶] android 程序开发的插件化 模块化方法 之二

随机推荐

  1. Android学习札记18:Drawable中的setDither
  2. Android的BUG(三) - 广为人知的诟病:频繁重
  3. Android: MimeType in Android
  4. Android实现弹出Toast提示
  5. Android内核和驱动篇-Android内核介绍
  6. Android中ListView以及数组适配器(ArrayA
  7. android情景模式切换的实现
  8. Android的BUG(三) - 广为人知的诟病:频繁重
  9. 直播软件源码android ui LinearLayout中
  10. eclipse android基础开发