Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android程序中--不能改變的事情,android程序--改變

Android程序中--不能改變的事情,android程序--改變

編輯:關於android開發

Android程序中--不能改變的事情,android程序--改變


有時,開發人員會對應用程序進行更改,當安裝為以前版本的更新時出現令人驚訝的結果 - 快捷方式斷開,小部件消失或甚至根本無法安裝。 應用程序的某些部分在發布後是不可變的,您可以通過理解它們來避免意外。

你的包名和證書

其中最明顯和最可見的是“manifest package name”,它是在AndroidManifest.xml中為您的應用程序提供的唯一名稱。 該名稱使用Java語言風格的命名約定,具有Internet域所有權有助於避免名稱沖突。 例如,由於Google擁有域“google.com”,因此所有應用程序的清單文件包名稱應以“com.google”開頭。開發人員必須遵守此約定,以避免與其他開發人員發生沖突。

一旦您的應用程序在其清單包名稱下發布,這就是應用程序的唯一永久標識。 切換到不同的名稱會產生一個全新的應用程序,無法安裝為現有應用程序的更新。

與manifest包名稱一樣重要的是應用程序簽名的證書。 簽名證書表示應用程序的作者。 如果您更改應用程序已簽署的證書,則它現在是一個不同的應用程序,因為它來自不同的作者。 此不同的應用程序不能作為對原始應用程序的更新上傳到Market,也不能作為更新安裝到設備上。

在以這兩種方式之一安裝更改的應用程序時,用戶看到的確切行為是不同的:

  • 如果清單包名稱已更改,則新應用程序將與舊應用程序一起安裝,因此它們同時在用戶的設備上共存。
  • 如果簽名證書更改,嘗試將新應用程序安裝到設備上將失敗,除非卸載舊版本。

如果更改應用程序的簽名證書,則應始終更改其清單包名稱,以避免在安裝時出現故障。 換句話說,來自不同作者的應用程序使它成為一個不同的應用程序,並且應該適當地改變其包名稱以反映它。 (當然,使用相同的軟件包名稱作為使用測試密鑰簽名的應用程序的開發版本,因為這些文件沒有發布)。

你的AndroidManifest.xml是一個公共API

不只是你的包名是不可變的。AndroidManifest.xml的主要功能主要是從應用程序中聲明一個公共API,供其他應用程序和Android系統使用。 您在清單中聲明的每個組件都不是私有的(即其android:exported狀態為true),都應被視為公共API,並且絕不能以破壞兼容性的方式進行更改。

構成兼容性中斷的一個微妙但重要的方面是您的Activity、service和接收器組件的android:name屬性。 這可能是令人驚訝的,因為我們認為android:name指向實現我們的應用程序的私有代碼,但它也是(與清單包名稱相結合)組件的官方唯一的公共名稱,由ComponentName 類表示。

更改應用程序中的組件名稱可能會對用戶產生負面影響。一些例子是:

  • 如果應用程序的MainActivity的名稱發生更改,則用戶對其進行的任何快捷方式將不再工作。快捷方式是一個Intent,它直接指定應該運行的ComponentName。
  • 如果實施動態壁紙的服務名稱發生更改,則啟用動態壁紙的用戶在獲取新版應用時會將壁紙還原為系統默認值。對於輸入法,輔助功能服務,Honeycomb的新高級Widget等也是如此。
  • 如果實現設備管理器的接收器的名稱改變,則與活動壁紙示例一樣,當應用更新時,設備管理器將被禁用。這也適用於其他類型的接收器,如App Widget。

這些行為Intent系統在Android上使用的結果。有兩種主要的意圖:

  • 隱式意圖(Implicit Intents)僅指定它們應該匹配的“what”,使用動作,類別,數據,MIME類型等。它們將找到的確切組件僅在運行時由包管理器與當前應用程序匹配來確定。
  • 顯式意圖通過ComponentName指定他們應該匹配的單個顯式“who”。無論在意圖中是什麼,它只與在其ComponentName中給出的確切的清單包名稱和類名稱相關聯。

這兩種類型的意圖對於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

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved