如何根据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
定义为 true
。 res/values-v23/bools.xml
会将 is23
定义为 true
,将 isPre23
定义为 false
。您的 23 岁之前 activity 会 android:enabled="@bool/isPre23"
;您的 23 岁及以上 activity 会 android:enabled="@bool/is23"
。这样,根据 API 级别,只会为该操作字符串启用一个 activity。
如果您处在一些您无法控制的显式 Intent
用于启动 activity 的怪诞场景中,您总共需要 三个个活动:
23岁之前的那个。
23岁以上
由显式 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 中的一个静态方法。
我想要一个 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
定义为 true
。 res/values-v23/bools.xml
会将 is23
定义为 true
,将 isPre23
定义为 false
。您的 23 岁之前 activity 会 android:enabled="@bool/isPre23"
;您的 23 岁及以上 activity 会 android:enabled="@bool/is23"
。这样,根据 API 级别,只会为该操作字符串启用一个 activity。
如果您处在一些您无法控制的显式 Intent
用于启动 activity 的怪诞场景中,您总共需要 三个个活动:
23岁之前的那个。
23岁以上
由显式
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 中的一个静态方法。