編輯:關於android開發
有時,開發人員會對應用程序進行更改,當安裝為以前版本的更新時出現令人驚訝的結果 - 快捷方式斷開,小部件消失或甚至根本無法安裝。 應用程序的某些部分在發布後是不可變的,您可以通過理解它們來避免意外。
其中最明顯和最可見的是“manifest package name”,它是在AndroidManifest.xml中為您的應用程序提供的唯一名稱。 該名稱使用Java語言風格的命名約定,具有Internet域所有權有助於避免名稱沖突。 例如,由於Google擁有域“google.com”,因此所有應用程序的清單文件包名稱應以“com.google”開頭。開發人員必須遵守此約定,以避免與其他開發人員發生沖突。
一旦您的應用程序在其清單包名稱下發布,這就是應用程序的唯一永久標識。 切換到不同的名稱會產生一個全新的應用程序,無法安裝為現有應用程序的更新。
與manifest包名稱一樣重要的是應用程序簽名的證書。 簽名證書表示應用程序的作者。 如果您更改應用程序已簽署的證書,則它現在是一個不同的應用程序,因為它來自不同的作者。 此不同的應用程序不能作為對原始應用程序的更新上傳到Market,也不能作為更新安裝到設備上。
在以這兩種方式之一安裝更改的應用程序時,用戶看到的確切行為是不同的:
如果更改應用程序的簽名證書,則應始終更改其清單包名稱,以避免在安裝時出現故障。 換句話說,來自不同作者的應用程序使它成為一個不同的應用程序,並且應該適當地改變其包名稱以反映它。 (當然,使用相同的軟件包名稱作為使用測試密鑰簽名的應用程序的開發版本,因為這些文件沒有發布)。
不只是你的包名是不可變的。AndroidManifest.xml的主要功能主要是從應用程序中聲明一個公共API,供其他應用程序和Android系統使用。 您在清單中聲明的每個組件都不是私有的(即其android:exported狀態為true),都應被視為公共API,並且絕不能以破壞兼容性的方式進行更改。
構成兼容性中斷的一個微妙但重要的方面是您的Activity、service和接收器組件的android:name屬性。 這可能是令人驚訝的,因為我們認為android:name指向實現我們的應用程序的私有代碼,但它也是(與清單包名稱相結合)組件的官方唯一的公共名稱,由ComponentName 類表示。
更改應用程序中的組件名稱可能會對用戶產生負面影響。一些例子是:
這些行為Intent系統在Android上使用的結果。有兩種主要的意圖:
這兩種類型的意圖對於Android如何與您的應用程序交互都很重要。一個典型的例子是用戶如何浏覽和選擇動態壁紙。
為了讓用戶選擇一個動態壁紙,Android必須做的第一件事是顯示一個可用的動態壁紙服務的列表。它通過使用動態壁紙的適當動作構建一個隱式Intent,並詢問程序包管理器所有支持此Intent的服務。結果是向用戶顯示的動態壁紙的列表。
當用戶實際選擇他們想要使用的特定動態壁紙,然而,Android現在必須建立一個明確的Intent,標識特定的動態壁紙。這是什麼被交給WallpaperManager告訴它顯示哪個壁紙。
這就是為什麼更改清單中組件的名稱將導致壁紙消失:之前保存的顯式Intent現在無效,因為它引用的ComponentName不再存在。沒有可用信息來指示組件的新名稱。 (例如,考慮您的應用程序是否有兩個不同的動態壁紙服務)相反,Android必須將活動壁紙視為已卸載,並恢復為默認壁紙。
這是輸入法,設備管理員,客戶經理,應用程序窗口小部件,甚至應用程序快捷方式的工作原理。 ComponentName是您在清單中聲明的組件的公共唯一名稱,如果對其他應用程序可見,則不能更改。
總之:你的應用程序的某些部分不能改變。 請小心。
本文翻譯自:https://android-developers.googleblog.com/2011/06/things-that-cannot-change.html
轉發請注明出處:http://www.cnblogs.com/jycboy/p/android_thingnotchange.html
從編程的角度理解gradle腳本??Android Studio腳本構建和編程 隨著Android 開發環境從Eclipse轉向Android Studio,我們每個
本節繼續講解用戶界面的相關內容,主要包括Button、TextView、Edi
Android 手機衛士--獲取聯系人信息並顯示與回顯,android回顯前面的文章已經實現相關的布局,本文接著進行相關的功能實現 本文地址:http://www.cnb
Android Doze模式源碼分析,androiddoze 科技的仿生學無處不在,給予我們啟發。為了延長電池是使用壽命,google從蛇的冬眠中得到體會,那