要将系统默认的WiFi连接程序或者浏览器更改为我们自己的应用,可以通过隐式意图来实现。Intent设置相应的Action,以WiFi为例:
Intent intent = new Intent("android.settings.WIFI_SETTINGS");
if (intent.resolveActivity(getPackageManager())) {
startActivity(intent);
}
在AndroidManifest.xml里注册IntentFilter:
<activity android:name="com.***.WiFiActivity">
<intent-filter>
<action android:name="android.settings.WIFI_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
intent-filter>
activity>
如果系统存在有多个注册了该类型行为IntentFilter的组件(比如Activity),则会弹出如下图的选择框,让用户选择打开哪个应用。如果用户勾选了“下次不再询问”、“不再提示”的话,那就代表设置该应用为默认的应用程序。
ps:Android6.0及以上,无法再设置WiFi类型的默认应用程序,浏览器、桌面等其他类型的应用,可以。
如果用户在此之前已经设置了别的应用为默认的应用程序,但我们想清除掉,让用户重新选择新的默认程序。系统为此提供了个清除默认应用程序的api:
getPackageManager().clearPackagePreferredActivities(packageName);
这是然并卵的,系统级别的APP才具有权限使用。
对于第三方APP,我们只能另辟蹊径了。以设置WiFi默认应用程序为例,实现方法是:先设置一个空的Activity为默认,然后再将该空的Activity禁用,达到清除默认程序的目的。代码如下:
/**
* 清除默认程序并设置默认程序(先设置一个空的Activity为默认,然后再将该空的Activity禁用,达到清除默认程序的目的。)
*
* Android6.0及以上无法设置wifi默认程序,但设置为默认浏览器等其他类型的,是可以的
*/
public void clearDefaultAndSet() {
PackageManager pm = getPackageManager();
String pn = getPackageName();
String hn = FakeActivity.class.getName();
ComponentName cn = new ComponentName(pn, hn);
Intent intent = new Intent("android.settings.WIFI_SETTINGS");
intent.addCategory("android.intent.category.DEFAULT");
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
pm.setComponentEnabledSetting(cn, 1, 1);
startActivity(intent);
pm.setComponentEnabledSetting(cn, 0, 1);
}
FakeActivity继承了Activity,没有任何有意义的内容,在AndroidManifest.xml声明并加上IntentFilter即可:
<activity android:name="com.***.FakeActivity"
android:enabled="false" >
<intent-filter>
<action android:name="android.settings.WIFI_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
intent-filter>
activity>
这样,我们无需任何权限就把默认应用程序给清除了,貌似有点黑科技的感觉。。。
ps:以上是直接清除了默认应用程序,但需求往往都是先判断当前默认应用程序是否为我们自己的应用,如果不是才调用clearDefaultAndSet()方法清除掉。。各位见需使用。
再ps,获取当前默认应用程序的代码如下:
PackageManager pm = getPackageManager();
Intent intent = new Intent("android.settings.WIFI_SETTINGS");
ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
Log.i(TAG, "当前默认程序的包名pkgName = " + info.activityInfo.packageName);
未设置默认,info.activityInfo.packageName=android
设置了默认,info.activityInfo.packageName=com.aaa.bbb