如何使用程序代碼設定偏好應用

quote:基於代碼Android 4.4


項目開發中遇到一個需求,在系統有多個桌面應用的情況下,開機啓動指定的桌面。

這個跟我們平常有多個桌面時,一般會彈出框讓我們選擇偏好桌面。這篇文章中,我們將來看看如何在程序代碼中設定某個應用爲偏好桌面。

如何找到系統中所有的桌面應用程序

<span style="font-size:18px;">private PackageManager mPackageManager;
private List<ResolveInfo> mResolveInfos;
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
//Query all the launcher
mResolveInfos = mPackageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);</span>

注:在Android中,一般對包的操作都是在PackageManagerService或者PackageManager中進行的。


這個queryIntentActivies就是查找所有的包中匹配上面設置的匹配Intent.ACTION_MAIN和Intent.CATEGORY_HOME,並且還包含Intent.CATEGORY_DEFAULT的包。注意存儲查詢結果的是一個List<ResolveInfo>類型的數據。


可以通過下面的代碼獲取搜索到的應用的包名和名稱:

ResolveInfo resolveInfo = mResolveInfos.get(i);
String fullClassname = resolveInfo.activityInfo.name;
String packagename = resolveInfo.activityInfo.packageName;
可以通過如下代碼獲取所有設定的偏好程序:
mPackageManager.getPreferredActivities(List<IntentFilter> outFilters, List<ComponentName> outActivities, String packageName);
//這裏可以過濾滿足一定條件的應用程序,比如下面過濾出了桌面應用
if(outFiltersi.hasAction(Intent.ACTION_MAIN) && outerFiltersi.hasCategory(Intent.CATEGORY_HOME))


如何設置偏好應用呢?

首先,我們看看設置偏好應用要用到那個API:

第一步,如果存在一個已經設置的偏好應用,先清除原來的

<span style="font-size:18px;">mPackageManager.clearPackagePreferredActivities(mDefaulCN.getPackageName());</span>

​第二步,設置新的偏好應用

<span style="font-size:18px;">mPackageManager.addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity)</span>

​如何初始化這些參數:

           ResolveInfo resolveInfo = mResolveInfos.get(position);
            ActivityInfo activityInfo = resolveInfo.activityInfo;
            //設定設置應用的componentsName
            ComponentName componentName = new ComponentName(activityInfo.packageName,activityInfo.name);
            Intent intent = new Intent();
            intent.setComponent(componentName);
            
           //設置API中的參數過濾器
            IntentFilter filter = new IntentFilter();
           filter.addAction(Intent.ACTION_MAIN);
           filter.addCategory(Intent.CATEGORY_HOME);
           filter.addCategory(Intent.CATEGORY_DEFAULT);
           
            //設置API中的set參數
            ComponentName[] componentName = {componentName};
          //設置match爲靜態常量值
          int match = IntentFilter.MATCH_CATEGORY_HOST;
            //調用API將指定component的應用設爲偏好應用,Set this launcher as default
            mPackageManager.addPreferredActivity(filter, bestMatch, set,intent.getComponent());



注意,應用名稱的取得,最好使用API:
mPackageManager.queryIntentActivities
取得,這樣能夠確保該應用確實安裝在手機上了,是一個有效的內容。然後我們再在有效的內容上面進行操作,而不是直接簡單粗暴的給intent賦值一個component值,可能會導致一些不可預計的錯誤。

總結:

在本文中,我們主要講述了這樣幾點內容:

1. 如何取得所有的偏好程序
     從取得的輸出內容裏面,我們可以通過判斷IntentFilter內容,過濾出我們想要知道的應用名稱。

2. 如何設置我們需要的偏好應用
     包括先清除原來的偏好應用,並且初始化一些值作爲調用addPreferredActivity的參數,設置我們選定的應用程序。

發佈了80 篇原創文章 · 獲贊 119 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章