作者normanshi (原则就是原则)
看板AndroidDev
标题[分享] Library Project 心得
时间Thu Jan 30 00:43:39 2014
最近开发了自己的Library Project,
所以简单的跟各位分享一下过程和心得,
首先为什麽要使用Library Project?
最主要的原因就是方便管理和维护,
即使现在已经有git这种神器,
如果两只app功能几乎一样,
以开发者的角度来说最好只管理同一份code!
Android上我能想到最可能用Library Project的情况,
就是你想把自己写的Code整理出来方便以後重复用,
或是你的App有普通版跟付费版,
甚至是为了合作厂商客制特别版。
以我这次的经验来说就是要客制另一版,
但功能又几乎都一样,
所以我的解决方式就是:
(1) 把目前的code完全变成一个独立的core package
(2) 然後把core package变成Library Project
(3) 新开一个Project使用原本的package name引用Library Project
(4) 新开客制版Project,一样引用Library Project
这样以後我还是都改core package,
就可以同时维护不同的project。
当然这时就会开始有些细节要注意,
首先Library Project的manifest对你的Host Project就失去意义了,
使用Library Project中你想用的Application、Activity、Service、Intent时,
你要依照Library Project的完整package name在Host Project的manifest内
再宣告一次,举例来说:
Library Project Manifest:
package="com.core.library"
<activity
android.name=".MainActivity"
...
Host Project Manifest:
package="com.example.host"
<activity
android.name="com.core.library.MainActivity"
...
当然也有更快的作法是manifestmerger,但我没那样用,
有兴趣的可以找Stackoverflow。
另外,反应快的人可能会马上想到如果Library Project内的Service我要重复用,
而且我有两只App都要用到Library Project的Service,这样会发生什麽状况?
答案是,若两只App同时存在又没处理好就会收到SecurityException,
但解法也很简单就是在Intent内设定package,
让系统知道你这个Intent是要送给哪一个package用,
所以记得intent.setPackage(getPackageName()),
Notification的remote view中的pending intent比照办理即可,
客制化也是一样都用package name来判断区别。
不过这作法最大的缺点就是,当你的产品线很多时,
你可能会在同一个View因为些微的修改而必须加上一堆烦人的判断式,
但如果你的View是一样的只是图片不同的话,
只要针对个别Host Project在resource放相对应的图片即可。
以上是这段时间的心得,若有错误也请指证,谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.82.89
※ 编辑: normanshi 来自: 61.231.82.89 (01/30 00:57)
1F:推 btsken:以我的理解Library Project是不是不应该有activity的东西在 01/30 07:39
2F:→ normanshi:理论上是,但我app长相基本上一样 01/30 08:31
3F:推 darkhosa:推~ 02/01 06:58