如何根据 Android API 级别加载不同的 Activity 实现?

Pet*_*eas 3 android runtime android-activity

我想要一个活动类,例如ActivityLegacy,用于比级别 x 更旧的 API 级别和一个活动类,例如ActivityNew用于较新的设备。

我有可能在运行时选择正确的实现并加载它吗?我不想开始一个新的意图。

Com*_*are 6

我不想开始一个新的意图。

嗯,让活动出现在屏幕上的唯一方法是通过Intent. 有人在打电话startActivity()或亲戚。这是您的代码还是第三方代码取决于具体情况。

我有可能在运行时选择正确的实现并加载它吗?

如果您是来电者startActivity(),请Intent为您想要的班级制作 。

如果您不是调用startActivity(),我建议您只有一个活动,然后为活动内容使用片段(或类似的东西),以便您可以根据 API 级别干净地加载正确的片段。否则,你有两个我能想到的主要选择。

如果外部方使用隐式Intent(例如,操作字符串)来启动您的活动,则清单中可以有两个<activity>相同的元素<action>,一个用于两个实现中的每一个。但是,它们每个都android:enabled指向布尔资源,这些资源会因 API 级别而异。假设您希望在 Android 6.0 上使用与旧版本不同的活动。res/values/bools.xml将定义is23falseisPre23成为trueres/values-v23/bools.xml将定义is23trueisPre23成为false。您 23 岁之前的活动将有android:enabled="@bool/isPre23";您 23 岁及以上的活动将有android:enabled="@bool/is23". 这样,根据 API 级别,只会为该操作字符串启用一个活动。

如果您处于某些Intent您无法控制的显式场景中用于启动活动的显式场景,则您总共需要三个活动:

  1. 前 23 之一。

  2. 23 岁以上的人。

  3. 由该显式标识的一个Intent,它将使用Theme.NoDisplay(因此它没有用户界面)。在 中onCreate(),您将startActivity()根据 API 级别调用正确的活动,然后调用finish(),将控制权传递给所需的活动。