像是預設的瀏覽器、信箱或是Home launcher等等。
通常要手動清除這些預設值會前往:
設定->應用程式->選定App->清除預設值
透過程式化最直覺的做法,
應該是使用clearPackagePreferredActivities函式,
只不過這只能用來清除自己App的設定值。
要清除別人的預設值,有一個小技巧,
例如要清除預設瀏覽器,首先先建立一個activity當作假的browser.
在AndroidManifest.xml中對FackActivity加入intent-filter
<activity
android:name="com.example.safebrowsing.FackBrowser"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
</activity>
這是一般實作瀏覽器App會加入的intent-filter,
才會成為瀏覽器的選項之一。
要注意的是android:enabled="false"
先讓此activity失效。
接著在透過下列程式碼,達到清除瀏覽器預設值的效果。
public void onClickClearDefault(View view){ String pn = MainActivity.class.getPackage().getName(); String hn = FackBrowser.class.getName(); ComponentName mhCN = new ComponentName(pn, hn); pm.setComponentEnabledSetting(mhCN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); Uri uri = Uri.parse("http://"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); pm.setComponentEnabledSetting(mhCN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); }透過setComponentEnabledSetting讓FackBrowser啟用(Enabled),
隨後透過intent開啟一段網址,
再將FackBrowser停用(Disabled),
這時會跳出對話框,詢問使用者要使用哪一個瀏覽器開啟。
因為預設值已經被清除了。
至於為什麼這樣就能清除,
這可能需要看原始碼才能知道了。
感覺真像個bug.
清除其他預設值只要改一下intent-filter,
還有startActivity的intent加入對應的category.
就大功告成了。
沒有留言:
張貼留言