Android中檢查、設定預設程式詳解_Android

來源:互聯網
上載者:User

Android作為一個偉大的系統,自然提供了設定預設開啟程式的實現.在這篇文章中,我會介紹如何在Android系統中設定預設的程式. 在設定預設程式之前,無非有兩種情況,一種是已經有預設的程式,另一種則是沒有任何預設程式.

檢測是否有預設的程式

檢查是必須的,因為結果關乎著我們下一步該怎麼做.

複製代碼 代碼如下:

public void testGetDefaultActivity() {
    PackageManager pm = mContext.getPackageManager();
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("http://www.google.com"));
    ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
    Log.i(VIEW_LOG_TAG, "getDefaultActivity info = " + info + ";pkgName = " + info.activityInfo.packageName);
}

其對應的日誌輸出如下

複製代碼 代碼如下:

I/View    ( 1145 ): View getDefaultActivity info = ResolveInfo{410e4868 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0};pkgName = android

如果沒有預設的程式,那麼就會顯示出預設的就會顯示com.android.internal.app.ResolverActivity,那麼這個ResolverActivity是什麼呢,其實它就是一個選擇開啟程式的對話方塊,其廬山真面目應該是這樣

如果我們設定了傲遊瀏覽器作為我們的預設瀏覽器,那麼預設的程式就應該顯示關於傲遊瀏覽器相關的資訊. 如下.

複製代碼 代碼如下:

I/View    ( 1145 ): View getDefaultActivity info = ResolveInfo{410ae1e8 com.mx.browser.MxBrowserActivity p=0 o=0 m=0x208000};pkgName = com.mx.browser

那麼如何判斷是否設定了預設的程式呢,上面的方法預設的ResolveInfo,如果info.activityInfo.packageName為android,則沒有設定,否則,有預設的程式.

複製代碼 代碼如下:

public final boolean hasPreferredApplication(final Context context, final Intent intent) {
    PackageManager pm = context.getPackageManager();
    ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return !"android".equals(info.activityInfo.packageName);
}

如果有預設程式

我們需要做的是將現在的預設的程式的預設設定清除.

我們能通過代碼直接將預設設定改寫成我們的麼,實際上是不行的,因為許可權的問題. 原因是這樣的Android因為基於Linux 核心,Linux有著很棒的使用者概念,而Android中每個應用就是一個在Linux核心中的使用者.兩個層級相同的使用者無法刪除對方.

所以,我們只能交給使用者手動做.當然這也是絕大多數程式的做法.你需要做的就是將使用者帶到程式詳情頁,通過這段代碼可以跳轉到應用詳情頁.

複製代碼 代碼如下:

public void testStartAppDetails() {
    //Use the destination package name
    Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.mx.browser"));
    getActivity().startActivity(intent);
}

當跳轉到已安裝的應用詳情頁之後,你應該提示用處點擊Clear Default 按鈕.


如果使用者從安裝詳情頁回到你的程式,你需要檢測是不是使用者清理了預設的程式設定,判斷依據還是是否有預設的程式設定,如果還有預設的,繼續提示需要手動清理其他已設定的程式,直到使用者徹底清理完成之後,然後按照下面的沒有預設設定程式的情況處理.

注意,存在多次清理的情況,如設定瀏覽器,先清理了UC預設設定後,可能還需要清理海豚瀏覽器的情況.

沒有預設的程式.

如果沒有預設的程式,我們就需要設定我們希望的程式作為預設,但是,這頁不能在代碼中實現,還是需要人為的互動選擇才可以.你需要做的就是使用類似如下代碼,然後彈出一個提示,告訴使用者選擇你的程式作為預設的程式.至於提示你可以充分發揮你的想象力.

複製代碼 代碼如下:

public void testStartChooseDialog() {
    Intent intent = new Intent();
    intent.setAction("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.BROWSABLE");
    intent.setData(Uri.parse("http://jb51.net"));
    intent.setComponent(new ComponentName("android","com.android.internal.app.ResolverActivity"));
    getActivity().startActivity(intent);
}

取消自己的預設程式設定

複製代碼 代碼如下:

public void testClearDefault() {
    PackageManager pm = mContext.getPackageManager();
    pm.clearPackagePreferredActivities(mContext.getPackageName());
}

上述方法只能清理自己的預設設定

更近一步

實際上關於預設設定的設定檔存放在/data/system/packages.xml

複製代碼 代碼如下:

<preferred-activities>
<item name="com.mx.browser/.MxBrowserActivity" match="200000" set="2">
<set name="com.android.browser/.BrowserActivity" />
<set name="com.mx.browser/.MxBrowserActivity" />
<filter>
<action name="android.intent.action.VIEW" />
<cat name="android.intent.category.BROWSABLE" />
<cat name="android.intent.category.DEFAULT" />
<scheme name="http" />
</filter>
</item>
</preferred-activities>

One More Thing

提問:當一個程式程式安裝或卸載,系統會做什麼

回答:當一個程式安裝或者卸載,以瀏覽器為例子,如果你安裝了一個傲遊瀏覽器或者卸載了一個UC瀏覽器,當你從外部程式開啟一個連結時,系統不會使用之前的預設程式開啟,而是彈出一個選擇對話方塊供你選擇.

提問:什麼時候系統會彈出選擇開啟程式列表

回答:經本人測試,實際是這樣的,當有一個Intent過來的時候,系統會動態地收集能處理的Activity,然後從/data/system/packages.xml 讀取進行比較,如果兩者不同,則彈出選擇對話方塊.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.