一、将整个项目作为资源文件

1、需要将被应用的项目设置为库项目。

2、将该项目的配置文件中的四大组件清空,例如下面代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.baidu.cn"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <application
android:icon="@drawable/icon"
android:label="@string/app_name" >
</application> </manifest>

3、将四大组件的内容移动到主项目的配置文件中,将assets目录 libs目录下的文件也要移动过去。
4、在被引用的项目作为库项目导入到主项目中,通过 " 右键-》属性-》android-》add "就可以导入。如果被导入的项目也依赖其他库项目,那么该项目不需要导入其他库项目,将所以的库项目放到主项目中去。

5、注意事项:

  5.1、库项目和主项目需要最好放在同一个工作空间下,不用从其他工作空间引用,否则上面显示的库项目有个红叉。

  5.2、库项目不能在有自己定义的Application,可以将数据保存到单例类里面。

  5.3、启动activity时,还是在库项目中启动,这是主项目只需要传递上下文对象和基本参数信息即可。就不会出现找不到activity的错误。

二、将项目打成jar包

  将项目1的src(后台源码)目录下的文件打成jar包,重新建立一个项目2,然后将刚打成的jar包拷贝到项目2libs目录下,将项目1所有的资源文件(比如drawable,values,layout等资源目录)拷贝到项目2对应的目录下,将项目2作为资源文件就可以引入到其他项目中了,这样的好处是不对外暴露源码。

  有两种方式完成后台代码与前端文件映射:

  1、通过反射 

public class MResource {
private static final String TAG = "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) {
Log.i(TAG, ": "+classes[i].getName());
if (classes[i].getName().split("\\$")[1].equals(className)) {
desireClass = classes[i];
break;
}
}
Log.i(TAG, ": "+desireClass.getName());
if (desireClass != null)
id = desireClass.getField(name).getInt(desireClass);
Log.i(TAG, "ID : "+desireClass.getName());
} catch (Exception e) {
e.printStackTrace();
}
return id;
}
}

  2、简单映射

  2.1、需要将项目2的R文件映射

public class ResourceMap {
public static final int getAnim_alpha_show=R.anim.alpha_show;
public static final int getAnim_translate_left_out=R.anim.translate_left_out;
public static final int getAnim_translate_right_in=R.anim.translate_right_in;
public static final int getArray_payment_moneys=R.array.payment_moneys;
public static final int getArray_payment_moneys_text=R.array.payment_moneys_text;
public static final int getArray_payment_types=R.array.payment_types;
public static final int getColor_backgroundcolor=R.color.backgroundcolor;
public static final int getColor_black=R.color.black;
public static final int getColor_blue=R.color.blue;
public static final int getColor_daoju_color=R.color.daoju_color;
public static final int getColor_gray=R.color.gray;

  2.2、将项目2引入到项目1中,将类似R.color.gray替换成getColor_gray。可以通过搜索R.color.然后将其替换成ResourceMap.getColor_就可以了,同理drawable,anim,id,string都是一样。将项目1下的src(只打包src目录下的文件)打成jar包。

  2.3、将项目2作为资源文件。

