我如何使Activity intentFilter操作从strings.xml动态化

时间:2019-01-02 11:03:39

标签: android action intentfilter android-productflavors

我使用了不同的产品口味,并通过如下所示预定义动作的intentFilter打开了一个Activity。

<activity android:name=".MyActivity"
          android:screenOrientation="portrait">
    <intent-filter>
          <action android:name="com.package.name.MyAction"/>
          <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

我要使用以下方法打开此活动:

Intent intent = new Intent("com.package.name.MyAction");
startActivity(intent);

现在,如果我的设备同时具有两种产品口味apk,则选择器将针对某个设备打开哪个活动应用程序,对于某些设备则显示错误no app found to perform the action

一旦我卸载了一个应用程序,并且仅在我的设备中保留了一个应用程序,一切正常。

我想克服的一个解决方案是使动作恒定为Intent intent = new Intent("com.package.name.MyAction"); context.startActivity(intent);动态。但是我不确定该怎么做。

我是AndroidManifest,应该为:

<action android:name="com.package.name.MyAction"+getString(R.string.product_name)/>

这是我无法在AndroidMaifest中获取字符串的部分。

要打开活动,我已经完成:

Intent intent = new Intent("com.package.name.MyAction"+getString(R.string.product_name));
startActivity(intent);

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:3)

在您的build.gradle(应用程序)中,如下配置您的口味:

    productFlavors {
        first {
            // ...
            manifestPlaceholders = [action: "com.package.name.ActionA"]
        }

        second {
            // ...
            manifestPlaceholders = [action: "com.package.name.ActionB"]
        }
    }

然后将占位符的值放在AndroidManifest.xml文件中:

    <activity android:name=".MyActivity"
              android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="${action}"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>

为了让占位符打开活动,只需通过BuildConfig进行操作即可:

    String yourAction = BuildConfig.action;
    // start your intent here