2013-06-21 102 views
6

我有這樣的代碼來獲得對系統的所有應用程序的列表:兩個不同的應用程序可以有相同的packageName嗎?

PackageManager pm = getPackageManager(); 

    Intent mainIntent = new Intent(Intent.ACTION_MAIN); 

    List<ResolveInfo> installedApps = pm.queryIntentActivities(mainIntent, 0); 

    for(ResolveInfo elem : installedApps) { 
      String PackageName = elem.activityInfo.applicationInfo.packageName; 
      Log.i("TAG",PackageName); 
    } 

但結果在installedApps顯示許多重複PackageNames。 這可能嗎?這是導致意圖「失敗」的原因,還是因爲許多應用程序packageNames具有相同的名稱?

回答

11

這可能嗎?

當然。

這是「引起的意圖

沒有‘失敗’,至少不是我的‘失敗’的定義。

還是因爲許多應用程序packageNames具有相同的名稱?

這是因爲你要查詢活動,不應用。應用程序可以有零個,一個,兩個或一百萬個活動,它們將響應一個ACTION_MAINIntent

+0

經驗教訓。謝謝! ;) – user2383054

5

不,每個應用都應該有一個唯一的包名稱。如果您安裝的軟件包名稱已在其他已安裝的應用程序中使用,那麼它將替換它。

所以應該有其他原因。一種猜測是queryIntentActivities檢索可以針對給定意圖執行的所有活動。所以它可以返回具有相同包名的活動信息。

您可以嘗試使用getInstalledApplications方法。它會返回已安裝的設備

+0

感謝您的信息;) – user2383054

4

每個應用程序都必須有一個潮頭包名稱上的所有應用程序包的列表。引用the API guide:「軟件包名稱作爲應用程序的唯一標識符」和「發佈應用程序後,您不能更改軟件包名稱。軟件包名稱定義了您的應用程序的標識,因此如果您更改它,那麼它是被認爲是不同的應用程序,以前版本的用戶無法更新到新版本。「

。注意,在一個單一的清單具有多個ACTION_MAIN條目是完全有效的,因爲它們代表可選的進入點中的應用。有關更多信息,請參閱this question

+0

感謝您的回答! ;) – user2383054

0

包名稱的作用類似於文件夾結構。我相信,當你進入設備或模擬器的data-> data文件夾時,你可以看到它。

我們需要針對不同應用的不同的文件夾?

我會說最好是這樣。由於我不希望你的文件使用相同的名稱來覆蓋對方,並且發生意外的行爲或崩潰。如果您確定這兩個應用程序在類名稱中沒有衝突,我相信它是一樣的。

0

NO,

警告:一旦你發佈你的應用程序,你不能改變的包名。軟件包名稱定義了您的應用程序的標識,因此如果您更改它,則認爲它是不同的應用程序,並且以前版本的用戶無法更新到新版本。

Docs

但也有在不同活動不同的使用意圖過濾器不同的切入點。

<intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

包名稱:應用程序的完整Java語言風格包名稱。該名稱應該是唯一的。名稱可能包含大寫或小寫字母('A'到'Z'),數字和下劃線('_')。但是,個別包名稱部分只能以字母開頭。 爲避免與其他開發人員發生衝突,您應該使用Internet域名所有權作爲您的軟件包名稱的基礎(反向)。例如,Google發佈的應用程序以com.google開頭。發佈應用程序時,您也不應該使用com.example命名空間。

包名稱作爲應用程序的唯一標識符。它也是應用程序進程的默認名稱(請參閱<application>元素的進程屬性process)和活動的默認任務關係(請參閱<activity>元素的taskAffinity屬性)。

相關問題