我正在尝试检查是否在运行时启用/禁用了某个活动(或任何其他应用程序组件类型)。
可以使用下一个代码:
final ComponentName componentName = new ComponentName(context, activityClass);
final PackageManager pm = context.getPackageManager();
final int result = pm.getComponentEnabledSetting(componentName);
但是the documentation上写的返回结果是:
返回组件的当前启用状态。可能是其中之一 COMPONENT_ENABLED_STATE_ENABLED,COMPONENT_ENABLED_STATE_DISABLED,或者 COMPONENT_ENABLED_STATE_DEFAULT。最后一个意味着组件 启用状态基于清单中的原始信息 在ComponentInfo中找到。
所以它不仅是启用/禁用,还是“默认”。
如果返回“COMPONENT_ENABLED_STATE_DEFAULT”,我怎么知道它是默认为启用还是禁用(在运行时)?
这个问题的原因是无论人们放入清单中的内容(“启用”属性),代码都应该有效。
是否有可能使用意图解析?
答案 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;
}
}