我想要一个活动课,例如 ActivityLegacy ,适用于超过x级的API级别和活动类,例如 ActivityNew 适用于较新的设备。
我是否有可能在运行时选择正确的实现并加载它?我不想开始新的意图。
答案 0 :(得分:4)
嗯,嗯,让活动出现在屏幕上的唯一方法是通过我不想开始新的意图。
Intent
。 有人正在调用startActivity()
或亲属。无论是您的代码还是第三方代码都取决于具体情况。
我是否有可能在运行时选择正确的实现并加载它?
如果您是致电startActivity()
的人,请为您想要的班级制作Intent
。
如果你不是那个叫startActivity()
的人,我建议你只有一个活动,然后使用片段(或类似的东西)作为活动内容,这样你就可以干净地加载正确的片段在API级别上。否则,你有两个我能想到的主要选择。
如果外线方使用隐式Intent
(例如,操作字符串)来启动您的活动,则清单中可能有两个<activity>
元素用于相同的<action>
,一个用于您的两个实现中的每一个。但是,它们每个都会android:enabled
指向布尔资源,其中这些资源会因API级别而异。假设您想在Android 6.0上使用与旧版本不同的活动。 res/values/bools.xml
会将is23
定义为false
,将isPre23
定义为true
。 res/values-v23/bools.xml
会将is23
定义为true
,将isPre23
定义为false
。您的23之前的活动将android:enabled="@bool/isPre23"
;您的23岁及以上活动将有android:enabled="@bool/is23"
。这样,系统只会根据API级别为该操作字符串启用一个活动。
如果您处于某种螺旋式场景中,您无法控制的显式Intent
是用于启动活动的那个,则需要总共三个活动:
23岁以前的人。
23岁以上。
由明确的Intent
标识的那个,它将使用Theme.NoDisplay
(因此它没有UI)。在onCreate()
中,您可以根据API级别调用startActivity()
获取正确的活动,然后调用finish()
,将控制权转移到所需的活动。
答案 1 :(得分:0)
答案 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);
根据需要添加任意数量的备用类,但始终在原始活动中调用一个静态方法。