如何根据SDK版本选择Activity从launcher启动?

How to pick Activity to start from the launcher based on SDK version?

我有一个 Android 应用程序,它在启动器中有多个入口点。 其中一些需要比其他版本更高的 SDK 版本,如果设备的 SDK 版本低于它们的要求,我想禁用或隐藏它们。

我的清单基本上是这样的:

<application
    ...
    <activity
        android:name=".Activity1"
        ...
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Activity2"
        ...
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    ... // more launcher activities follows
</application>

Activity1需要SDK版本19,但是Activity2需要SDK版本21。我的最低SDK版本是19。 我希望在 SDK 版本 < 21 的设备上安装应用程序时隐藏 Activity2

我知道我可以像这样检查 Activity2onCreate 方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        finish();
        return;
    }
    ...
}

但 activity 显然仍会显示在启动器中。

我也知道这是一个相当独特的问题,对于大多数遇到同样问题的人来说,最简单且可能是最好的解决方案就是不要将多个活动作为启动器活动,但这行不通在我的用例中很好。

请不要在代码中这样做,唯一正确的方法是使用 android:enabled="true/false" 属性,它可以在 AndroidManifest.xml 文件中的组件上设置,例如ActivityBroadcastReceiver。不要硬编码布尔值,而是使用每 API 级别更改的布尔资源:

values/bools.xml: 默认情况下禁用这两个活动

<bool name="activity_1_enabled">false</bool>
<bool name="activity_2_enabled">false</bool>

values-v19/bools.xml: 在 SDK 19 上最多 20 activity 1 个启用,2 个禁用

<bool name="activity_1_enabled">true</bool>
<bool name="activity_2_enabled">false</bool>

values-v21/bools.xml: 在 SDK 21+ 上,两个活动都已启用

<bool name="activity_1_enabled">true</bool>
<bool name="activity_2_enabled">true</bool>

AndroidManifest.xml

<activity
    android:name=".Activity1"
    android:enabled="@bool/activity_1_enabled" />

<activity
    android:name=".Activity2"
    android:enabled="@bool/activity_2_enabled" />