【转】 Pro Android学习笔记(八六):了解Package(5):使用lib
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/
在上一次学习中,我们创建的lib项目TestLib,本次学习,我们将学习如何在项目中调用lib。我们创新了一个普通的App项目,名字为TestUseLib。
在项目中使用lib
要在项目中使用lib,需要加入lib。在Eclipse中点击项目名按右键,选择Properties,将lib项目加入,如图所示,我们加入了之前创建的lib:TestLib。

源代码
package cn.flowingflying.androidtest.testuselib;
import cn.flowingflying.androidtest.testlib.*; //为调用lib的类而加入
……
public class MainActivity extends Activity {
… …
/* 下面实现按某菜单,调用来自lib的Acitivity,在代码上和普通调用没有区别 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.menu_library_activity){
invokeLibActivity();
return true;
}
return super.onOptionsItemSelected(item);
}
private void invokeLibActivity(){
Intent intent = new Intent(this,TestLibActivity.class);
startActivity(intent);
}
}
了解一些机制
我们来看看TestUseLib项目结构,发现在Android Dependencies中引入了testlib.jar,这说明不是将lib项目的源代码直接引入,而是将lib项目编译成jar包引用,这样,每次App项目编译时,就无需重新编译lib的源代码,加快了编译速度。

但是,使用jar包方式也会引发一些问题。在App项目中R.java的资源id是public staticfinal int。如果lib项目也是如此,那么在编译成jar的时候,具体的int的数字会编译进去,就有可能导致App项目和lib项目中资源id的数值相同,而Android项目要求资源Id都是唯一的。为了解决这个问题,lib项目的资源id是public static int,没有final,在编译成jar包时,并没有包含这个R.class,在使用时,相关的数值依赖于App项目中重写的该lib包的R.java。
在lib项目中,由于资源id不再是常量,在lib项目中我们就不能使用如下的代码:
// 下面是错误的,因为在lib中资源ID不是一个常量,不能在case中使用
switch(item.getItemId()){
case R.id.menu_clear: //编译出错
……
break;
default:
break;
}
在App项目中,重写Lib项目的R.java,而这个新的R.java中资源id是public staticfinal int,也就是在App项目中,可以使用上述的代码。
在lib和app项目中,可能会出现资源名字冲突,例如,在lib和app项目都分别对TextView命名为R.id.text1,这是没有问题的,因为他们分属于不同包,有package namespace进行了区分,实际名字分别是<lib-package-name>.R.id.text1和<app-package-name>.R.id.text1。在编译过程中,app的优先于lib的,如果要用lib的,可以在前面加上包名,给出完整名字。当然为了避免错误引用,作为lib项目,应该在资源命名时有所区别,包括layout文件名,xml文件名,例如定义为R.id.lib_text1,R.id.testlib_text1。
相关小例子源代码可在Pro Android学习:了解package的小例子中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(八六):了解Package(5):使用lib的更多相关文章
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST
目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...
- 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart
目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...
- 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限
目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID ...
- 【转】 Pro Android学习笔记(六三):Preferences(7):代码控制首选项
[-] 代码实现preference 利用preference保存状态 DialogPreference 代码实现preference View可以不通过xml进行设置,有代码直接进行设置,首选项pr ...
- 【转】 Pro Android学习笔记(六二):Preferences(6):header
目录(?)[-] 代码实现 header xml文件 在前面的例子,我们主要学习了PreferenceScreen的xml如何写,preference有哪些类型.在代码中,我们为了不提示warning ...
- 【转】 Pro Android学习笔记(六十):Preferences(4):MultiSelect List Preference
目录(?)[-] XML文件 在设备中保存 读出信息 ListPreference提供单选列表,我们可以通过CheckBoxPreference提供多选列表.此外,Android在3.0后提供Mult ...
- 【转】 Pro Android学习笔记(六四):安全和权限(1):签发apk
目录(?)[-] Android安全模型 数字证书签发 Debug的keystore 生产unsigned的apk 为apk进行证书签发 align安装包 使用Export Wizard生成签发的ap ...
- 【转】Pro Android学习笔记(六):了解Content Provider(中)
Content Provider的架构 Authority类似web中的域名,每个content provider会通过AndroidManifest.xml向系统注册authority,如下.其中n ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
随机推荐
- INSPIRED启示录 读书笔记 - 第10章 管理上司
十条经验 1.为项目波动做好准备:用项目波动代指让你心烦意乱的各种返工.计划变更.不要企图消灭项目波动,但是可以尽量降低其负面影响.方法是提高警惕,记录工作进度,掌握项目波动的规律,寻找对策.制订项目 ...
- iptables DNAT、SNAT和MASQUERATE
MASQUERADE 地址伪装,和SNAT功能一样,只不过SNAT使用固定IP地址,MASQUERADE使用网卡上的地址. SNAT配置: iptables -t nat -A POSTROUTING ...
- linux设置系统时间与时区以及设置bios时间同步系统时间
有装过Linux系统的人,可能都会有这样的经历,就是该机器安装windows系统时,时间正确,但是安装了linux系统后,尽管时区选择正确,也会发现系统时间不对.这是由于安装系统时采用了UTC,那么什 ...
- Luogu-2495 [SDOI2011]消耗战
虚树第一题 对于每次询问的点建立一棵虚树,然后在树上DP,一个点的答案就是这个点的父边切断的代价与所有儿子切断的代价去最小值,当然如果这个节点是资源点则必须切父边 注意在虚树上一条边的代价应该是中间所 ...
- C#反射第一天
[转]C#反射 反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等. ...
- Spring AOP的一个比喻和IOC的作用
aop切面编程就是在常规的执行java类中方法前或执行后加入自定义的方法.比如你本来每天都去打酱油,去,打酱油,回.现在我每天在你打酱油路上等着,你去打酱油的时候我打你一顿,回来的时候给你点糖果吃.你 ...
- Spring Boot 注释
1.@RestController@RestController ≍ @Controller + @ResponseBody在Controller文件 public class xxxx 前面加用于返 ...
- EXCEL中,怎样查看一个工作簿中有几个工作表?
EXCEL中,怎样查看一个工作簿中有几个工作表 有几个EXCEL文件,每个文件(工作簿)中都有上百个工作表, 怎样可以一次性查看一个簿包含几个表? 目前好像没有直接可以看到有多少张工作表的按钮,这就需 ...
- Codeforces 859E Desk Disorder:并查集【两个属性二选一】
题目链接:http://codeforces.com/problemset/problem/859/E 题意: 有n个人,2n个座位. 给出这n个人初始的座位,和他们想坐的座位. 每个人要么坐在原来的 ...
- ES6 类(Class)基本用法和静态属性+方法详解
原文地址:http://blog.csdn.net/pcaxb/article/details/53759637 ES6 类(Class)基本用法和静态属性+方法详解 JavaScript语言的传统方 ...