我们写程序的时候往往需要把自己的程序打包成jar
包,给第三方调用。Eclipse让我们非常方便的可以导出jar
包。但是当程序里需要用到res里的资源时,往往就会出现问题。因为统自动生成的
R
类如果被打到
jar
包中后,就失去了索引资源的作用。导致封装成
jar
包的
view
无法获取对应资源。因为
R
类的属性值是在应用编译打包时由系统自动分配的。
R
类打包之后失效,实际是因为
R
类的内部类里面的属性失效,因为打包之后这些属性的值就固定了,但是实际项目中这些值是在编译时有系统自动分配的,无法在编译前固定。
本文就提供一种方法,解决这个问题。
首先建立一个AndroidJar项目。这个项目将来就是要打成jar
包的项目。
结构如下:
![](http://p.qpimg.cn/cgi-bin/cgi_imgproxy?url=http%3A%2F%2Fwww.apkbus.com%2Fdata%2Fattachment%2Fforum%2F201304%2F25%2F083131cjhjd0wfhn3hqw2h.jpg&size=0)
然后再建立一个AndroidJarTest项目。这个项目就是应用jar
包的项目。
AndroidJar写好后,就是导出jar
包。相信大家都非常熟悉,步骤如下:
1.选中AndroidJar,右键选择export
。
2.选择
jar file
。只需导出源码。如图:
![](http://p.qpimg.cn/cgi-bin/cgi_imgproxy?url=http%3A%2F%2Fwww.apkbus.com%2Fdata%2Fattachment%2Fforum%2F201304%2F25%2F083207k4im5glh1clvnfmh.jpg&size=0)
1.然后点击finish。就可以导出jar包了。
AndroidJarTest项目对jar包的应用方法。
1.在AndroidJarTest项目下建立一个libs文件夹,再把刚才导出的jar包放到里面。再把jar包加到java build path的路径里。
![](http://p.qpimg.cn/cgi-bin/cgi_imgproxy?url=http%3A%2F%2Fwww.apkbus.com%2Fdata%2Fattachment%2Fforum%2F201304%2F25%2F083236bgaz9pgzltba323a.jpg&size=0)
2.因为刚才只是把AndroidJar的源码打成了jar包。但是资源并没有打包。所以现在要把AndroidJar项目里的资源。拷贝到AndroidJarTest的项目下。具体就是res下的文件。因为太简单,这里就不演示怎么拷了。
2.最后要在AndroidJarTest的AndroidManifest.xml里注册AndroidJar里的activity,service,receiver。很多广告插件都是这么做的。相信大家都非常熟悉。
[mw_shl_code=java,true] <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".AndroidJarTestActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- AndroidJar 里的activity,service和receiver-->
<activity
android:name="com.song.test.FirstActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
<activity
android:name="com.song.test.AndroidJarActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
<service android:name="com.song.test.service.HelloService" >
</service>
<receiver android:name="com.song.test.receiver.ToastReceiver" >
<intent-filter >
<action android:name="MAKE_TOAST_ACTION" />
</intent-filter>
</receiver>
<!-- AndroidJar 里的activity,service和receiver-->
</application>
[/mw_shl_code]
[mw_shl_code=java,true] <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".AndroidJarTestActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- AndroidJar 里的activity,service和receiver-->
<activity
android:name="com.song.test.FirstActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
<activity
android:name="com.song.test.AndroidJarActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
<service android:name="com.song.test.service.HelloService" >
</service>
<receiver android:name="com.song.test.receiver.ToastReceiver" >
<intent-filter >
<action android:name="MAKE_TOAST_ACTION" />
</intent-filter>
</receiver>
<!-- AndroidJar 里的activity,service和receiver-->
</application>
[/mw_shl_code]
在AndroidJarTest里就只要一个其他的activity。它负责跳转到AndroidJar里。AndroidJar里就三个按钮分别是启动一个服务,每隔10秒就发出一个广播,然后广播接收到后就弹出一个toast,“大家好,我是苍老师!”和一个停止服务。最下面一个就是跳到一个有苍老师的界面。
![](http://p.qpimg.cn/cgi-bin/cgi_imgproxy?url=http%3A%2F%2Fwww.apkbus.com%2Fdata%2Fattachment%2Fforum%2F201304%2F25%2F083755gxpt4z69g09tv9dj.jpg&size=0)
程序相当简单。其中根据资源创建view,和根据资源找到相应字符的核心类为ResManager。大家可以下载源码,研究研究。