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

时间:2015-09-28 12:06:33

标签: android android-activity runtime

我想要一个活动课,例如 ActivityLegacy ,适用于超过x级的API级别和活动类,例如 ActivityNew 适用于较新的设备。

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

3 个答案:

答案 0 :(得分:4)

  

我不想开始新的意图。

嗯,嗯,让活动出现在屏幕上的唯一方法是通过Intent有人正在调用startActivity()或亲属。无论是您的代码还是第三方代码都取决于具体情况。

  

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

如果您是致电startActivity()的人,请为您想要的班级制作Intent

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

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

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

  1. 23岁以前的人。

  2. 23岁以上。

  3. 由明确的Intent标识的那个,它将使用Theme.NoDisplay(因此它没有UI)。在onCreate()中,您可以根据API级别调用startActivity()获取正确的活动,然后调用finish(),将控制权转移到所需的活动。

答案 1 :(得分:0)

您只能以编程方式选择下一个活动。 如果您想在应用中选择第一个活动,我建议您在应用启动时启动透明活动,然后开始其他活动。 阅读this以创建透明活动。同样在代码中this.

答案 2 :(得分:0)

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

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

现在您意识到您需要为API 15及更低版本执行不同的操作,以便您可以向原始活动添加静态方法,以便为您提供替代类:

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;
    }
}

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

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

根据需要添加任意数量的备用类,但始终在原始活动中调用一个静态方法。