Android中檢查、設(shè)置默認(rèn)程序詳解
Android作為一個(gè)偉大的系統(tǒng),自然提供了設(shè)置默認(rèn)打開程序的實(shí)現(xiàn).在這篇文章中,我會(huì)介紹如何在Android系統(tǒng)中設(shè)置默認(rèn)的程序. 在設(shè)置默認(rèn)程序之前,無(wú)非有兩種情況,一種是已經(jīng)有默認(rèn)的程序,另一種則是沒(méi)有任何默認(rèn)程序.
檢測(cè)是否有默認(rèn)的程序
檢查是必須的,因?yàn)榻Y(jié)果關(guān)乎著我們下一步該怎么做.
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);
}
其對(duì)應(yīng)的日志輸出如下
I/View ( 1145 ): View getDefaultActivity info = ResolveInfo{410e4868 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0};pkgName = android
如果沒(méi)有默認(rèn)的程序,那么就會(huì)顯示出默認(rèn)的就會(huì)顯示com.android.internal.app.ResolverActivity,那么這個(gè)ResolverActivity是什么呢,其實(shí)它就是一個(gè)選擇打開程序的對(duì)話框,其廬山真面目應(yīng)該是這樣

如果我們?cè)O(shè)置了傲游瀏覽器作為我們的默認(rèn)瀏覽器,那么默認(rèn)的程序就應(yīng)該顯示關(guān)于傲游瀏覽器相關(guān)的信息. 如下.
I/View ( 1145 ): View getDefaultActivity info = ResolveInfo{410ae1e8 com.mx.browser.MxBrowserActivity p=0 o=0 m=0x208000};pkgName = com.mx.browser
那么如何判斷是否設(shè)置了默認(rèn)的程序呢,上面的方法默認(rèn)的ResolveInfo,如果info.activityInfo.packageName為android,則沒(méi)有設(shè)置,否則,有默認(rèn)的程序.
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);
}
如果有默認(rèn)程序
我們需要做的是將現(xiàn)在的默認(rèn)的程序的默認(rèn)設(shè)置清除.
我們能通過(guò)代碼直接將默認(rèn)設(shè)置改寫成我們的么,實(shí)際上是不行的,因?yàn)闄?quán)限的問(wèn)題. 原因是這樣的Android因?yàn)榛贚inux 內(nèi)核,Linux有著很棒的用戶概念,而Android中每個(gè)應(yīng)用就是一個(gè)在Linux內(nèi)核中的用戶.兩個(gè)級(jí)別相同的用戶無(wú)法刪除對(duì)方.
所以,我們只能交給用戶手動(dòng)做.當(dāng)然這也是絕大多數(shù)程序的做法.你需要做的就是將使用者帶到程序詳情頁(yè),通過(guò)這段代碼可以跳轉(zhuǎn)到應(yīng)用詳情頁(yè).
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);
}
當(dāng)跳轉(zhuǎn)到已安裝的應(yīng)用詳情頁(yè)之后,你應(yīng)該提示用處點(diǎn)擊Clear Default 按鈕.

