如何检查是否启用了活动?

时间:2014-11-16 11:23:35

标签: android android-activity android-manifest android-package-managers

背景

我正在尝试检查是否在运行时启用/禁用了某个活动(或任何其他应用程序组件类型)。

问题

可以使用下一个代码:

    final ComponentName componentName = new ComponentName(context, activityClass);
    final PackageManager pm = context.getPackageManager();
    final int result = pm.getComponentEnabledSetting(componentName);

但是the documentation上写的返回结果是:

  

返回组件的当前启用状态。可能是其中之一   COMPONENT_ENABLED_STATE_ENABLED,COM​​PONENT_ENABLED_STATE_DISABLED,或者   COMPONENT_ENABLED_STATE_DEFAULT。最后一个意味着组件   启用状态基于清单中的原始信息   在ComponentInfo中找到。

所以它不仅是启用/禁用,还是“默认”。

问题

如果返回“COMPONENT_ENABLED_STATE_DEFAULT”,我怎么知道它是默认为启用还是禁用(在运行时)?

这个问题的原因是无论人们放入清单中的内容(“启用”属性),代码都应该有效。

是否有可能使用意图解析?

4 个答案:

答案 0 :(得分:10)

  

如果返回COMPONENT_ENABLED_STATE_DEFAULT,我怎么知道默认为启用还是禁用?

您需要使用PackageManager加载所有组件,并检查匹配的ComponentInfo的启用状态。以下代码应该有效:

public static boolean isComponentEnabled(PackageManager pm, String pkgName, String clsName) {
  ComponentName componentName = new ComponentName(pkgName, clsName);
  int componentEnabledSetting = pm.getComponentEnabledSetting(componentName);

  switch (componentEnabledSetting) {
    case PackageManager.COMPONENT_ENABLED_STATE_DISABLED:
      return false;
    case PackageManager.COMPONENT_ENABLED_STATE_ENABLED:
      return true;
    case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT:
    default:
      // We need to get the application info to get the component's default state
      try {
        PackageInfo packageInfo = pm.getPackageInfo(pkgName, PackageManager.GET_ACTIVITIES
            | PackageManager.GET_RECEIVERS
            | PackageManager.GET_SERVICES
            | PackageManager.GET_PROVIDERS
            | PackageManager.GET_DISABLED_COMPONENTS);

        List<ComponentInfo> components = new ArrayList<>();
        if (packageInfo.activities != null) Collections.addAll(components, packageInfo.activities);
        if (packageInfo.services != null) Collections.addAll(components, packageInfo.services);
        if (packageInfo.providers != null) Collections.addAll(components, packageInfo.providers);

        for (ComponentInfo componentInfo : components) {
          if (componentInfo.name.equals(clsName)) {
            return componentInfo.isEnabled();
          }
        }

        // the component is not declared in the AndroidManifest
        return false;
      } catch (PackageManager.NameNotFoundException e) {
        // the package isn't installed on the device
        return false;
      }
  }
}

在我的设备上测试上述代码:

System.out.println(isComponentEnabled(getPackageManager(),
    "com.android.systemui",
    "com.android.systemui.DessertCaseDream"));

System.out.println(isComponentEnabled(getPackageManager(),
    "com.android.settings",
    "com.android.settings.DevelopmentSettings"));
  

     

答案 1 :(得分:1)

我认为字段<input id="kapakCode" name="kapakCode" placeholder="ör. D85C12Z5" type="text"> 表示AndroidManifest.xml文件中设置的值。如果未指定,则默认值为true。因此,在以下示例中:

ComponentInfo.enabled

