当前位置:   article > 正文

Android packageManager.setComponentEnabledSetting()和setApplicationEnabledSetting()方法介绍

setcomponentenabledsetting

1、setComponentEnabledSetting()方法

PackageManager提供了一个方法,setComponentEnabledSetting(),这个方法的作用是启用或者禁用四大组件,比如我们想禁用一个服务,就可以使用下面的方法,传入的参数就是服务的名称。

  1. /**
  2. * 禁用组件
  3. * @param context 上下文
  4. * @param className 组件类名
  5. */
  6. private fun disableComponent(context: Context, className: String) {
  7. val componentName = ComponentName(context, className)
  8. if (isComponentDisabled(context, componentName)) return //已经禁用
  9. context.packageManager.setComponentEnabledSetting(
  10. componentName,
  11. PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
  12. PackageManager.DONT_KILL_APP
  13. )
  14. }

如果想重新启用的话,也是上面的方法,只是setComponentEnabledSetting()第二个参数值不一样,我们只需要将
PackageManager.COMPONENT_ENABLED_STATE_ENABLED替换PackageManager.COMPONENT_ENABLED_STATE_DISABLED即可。
 

  1. /**
  2. * 启用组件
  3. * @param context 上下文
  4. * @param className 组件类名
  5. */
  6. private fun enableComponent(context: Context, className: String) {
  7. val componentName = ComponentName(context, className)
  8. if (isComponentEnabled(context, componentName)) return //已经启用
  9. context.packageManager.setComponentEnabledSetting(
  10. componentName,
  11. PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
  12. PackageManager.DONT_KILL_APP
  13. )
  14. }

还有获取组件状态的方法,就是getComponentEnabledSetting(componentName),具体的代码如下,分别是获取可用状态和禁用状态的方法。

  1. /**
  2. * 组件是否处于可用状态
  3. */
  4. @JvmStatic
  5. fun isComponentEnabled(context: Context, componentName: ComponentName): Boolean {
  6. val state: Int = context.packageManager.getComponentEnabledSetting(componentName)
  7. return PackageManager.COMPONENT_ENABLED_STATE_ENABLED == state
  8. }
  9. /**
  10. * 组件是否处于禁用状态
  11. */
  12. @JvmStatic
  13. fun isComponentDisabled(context: Context, componentName: ComponentName): Boolean {
  14. val state: Int = context.packageManager.getComponentEnabledSetting(componentName)
  15. return PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state
  16. }

有了上面的方法,我们就可以无需发布版本,就可以更换app的图标了,我们只需要在Manifest中注册SplashActivity的别名,然后设置对应的图标,就可以更换app的图标,当然从代码执行到更换完成还是需要几分钟的延迟的,这点无法避免。

  1. <activity-alias
  2. android:name=".SplashAlias11Activity"
  3. android:enabled="false"
  4. android:icon="@mipmap/done"
  5. android:targetActivity=".SplashActivity">
  6. <intent-filter>
  7. <action android:name="android.intent.action.MAIN" />
  8. <category android:name="android.intent.category.LAUNCHER" />
  9. </intent-filter>
  10. </activity-alias>

有了上面的别名,我们可以在启用的时候,传入别名即可。

enableComponent(context,"com.example.viewtest.SplashAlias11Activity")

具体更换图标思路可以参考:双11快到了,不给你的APP加上自动换图标的功能吗? - 简书双11快到了,不给你的APP加上自动换图标的功能吗? - 简书双11快到了,不给你的APP加上自动换图标的功能吗? - 简书

2、setApplicationEnabledSetting()方法
setApplicationEnabledSetting()方法是PackageManager提供的禁用app的方法,一般只能用来禁用自己,不能禁用其他app,否则会报错误,因为系统会判断禁用的应用uid和当前应用的uid是否一致,如果不一致,就会报错。下面是源码,使用这个方法需要权限。
 

  1. /**
  2. * Set the enabled setting for an application
  3. * This setting will override any enabled state which may have been set by the application in
  4. * its manifest. It also overrides the enabled state set in the manifest for any of the
  5. * application's components. It does not override any enabled state set by
  6. * {@link #setComponentEnabledSetting} for any of the application's components.
  7. *
  8. * @param packageName The package name of the application to enable
  9. * @param newState The new enabled state for the application.
  10. * @param flags Optional behavior flags.
  11. */
  12. @RequiresPermission(value = android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE,
  13. conditional = true)
  14. public abstract void setApplicationEnabledSetting(@NonNull String packageName,
  15. @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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/865773
推荐阅读
相关标签
  

闽ICP备14008679号