【转】 Pro Android学习笔记(八六):了解Package(5):使用lib

时间:2022-03-15 01:47:42

目录(?)[-]

  1. 在项目中使用lib
  2. 源代码
  3. 了解一些机制

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/

在上一次学习中,我们创建的lib项目TestLib,本次学习,我们将学习如何在项目中调用lib。我们创新了一个普通的App项目,名字为TestUseLib。

在项目中使用lib

要在项目中使用lib,需要加入lib。在Eclipse中点击项目名按右键,选择Properties,将lib项目加入,如图所示,我们加入了之前创建的lib:TestLib。

【转】 Pro Android学习笔记(八六):了解Package(5):使用lib

源代码

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的源代码,加快了编译速度。

【转】 Pro Android学习笔记(八六):了解Package(5):使用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的更多相关文章

  1. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  2. 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST

    目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...

  3. 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

    目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...

  4. 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限

    目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID ...

  5. 【转】 Pro Android学习笔记(六三):Preferences(7):代码控制首选项

    [-] 代码实现preference 利用preference保存状态 DialogPreference 代码实现preference View可以不通过xml进行设置,有代码直接进行设置,首选项pr ...

  6. 【转】 Pro Android学习笔记(六二):Preferences(6):header

    目录(?)[-] 代码实现 header xml文件 在前面的例子,我们主要学习了PreferenceScreen的xml如何写,preference有哪些类型.在代码中,我们为了不提示warning ...

  7. 【转】 Pro Android学习笔记(六十):Preferences(4):MultiSelect List Preference

    目录(?)[-] XML文件 在设备中保存 读出信息 ListPreference提供单选列表,我们可以通过CheckBoxPreference提供多选列表.此外,Android在3.0后提供Mult ...

  8. 【转】 Pro Android学习笔记(*):安全和权限(1):签发apk

    目录(?)[-] Android安全模型 数字证书签发 Debug的keystore 生产unsigned的apk 为apk进行证书签发 align安装包 使用Export Wizard生成签发的ap ...

  9. 【转】Pro Android学习笔记(六):了解Content Provider(中)

    Content Provider的架构 Authority类似web中的域名,每个content provider会通过AndroidManifest.xml向系统注册authority,如下.其中n ...

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

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

随机推荐

  1. MySQL 新装数据库不能链接解决方法

    在my.ini的[mysqld]字段加入: skip-grant-tables 重启mysql服务,这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; ...

  2. for循环的时候是按照数字递增会造成一些元素被遗漏

    $test_array=array(1,2,3,4,4,5,5,6); $test_array_unique=array_unique($test_array); print_r($test_arra ...

  3. 数据结构(线段树):CodeForces 145E Lucky Queries

    E. Lucky Queries time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...

  4. Z&period;ExtensionMethods 扩展类库

    Z.ExtensionMethods 一个强大的开源扩展库 今天有意的在博客园里面搜索了一下 Z.ExtensionMethods 这个扩展类库,确发现只搜到跟这个真正相关的才两篇博文而已,我都点进去 ...

  5. windows PAE扩展和AWE编程

    在32位windows上只能看到最大3GB的内存空间,而且每个应用程序只能访问4GB的的内存,这个限制是windows独有的,为了使程序能够访问大于4GB的内存空间,需要使用AWE编程接口,同时需要开 ...

  6. SQLServer图数据库一些优点

    上一篇简要介绍了图数据库的一些基本内容(初识SQL Server2017 图数据库(一)),本篇通过对比关系型一些语法来体现图数据库模式的一些优点,比如查询方便,语句易理解等. 在图数据库模型上构建查 ...

  7. sql语句1——join

    注:一下内容来自于http://www.w3school.com.cn/sql/ 1. 引用两个表 我们可以通过引用两个表的方式,从两个表中获取数据: 谁订购了产品,并且他们订购了什么产品? sele ...

  8. 阿里云Centos6&period;9安装图形化界面

    yum -y groupinstall "X Window System" "Chinese Support" "Desktop"

  9. 813&period; Largest Sum of Averages

    We partition a row of numbers A into at most K adjacent (non-empty) groups, then our score is the su ...

  10. 关于numpy mean函数的axis参数

    import numpy as np X = np.array([[1, 2], [4, 5], [7, 8]]) print np.mean(X, axis=0, keepdims=True) pr ...