Android设置默认应用程序、清除默认应用程序

设置默认应用程序


要将系统默认的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),则会弹出如下图的选择框,让用户选择打开哪个应用。如果用户勾选了“下次不再询问”、“不再提示”的话,那就代表设置该应用为默认的应用程序。

image

ps:Android6.0及以上,无法再设置WiFi类型的默认应用程序,浏览器、桌面等其他类型的应用,可以。

清除默认应用程序


如果用户在此之前已经设置了别的应用为默认的应用程序,但我们想清除掉,让用户重新选择新的默认程序。系统为此提供了个清除默认应用程序的api:

getPackageManager().clearPackagePreferredActivities(packageName);

这是然并卵的,系统级别的APP才具有权限使用。

对于第三方APP,我们只能另辟蹊径了。以设置WiFi默认应用程序为例,实现方法是:先设置一个空的Activity为默认,然后再将该空的Activity禁用,达到清除默认程序的目的。代码如下:

/**
     * 清除默认程序并设置默认程序(先设置一个空的Activity为默认,然后再将该空的Activity禁用,达到清除默认程序的目的。)
     * <p>
     *     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

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值