BroadcastReceiver1 中的<receiver android:name=".BroadcastReceiver1" android:enabled="false" /> <receiver android:name=".BroadcastReceiver2" android:enabled="true" /> <receiver android:name=".BroadcastReceiver3" /> 字段为false, BroadcastReceiver2 中为true, BroadcastReceiver3 中为true,而{{1}为enabled如果AndroidManifest中的值被覆盖,则将返回ENABLED或DISABLED;如果未覆盖,则返回DEFAULT

然后,根据@Jared Rummler的回答,如果pm.getComponentEnabledSetting(componentName)返回pm.getComponentEnabledSetting(componentName),则实际值将是PackageManager.COMPONENT_ENABLED_STATE_DEFAULT字段中设置的值,它将与AndroidManifest中设置的值相同,而ComponentInfo.enabled将取决于整个申请状态

编辑:总结一下:

ComponentInfo.isEnabled()

答案 2 :(得分:0)

Jared Rummler的代码很好,虽然可以正常工作,但是却可以在清单中显示状态。

要在我的应用程序中拥有组件的当前状态,我需要通过“包上下文”和“组件类”而不是“包名称”和“类名”创建“ ComponentName”。

我在清单中将BroadcastReceiver设置为“ enabled = false”,之后,我使用包管理器在我的应用程序中启用了它,但Jared Rummler的代码始终返回“ STATE_ENABLED_DEFAULT”和“ enabled and isEnabled()”总是返回false。 使用“包上下文”和“组件类”,我直接获得了“ ENABLED_STATE_DISABLED”和“ ENABLED_STATE_ENABLED”,而无需使用默认部分中的代码,无论如何,如果我已经开始,“ enabled and isEnabled()”无论如何都会返回FALSE使用包管理器接收收件人。

希望这很有用,请参阅

public static void enableDisableComponent(Context pckg, Class componentClass, boolean enable){
ComponentName component = new ComponentName(pckg, componentClass);
if(enable == !checkIfComponentIsEnabled(pckg, componentClass)) {
    pckg.getPackageManager().setComponentEnabledSetting(
        component,
        enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP
    );
}

}

public static boolean checkIfComponentIsEnabled(Context pckg, Class componentClass){
            boolean ret = false;
            ComponentName componentName = new ComponentName(pckg, componentClass);
            int componentEnabled = pckg.getPackageManager().getComponentEnabledSetting(componentName);
            switch(componentEnabled){
                case PackageManager.COMPONENT_ENABLED_STATE_DISABLED:
                    break;
                case PackageManager.COMPONENT_ENABLED_STATE_ENABLED:
                    ret = true;
                    break;
                case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT:
                default:
                    ret = checkEnabledComponentsInfo(pckg, componentClass);
                    break;
            }
            return ret;
        }


private static boolean checkEnabledComponentsInfo(Context pckg, Class componentClass){
    boolean ret = false;
    try{
        PackageInfo packageInfo = pckg.getPackageManager().getPackageInfo(
            pckg.getPackageName(),
            PackageManager.GET_ACTIVITIES | PackageManager.GET_RECEIVERS |
                PackageManager.GET_SERVICES | PackageManager.GET_PROVIDERS |
                PackageManager.GET_DISABLED_COMPONENTS
        );
        List<ComponentInfo> componentsInfo = new ArrayList<>();
        if(packageInfo.activities != null && packageInfo.activities.length > 0){
            Collections.addAll(componentsInfo, packageInfo.activities);
        }
        if(packageInfo.services != null && packageInfo.services.length > 0){
            Collections.addAll(componentsInfo, packageInfo.services);
        }
        if(packageInfo.providers != null && packageInfo.providers.length > 0){
            Collections.addAll(componentsInfo, packageInfo.providers);
        }
        if(packageInfo.receivers != null && packageInfo.receivers.length > 0){
            Collections.addAll(componentsInfo, packageInfo.receivers);
        }
        if(componentsInfo.size() > 0){
            for(ComponentInfo info : componentsInfo){
                if(info.name.equals(componentClass.getName())){
                    ret = info.isEnabled();
                    break;
                }
            }
        }
    } catch(PackageManager.NameNotFoundException nnfE){
        onException(nnfE);
    }
    return ret;
}

答案 3 :(得分:-3)

试试这个。

public class MainActivity extends Activity {

    static boolean running = false;

    @Override
    public void onStart(){
        super.onStart();
        running = true;
    }

    @Override
    public void onStop(){
        super.onStop();
        running = false;
    }

}