  2.4、将R文件转换成ResourceMap的代码:其中RFile.java文件就是将项目2(与项目1的R文件是相同的,除非在项目2中增加其他额外信息)中的R.java文件内容拷贝其中。需要新建一个Java Project。

package com.example.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader; public class ParseRFile { private static String filePath; public static void main(String[] args) throws Exception { //public static int getId_imageView1 = R.id.imageView1; File file = new File("src/RFile.java");
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("public class ResourceMap {\n"); BufferedReader reader = new BufferedReader(new FileReader(file));
String lineStr = null;
System.out.println("start...");
String className = null;
while ((lineStr = reader.readLine()) != null) {
lineStr = lineStr.trim();
if (lineStr.contains("public static final class")) {
className = lineStr.split(" ")[4];
}
if (lineStr.contains("public static final int")) {
String[] words = lineStr.split(" ");
String filed =words[4].split("=")[0];
stringBuffer.append("\tpublic static final int get"+firstWordUpper(className)+"_"+filed+"="+"R."+className+"."+filed+";\n");
} }
filePath = file.getAbsolutePath();
stringBuffer.append("}");
reader.close(); createFile(stringBuffer.toString()); System.out.println(filePath);
System.out.println("end ..."); } /**
* 首字母大写
* @param word
* @return
*/
public static String firstWordUpper(String word){
String first = word.substring(0, 1).toUpperCase();
String subStr = word.substring(1,word.length());
return first + subStr;
}
/**
* 创建资源文件
* @param source
*/
public static void createFile(String source){
try {
File file = new File("D:/project2/ZJava/src/ResourceMap.java");
if (file.exists()) {
file.delete();
}
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
out.write(source.getBytes(), 0, source.length());
out.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

Android学习笔记_71_Android 多个项目之间如何引用 项目怎样打jar包的更多相关文章

  1. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  2. 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享

    目录(?)[-] 共享User ID的设置 共享资源例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...

  3. 10月9日Android学习笔记:活动与服务之间的通信

    最近在照着<第一行代码>这本书来学安卓,顺便记下笔记.主要的内容是Android中服务的第二种启动方式,通过活动绑定服务来启动服务,实现活动与服务之间的通信. 一. 首先创建一个服务类 p ...

  4. 【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程

    目录(?)[-] 类比例子 数字签名 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在W ...

  5. maven权威指南学习笔记(三)——一个简单的maven项目

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  6. 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

    目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...

  7. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  8. udacity android 学习笔记: lesson 4 part b

    udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  9. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

随机推荐

  1. MYSQL系列-MYSQL基础增强(Myql函数)

    MYSQL基础增强(Myql函数) 在这里只介绍一些常用的,比较新颖的: 字符串函数: CONCAT://字符串连接函数 mysql> SELECT CONCAT('My', 'S', 'QL' ...

  2. nyoj 139——我排第几个|| nyoj 143——第几是谁? 康托展开与逆康托展开

    讲解康托展开与逆康托展开.http://wenku.baidu.com/view/55ebccee4afe04a1b071deaf.html #include<bits/stdc++.h> ...

  3. 数据库中存放着HTML并附带样式,如何在界面上对已有的样式进行修改

    在工作中遇到这样一个问题,数据库中存放着HTML代码,并且还带有样式,我要在界面上修改他已经写好的样式,例如把这个字段的字体改成微软雅黑,数据库中对应字段内容如下图 在界面面上是直接把上图这段HTML ...

  4. Servlet中listener(监听器)和filter的总结

    Listener 我是这样理解他的,他是一种观察者模式的实现:我们在 web.xml 中配置 listener 的时候就是把一个被观察者放入的观察者的观察对象队列中,当被观察者触发了注册事件时观察者作 ...

  5. HTML表单特别效果—音量调节,购物数量

    <form oninput="x.value=parseInt(a.value)+parseInt(b.value)">0<input type="ra ...

  6. JS构造函数(便于理解,简易)

    * 构造函数: * 1.构造函数的函数名最好首字母大写(否则 WebStorm 编辑器会提示报错) * 2.自己的对象多次被复制 * 3.构造函数里可以创建公有属性.公有方法.私有属性和私有方法 * ...

  7. PHP基础--两个数组相加

    在PHP中,当两个数组相加时,会把第二个数组的取值添加到第一个数组上,同时覆盖掉下标相同的值: <?php $a = array("a" => "apple& ...

  8. phpunit 单元测试之代码覆盖率

    最近团队在不断完善项目中的单元测试用例,会用到代码覆盖率分析,本来以为 homestead 应该默认安装了 xdebug ,所以使用 phpunit --coverage-html ./tests/c ...

  9. github 专案介绍 – Python 范例:透过互动式的 Jupyter 和数学解释流行的机器学习演算法

    对于机器学习有兴趣,不少人应该会先从 Andrew Ng ( 吴恩达 ) 的机器学习课程开始,但是吴恩达的课程是使用 octave 这个工具当作练习.这个 github 项目包含使用 Python 实 ...

  10. JS教程之实现加载图片时百分比进度

    思路:思路其实很简单,ajax执行时,会生成一个event对象,其中会包含要加载的文件的大小和当前已经加载完成部分的大小,通过这两个值即可计算出百分比 事件介绍onprogress 当浏览器正在加载媒 ...