如果用戶從安裝詳情頁(yè)回到你的程序,你需要檢測(cè)是不是用戶清理了默認(rèn)的程序設(shè)置,判斷依據(jù)還是是否有默認(rèn)的程序設(shè)置,如果還有默認(rèn)的,繼續(xù)提示需要手動(dòng)清理其他已設(shè)置的程序,直到用戶徹底清理完成之后,然后按照下面的沒(méi)有默認(rèn)設(shè)置程序的情況處理.
注意,存在多次清理的情況,如設(shè)置瀏覽器,先清理了UC默認(rèn)設(shè)置后,可能還需要清理海豚瀏覽器的情況.
沒(méi)有默認(rèn)的程序.
如果沒(méi)有默認(rèn)的程序,我們就需要設(shè)置我們希望的程序作為默認(rèn),但是,這頁(yè)不能在代碼中實(shí)現(xiàn),還是需要人為的交互選擇才可以.你需要做的就是使用類似如下代碼,然后彈出一個(gè)提示,告訴用戶選擇你的程序作為默認(rèn)的程序.至于提示語(yǔ)你可以充分發(fā)揮你的想象力.
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);
}
取消自己的默認(rèn)程序設(shè)置
public void testClearDefault() {
PackageManager pm = mContext.getPackageManager();
pm.clearPackagePreferredActivities(mContext.getPackageName());
}
上述方法只能清理自己的默認(rèn)設(shè)置
更近一步
實(shí)際上關(guān)于默認(rèn)設(shè)置的配置文件存放在/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
提問(wèn):當(dāng)一個(gè)程序程序安裝或卸載,系統(tǒng)會(huì)做什么
回答:當(dāng)一個(gè)程序安裝或者卸載,以瀏覽器為例子,如果你安裝了一個(gè)傲游瀏覽器或者卸載了一個(gè)UC瀏覽器,當(dāng)你從外部程序打開一個(gè)鏈接時(shí),系統(tǒng)不會(huì)使用之前的默認(rèn)程序打開,而是彈出一個(gè)選擇對(duì)話框供你選擇.
提問(wèn):什么時(shí)候系統(tǒng)會(huì)彈出選擇打開程序列表
回答:經(jīng)本人測(cè)試,實(shí)際是這樣的,當(dāng)有一個(gè)Intent過(guò)來(lái)的時(shí)候,系統(tǒng)會(huì)動(dòng)態(tài)地收集能處理的Activity,然后從/data/system/packages.xml 讀取進(jìn)行比較,如果兩者不同,則彈出選擇對(duì)話框.
相關(guān)文章
Android LaunchMode四種啟動(dòng)模式詳細(xì)介紹
這篇文章主要介紹了Android LaunchMode四種啟動(dòng)模式詳細(xì)介紹的相關(guān)資料,這里對(duì)launchmode的使用方法進(jìn)行了詳解及啟動(dòng)模式的比較,需要的朋友可以參考下2016-12-12
基于android中的各種顏色在drawable.xml中的值詳解
本篇文章是對(duì)在android中的各種顏色在drawable.xml中的值進(jìn)行了詳細(xì)的介紹。需要的朋友參考下2013-05-05
Android靜態(tài)變量的生命周期 簡(jiǎn)單介紹
Android靜態(tài)變量的生命周期 簡(jiǎn)單介紹,需要的朋友可以參考一下2013-06-06
Android 代碼設(shè)置開機(jī)自啟動(dòng)App的方法
今天小編就為大家分享一篇Android 代碼設(shè)置開機(jī)自啟動(dòng)App的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Android開發(fā)實(shí)現(xiàn)的Intent跳轉(zhuǎn)工具類實(shí)例
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的Intent跳轉(zhuǎn)工具類,簡(jiǎn)單描述了Intent組件的功能并結(jié)合實(shí)例形式給出了頁(yè)面跳轉(zhuǎn)、拍照、圖片調(diào)用等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Android自定義View實(shí)現(xiàn)開關(guān)按鈕
android 自定義view知識(shí)非常廣泛,難以讓人掌握。但是也是andoroid進(jìn)階學(xué)習(xí)的必經(jīng)之路。下面通過(guò)本文給大家介紹Android自定義View實(shí)現(xiàn)開關(guān)按鈕的知識(shí),非常不錯(cuò),感興趣的朋友一起看看吧2016-11-11
Android實(shí)現(xiàn)圓形純數(shù)字按鈕
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓形純數(shù)字按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
android使用viewpager計(jì)算偏移量實(shí)現(xiàn)選項(xiàng)卡功能
這篇文章主要為大家詳細(xì)介紹了android使用viewpager計(jì)算偏移量實(shí)現(xiàn)選項(xiàng)卡功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12

