一個 Activity 基本上要在 AndroidManifest.xml 的<intent-filter>中註冊一個 action 和 category;
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
action.MAIN指該 Activity
是個AP的進入點=開啟後的第一個畫面;
category.LAUNCHER指在應用程式選單上會出現該 Activity 的 icon,以方便執行。
當搜尋系統中的應用程式時,會去比對AP的 <intent-filter>,而搜尋條件是包裝在
Intent 物件中以找到符合某種條件程式。
<intent-filter>的內容就像是應用程式的索引,內容比對成功就會回傳相對應的 ResolveInfo。
一個應用程式中,可以有多個 Activity 都註冊
CATEGORY_LAUNCHER,那在安裝完後就會有多個 icon 出現在程式選單上,分別能執行各個 Activity。如果 Activity
沒有註冊 CATEGORY_LAUNCHER,那至少要註冊 CATEGORY_DEFAULT,因為它是系統使用 Intent
搜尋的預設條件之一。註冊 CATEGORY_DEFAULT 後該 Activity 不會有 icon 在應用程式選單上出現
ArrayList<ApplicationInfo> appCanLaunch = new ArrayList<ApplicationInfo>();
for (ApplicationInfo apAICanLaunch : allappInfo)
{
Intent intent = packageManager.getLaunchIntentForPackage(apAICanLaunch.packageName);
//Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }
//如果沒有android.intent.action.MAIN←launch進入點, 則intent=nullif (intent != null)
{
appCanLaunch.add(apAICanLaunch);
}
}
輸出結果:
Calculator
Dev Tools
Calendar
Browser
Email
Downloads
Clock
Dev Tools
Calendar
Browser
Downloads
Clock
++++++++++++++++++++按AP英文字母排序後, 再過濾掉無法launch的AP+++++++++++++++++++++++++
PackageManager packageManager = context.getPackageManager();
List<ApplicationInfo> allappInfo = packageManager.getInstalledApplications(PackageManager.GET_ACTIVITIES);
Collections.sort(allappInfo, new ApplicationInfo.DisplayNameComparator(packageManager));
ArrayList<ApplicationInfo> appCanLaunch = new ArrayList<ApplicationInfo>();
for (ApplicationInfo apAICanLaunch : allappInfo)
{
Intent intent = packageManager.getLaunchIntentForPackage(apAICanLaunch.packageName);
//Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }
//如果沒有android.intent.action.MAIN←launch進入點, 則intent=null
if (intent != null)
{
appCanLaunch.add(apAICanLaunch);
}
}
輸出結果:
Browser
Calculator
Calendar
Clock
Dev Tools
Downloads
Email
Calculator
Calendar
Clock
Dev Tools
Downloads
部份參考文獻:http://www.dotblogs.com.tw/neil/archive/2011/08/12/33058.aspx
沒有留言:
張貼留言