赞
踩
PackageManager提供了一个方法,setComponentEnabledSetting(),这个方法的作用是启用或者禁用四大组件,比如我们想禁用一个服务,就可以使用下面的方法,传入的参数就是服务的名称。
- /**
- * 禁用组件
- * @param context 上下文
- * @param className 组件类名
- */
- private fun disableComponent(context: Context, className: String) {
- val componentName = ComponentName(context, className)
- if (isComponentDisabled(context, componentName)) return //已经禁用
-
- context.packageManager.setComponentEnabledSetting(
- componentName,
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP
- )
- }
如果想重新启用的话,也是上面的方法,只是setComponentEnabledSetting()第二个参数值不一样,我们只需要将
PackageManager.COMPONENT_ENABLED_STATE_ENABLED替换PackageManager.COMPONENT_ENABLED_STATE_DISABLED即可。
- /**
- * 启用组件
- * @param context 上下文
- * @param className 组件类名
- */
- private fun enableComponent(context: Context, className: String) {
- val componentName = ComponentName(context, className)
-
- if (isComponentEnabled(context, componentName)) return //已经启用
-
- context.packageManager.setComponentEnabledSetting(
- componentName,
- PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
- PackageManager.DONT_KILL_APP
- )
- }
还有获取组件状态的方法,就是getComponentEnabledSetting(componentName)
,具体的代码如下,分别是获取可用状态和禁用状态的方法。
- /**
- * 组件是否处于可用状态
- */
- @JvmStatic
- fun isComponentEnabled(context: Context, componentName: ComponentName): Boolean {
- val state: Int = context.packageManager.getComponentEnabledSetting(componentName)
- return PackageManager.COMPONENT_ENABLED_STATE_ENABLED == state
- }
- /**
- * 组件是否处于禁用状态
- */
- @JvmStatic
- fun isComponentDisabled(context: Context, componentName: ComponentName): Boolean {
- val state: Int = context.packageManager.getComponentEnabledSetting(componentName)
- return PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state
- }
有了上面的方法,我们就可以无需发布版本,就可以更换app的图标了,我们只需要在Manifest中注册SplashActivity的别名,然后设置对应的图标,就可以更换app的图标,当然从代码执行到更换完成还是需要几分钟的延迟的,这点无法避免。
- <activity-alias
- android:name=".SplashAlias11Activity"
- android:enabled="false"
- android:icon="@mipmap/done"
- android:targetActivity=".SplashActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity-alias>
有了上面的别名,我们可以在启用的时候,传入别名即可。
enableComponent(context,"com.example.viewtest.SplashAlias11Activity")
具体更换图标思路可以参考:双11快到了,不给你的APP加上自动换图标的功能吗? - 简书双11快到了,不给你的APP加上自动换图标的功能吗? - 简书双11快到了,不给你的APP加上自动换图标的功能吗? - 简书
2、setApplicationEnabledSetting()方法
setApplicationEnabledSetting()方法是PackageManager提供的禁用app的方法,一般只能用来禁用自己,不能禁用其他app,否则会报错误,因为系统会判断禁用的应用uid和当前应用的uid是否一致,如果不一致,就会报错。下面是源码,使用这个方法需要权限。
- /**
- * Set the enabled setting for an application
- * This setting will override any enabled state which may have been set by the application in
- * its manifest. It also overrides the enabled state set in the manifest for any of the
- * application's components. It does not override any enabled state set by
- * {@link #setComponentEnabledSetting} for any of the application's components.
- *
- * @param packageName The package name of the application to enable
- * @param newState The new enabled state for the application.
- * @param flags Optional behavior flags.
- */
- @RequiresPermission(value = android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE,
- conditional = true)
- public abstract void setApplicationEnabledSetting(@NonNull String packageName,
- @EnabledState int newState, @EnabledFlags int flags);
使用方法:
context.packageManager..setApplicationEnabledSetting("com.example.viewtest", PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
其他参数介绍:
COMPONENT_ENABLED_STATE_DEFAULT:0 恢复组件进入默认的状态
COMPONENT_ENABLED_STATE_ENABLED:1 启用组件
COMPONENT_ENABLED_STATE_DISABLED:2 禁用组件
COMPONENT_ENABLED_STATE_DISABLED_USER:3 由用户禁用app,所以是可以重新启用的,只能setApplicationEnabledSetting()方法使用
COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:4 也是禁用app,但是使用者还是可以在界面上看到app,点击之后就会重新启用,状态改为enabled,只能setApplicationEnabledSetting()方法使用
原文链接:https://blog.csdn.net/StudyOfAndroid/article/details/109678471
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。