在开发中,需要用到Android新版本的特性,而又要适配旧版本。如何让Activity低版本中不显示,而高版本无影响呢?

在查看APIDemos源码时,看到AndroidManifest.xml中有这样一段

AndroidManifest.xml
1
2
3
4
5
6
<activity android:name=".animation.AnimationLoading"
android:enabled="@bool/atLeastHoneycomb">
<intent-filter>
...
</intent-filter>
</activity>

android:enabled这个属性是控制Activity是否能被实例化的。
@bool/atLeastHoneycomb是指values/bools.xml中的atLeastHoneycomb属性的值。
该文件定义了许多与平台相关的atLeastXxx属性,默认值都是false

在APIDemos/src/res/ 目录下有许多的values-vXX目录,各自下面都有bools.xml
values-v11/bools.xml中可以看到

bools.xml
1
2
3
4
<resources>
<!-- True if running under Honeycomb or later. -->
<bool name="atLeastHoneycomb">true</bool>
</resources>

即,.animation.AnimationLoading这个Activity在v11版本以上系统可以被实例化,以下则不能。
如此便做到了让应用更好的适配各个版本。

延伸:

activity-alias
为某个Activity起别名,重复使用同一个Activity,同样可以做到平台相关的一些处理:
比如有Activity需要在Launcher上创建入口,但又不想在低版本上这样做。

AndroidManifest.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<activity
android:name=".SettingsActivity"
. . . >
</activity>
<activity-alias
android:name=".MyActivityAlias"
android:label="@string/settings"
android:targetActivity=".SettingsActivity"
android:enabled="@bool/show_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
values-v14/bools.xml
1
<bool name="show_settings">true</bool>
values/boolsxml
1
<bool name="show_settings">false</bool>

为SettingsActivity应用别名,当v14以上时,别名生效,允许实例化。而在低版本中则没有入口