2012-05-01 106 views
1

我在Android中編寫一個啓動器,這裏是我一直試圖解決一段時間沒有運氣的問題。PackageManager.queryIntentActivities()返回不完整的列表?

我有以下代碼來查詢我的啓動程序剛開始時運行的所有活動,例如onResume()

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
final List<ResolveInfo> infos = packageManager.queryIntentActivities(mainIntent, 0); 
for (final ResolveInfo info : infos) { 
    // create my own recrord for each activity  
} 

的問題是,如果我設置我的啓動爲默認,reboot設備,每次我可以通過上面的代碼的完整清單的一部分。看起來一些大型的胖活動(例如發條騎士)總是缺失。但是,第二次運行上面的代碼將返回完整列表。有沒有人知道爲什麼?我的猜測是,PackageManager需要一些時間來分析胖活動,如果太早調用它,它只是返回一個部分列表,這是真的嗎?

但爲什麼默認啓動程序沒有這個問題?

+0

您可以在重新啓動之前保存完整列表嗎?例如在首選項或文件中。 – hasanghaforian

回答

2

更大的活動更有可能安裝在外部存儲分區上,這通常需要一段時間才能安裝。我的三星Galaxy W手機上的啓動器完全是這樣的,它提供了一個佔位符圖標,直到SD卡被安裝並且該應用程序可以使用。

應該有一個來自PackageManager的廣播,告訴你什麼時候有新的應用程序可用,但我一眼就找不到。您可能需要聽取ACTION_MEDIA_MOUNTED,並希望PackageManager先到達那裏。

+2

謝謝!這是正確的,廣播是Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE。 – Farmer

+1

那麼最終的解決方案是什麼?你在.addCategory()上放置了什麼參數?只有_LAUNCHER,這個?或兩者兼而有之? – voghDev