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

How to load different activity implementation according to Android API level?

我想要一个 activity class,例如ActivityLegacy,对于 API 级别早于级别 x 和 activity class,例如ActivityNew 适用于较新的设备。

是否可以在运行时选择正确的实现并加载它?我不想开始新的意图。

I don't want to start a new intent.

嗯,让 activity 出现在屏幕上的唯一方法是通过 Intent有人 打电话给 startActivity() 或亲属。那是您的代码还是第三方代码将视情况而定。

Is it possible that I choose the proper implementation at runtime and load it?

如果您是呼叫 startActivity() 的人,请为您想要的 class 制作 Intent

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

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

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

  1. 23岁之前的那个。

  2. 23岁以上

  3. 由显式 Intent 标识的那个将使用 Theme.NoDisplay(因此它没有 UI)。在 onCreate() 中,你会根据 API 级别为右边的 activity 调用 startActivity(),然后调用 finish(),将控制权传递给所需的 activity ].

您只能以编程方式选择下一个 activity。 如果您想在您的应用中选择第一个 activity,我建议在应用启动时启动透明 activity,然后启动另一个 activity。 阅读 this to create a transparent activity. Also in the code do this.

假设您从以下内容开始活动:

Intent i = new Intent(getActivity(), ActivityToStart.class);
startActivity(i);

现在您意识到您需要为 API 15 及以下版本做一些不同的事情,因此您可以向原始 activity 添加一个静态方法来为您提供替代方法 Class:

public static Class correctClass(){
    if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1){
        return ActivityToStart.class;
    else {
        return ActivityToStartLegacy.class;
    }
}

现在在必要时将 .class 替换为 .correctClass()。

Intent i = new Intent(getActivity(), ActivityToStart.correctClass());
startActivity(i);

根据需要添加尽可能多的备用 classes,但始终调用原始 activity 中的一个静态方法。