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

jpi*_*ihl 4 android android-4.4-kitkat android-5.0-lollipop

我有一个 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>
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以用这样的onCreate方法进行检查Activity2

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

但活动显然仍会出现在启动器中。

我也知道这是一个相当独特的问题,对于大多数有同样问题的人来说,最简单也可能是最好的解决方案是不要将多个活动作为启动器活动,但这在我的用例中效果不佳.

Rol*_*f ツ 5

请不要在代码中这样做,唯一正确的方法是使用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>
Run Code Online (Sandbox Code Playgroud)

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

<bool name="activity_1_enabled">true</bool>
<bool name="activity_2_enabled">false</bool>
Run Code Online (Sandbox Code Playgroud)

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

<bool name="activity_1_enabled">true</bool>
<bool name="activity_2_enabled">true</bool>
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml

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

<activity
    android:name=".Activity2"
    android:enabled="@bool/activity_2_enabled" />
Run Code Online (Sandbox Code Playgroud)