Android:如何使用<activity-alias> </activity-alias>在代码中创建componentName

时间:2014-05-28 18:34:51

标签: android android-activity components

我有一个功能,我只想在满足某些条件时才可用,所以我有这个活动别名:

<activity-alias android:name="share-files-text"
                    android:targetActivity=".MyActivity"
                    android:exported="true"
                    android:enabled="false">
        <intent-filter android:label="@string/open_with">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:mimeType="application/pdf" />
            <data android:mimeType="image/*" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity-alias>

进入活动后,我有了这个代码来启用组件

        String packageName = getPackageName();
        ComponentName componentWithTextFiles = new ComponentName(packageName, "share-files-text");
        ComponentName componentWithoutTextFiles = new ComponentName(packageName, "share-files");
        if(DebugAndTestSettings.ENABLE_TEXT_SLIDE){
            getPackageManager().setComponentEnabledSetting(componentWithTextFiles, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
            getPackageManager().setComponentEnabledSetting(componentWithoutTextFiles, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
        } else {
            getPackageManager().setComponentEnabledSetting(componentWithTextFiles, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
            getPackageManager().setComponentEnabledSetting(componentWithoutTextFiles, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
        }

问题是崩溃说包blabla没有包含名为share-files-text的活动,如何禁用/启用这个元素起诉别名? 感谢

编辑:我从这篇文章中得到了这个想法: Android: Can I enable/disable an activity's intent filter programmatically?

2 个答案:

答案 0 :(得分:5)

我找到了使用此代码的解决方案

String packageName = getPackageName();
try {
    PackageInfo p = getApplicationContext().getPackageManager().getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
    for (ActivityInfo activityInfo : p.activities) {
        if(log.d()) log.d("ACT " + activityInfo.name+" "+activityInfo.packageName);
    }
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

如果您的别名是“别名”

ComponentName componentWithoutTextFiles = new ComponentName(packageName, packageName".alias");

答案 1 :(得分:4)

@vallllll给出的解决方案工作正常,我试图进行投票或评论,但我无法做到仍然需要声望点。

我在其他问题上尝试过很多其他解决方案而且没有用。这里给出的解决方案是唯一一个为我工作的解决方案

在将代码从sdk 18迁移到sdk 26之后我遇到的问题,我得到了这个错误在Y中不存在Component class x,同时调用setComponentEnabledSetting 从Activity切换到Alias-Activity时 旧代码

      getPackageManager().setComponentEnabledSetting(
   new ComponentName(pkg name, alias name),
   PackageManager.COMPONENT_ENABLED_STATE_ENABLED,    PackageManager.DONT_KILL_APP);

新代码

getPackageManager().setComponentEnabledSetting(
        new ComponentName(this, pkg name + alias name,
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

进行了两项修改, 1-更改ComponentName构造函数以使用接受上下文和类名称的版本,而不是使用pkg name,class name接受构造函数版本 2-使用完全限定的别名+ 为了获得完全限定的别名,我使用了以下代码

String packageName = getPackageName();
    try {
        PackageInfo p =         getApplicationContext().getPackageManager().getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        for (ActivityInfo activityInfo : p.activities) {
            Log.d(LOG_TAG, "ACT " + activityInfo.name+" "+activityInfo.packageName );
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }