想必 99% 的程式都有一個 "About" 吧?這裡一般都會寫上程式名稱和版本號碼。要知道,AndroidManifest.xml 中也有版本號碼(Version Name),同樣的資訊在兩個地方出現,就引出了一個問題:如何在後續升級時保證二者同步?
我首先想到的方法就是在 res/values/strings.xml 中定義一個 entry,比如
<string name="version_name">1.0</string>
,然後再在兩個地方引用這個字串 R.string.version_name 或 @string/version_name。當然,About UI 部分可以根據情況直接寫在 layout xml (後者)或代碼中(前者),但是 AndroidManifest.xml 只能使用後者。這樣版本號碼就只有一個定義,在 strings.xml 中,以後升級時修改這一個地方就可以了。這樣改完代碼後,編譯,運行,一切正常,我感到很欣慰。
然而,很快問題就出現了:當我上傳這個程式到 Android Market 上時,系統提示 Version Name 無效!看來 Google 的 Android
Market 後台還不很成熟,這應該是一個 bug,我可以提交一個 issue,但是我的程式不能等到 Android Market 改完 bug 再發布吧?
思考問題要靈活,既然 AndroidManifest.xml 中不能引用其他 xml 中的資源,那麼就讓版本號碼定義在它那裡,其他用到版本號碼的地方都想辦法取出來不就可以了!!問題化歸為:“如何在運行時取到程式自身的版本?”(之所以這裡強調“運行時”是因為我感覺 AndroidManisfest.xml 中的東西是無法通過類似 @string/abd 形式來引用的。如果你知道如何引用,請告訴我,謝謝!)。經過尋找文檔和 Google,最終找到答案:
PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0);
PackageInfo 中包含了關於當前 package 的許多資訊(Version Number 當然也包含在其中了),另外 PackageManager.getPackageInfo() 的第二個參數也大有文章。