开发中经常会使用第三方提供的jar,这些jar包中封装很多实用的功能。比如图形处理的UIL、Picasso、Glide,网络处理的Http-ok等,那我们如何为其他人提供一个jar包呢?
可能很多人会觉得那是一个非常简单的事,真的如此吗?如果仅仅是工具类功能的jar包,或许它真的是一件很简单的事,但如果我们需要向其他人提供图片、界面、自定义图形等功能呢?
这篇文章的目的就是来解决这类问题
1、一个简单的jar包
1) 生成jar包
编写一个测试用的工具类
打jar包:右键工程-->export-->jar file-->选择src-->finish
会在选择的位置生成一个后缀为.jar的文件
2) 在其他应用中使用jar包
1) 将生成的test.jar文件拷贝到要使用这个jar包的工程的libs目录下
2) 使用jar包提供的功能
Logcat输出:
2、带资源的jar包
注意事项1:jar包中所有资源不可直接通过R.XXX.XXX方式获取,需要通过 context.getResources().getIdentifier(String,String,String)方式
注意事项2:jar包工程和使用他的工程中,不可有同名的文件及资源id等,如图片名称、控件id等
1) jar包示例
在jar包工程中增加一个布局文件activity_main_jar.xml,如下
在java文件中通过如下方式使用布局及控件
打jar包:右键工程-->export-->jar file-->选择src-->finish
2) 其他应用使用jar包
将test.jar拷贝到第三方应用的libs目录下,将activity_main_jar.xml文件拷贝到layout下,合并string、dimen等文件。
注意:jar包中的四大组件,均需要在第三方应用的资源清单中注册才可以使用。
调用:
3、资源id为一个数组的jar包
1)自定义属性
为了生成一个数组形式的id,我们来自定义一个属性,在自定义控件中使用
在res/values文件下定义一个attrs.xml文件,代码如下:
自定义MyView:
在布局文件中使用自定义View
运行程序后logcat输出为:
R.java
2) 在自己的工程中可以像上面那样自定义View和属性,但是如果我们的工程需要提供给其他人使用,那么上面在自定义View获取控件id方法便不能用了,因为在我们生成jar包时,R.XXX.XXX形式获取到的id为编译后的一个int型,但是这个值在第三方应用编译时会改变。如果像上面那种方式使用,会抛出找不到资源的异常。
而R.styleable.MyAttrs返回的是一个数组,上面介绍的使用context.getResources().getIdentifier方式只能返回一个int型,所以为了解决上面的问题我们通过反射来获取。
例如我们要获取返回值为int[]型的资源id:
此时我们可以将上例中自定义view改为如下形式:
打成jar包,将图片、布局、attrs等资源文件合并到第三方应用中
然后运行:
第三方应用R.java文件:
PS:完整代码路径