如何从基于SDK版本的启动器中选择Activity?

时间:2017-12-13 09:42:09

标签: android android-5.0-lollipop android-4.4-kitkat

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

基本上我的Manifest看起来像这样:

<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版本&lt;的设备上安装应用程序时隐藏Activity2 21。

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

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

但是活动显然仍然会出现在发射器中。

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

1 个答案:

答案 0 :(得分:3)

请不要在代码中执行此操作,唯一正确的方法是使用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个活动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" />