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

how do i make Activity intentFilter action dynamic from strings.xml

我正在使用不同的产品口味,并通过 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>

为了打开这个 activity 我正在使用 :

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

现在,如果我的设备有两种产品风格的 apk,选择器会为某些设备打开哪个 activity 应用程序,对于某些设备它会显示错误 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 中获取字符串的部分。

打开 activity 我做了:

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

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

在您的 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>

为了让占位符打开activity,只需通过BuildConfig:

获取即可
    String yourAction = BuildConfig.action;
    // start your intent here