【问题标题】:Enable or disable launch intent-filter activities with one button一键启用或禁用启动意图过滤器活动
【发布时间】:2016-12-05 13:15:32
【问题描述】:

我有一个包含多个活动的应用程序,它们在清单中都有一个启动意图过滤器,因此它们可以在启动器上显示多个图标,有一个主要活动,其余的默认情况下被禁用 android:enabled="false"这是我清单的一部分:

    <activity
        android:name="com.myapp.MainActivity"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.myapp.Activity_1"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/secondary_activity"
        android:enabled="false">// HERE I DISABLE THE ACTIVITY
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

我找到了一种使用以下代码启用或禁用其他活动的方法:

public static void enableComponent(Context context, Class<?> componentClass, boolean isEnable) {
   int enableFlag = isEnable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
   context.getPackageManager().setComponentEnabledSetting(new ComponentName(context, componentClass), enableFlag, PackageManager.DONT_KILL_APP);
}
private void setupDetailsOverviewRowPresenter() {
  detailsPresenter.setOnActionClickedListener(new OnActionClickedListener() {

    @Override
    public void onActionClicked(Action action) {
        if (action.getId() == ACTION_ENABLE){
                mSelectedApp = (App) getActivity().getIntent().getSerializableExtra(DetailsActivity.APP);
                enableComponent(mContext, com.myapp.Activity_1.class, true);
            }
        }else if (action.getId() == ACTION_DISABLED){
                mSelectedApp = (App) getActivity().getIntent().getSerializableExtra(DetailsActivity.APP);
                enableComponent(mContext, com.myapp.Activity_1.class, false);
        }
       }
    });
}

这通过使用ACTION_ENABLEACTION_DISABLE 按钮启用或禁用活动非常有效,但这不利于可用性,相反我想只使用一个按钮来启用或禁用活动。

我需要知道的是如何获取活动的状态,所以如果活动是android:enabled="false",则显示带有ACTION_EANBLE 的按钮,如果活动是android:enabled="true",则显示带有ACTION_DISABLE 的按钮。

【问题讨论】:

  • 添加一个布尔值来指示您班级的开/关状态?
  • 你能再解释一下吗?我不是很好的布尔值

标签: android android-intent


【解决方案1】:

您可以查询PackageManager 以确定是否启用了组件:

PackageManager pm = getPackageManager();
ComponentName cn = new ComponentName(...);
ActivityInfo info = pm.getActivityInfo(cn, 0);
if (info != null && info.enabled) {
    // Component is enabled
    ...
} else {
    // Component is disabled
    ... 
}

【讨论】:

  • 这给出了一个未处理的异常:“android.content.pm.PackageManager.NameNotFoundException”
  • 你传递给 ``getActivityInfo()` 的是什么?
  • 活动名称,类似com.myapp.Activity_1,我应该放什么?
  • 实际上禁用活动列表在一个名为快捷方式的子文件夹中,所以我真的通过com.valecast.myapplication.shortcuts.shortcut_1
  • 请准确粘贴您创建ComponentName 的方式。您没有正确创建它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多