I don't want to start a new intent.
Um, well, the only way to get an activity to appear on the screen is via an Intent
. Somebody is calling startActivity()
or kin. Whether that is your code or third-party code would depend on circumstance.
Is it possible that I choose the proper implementation at runtime and load it?
If you are the one calling startActivity()
, craft the Intent
for your desired class.
If you are not the one calling startActivity()
, I would recommend that you have just one activity, then use fragments (or something similar) for the activity contents, so that you can cleanly load in the right fragment based on API level. Otherwise, you have two main options that I can think of.
If the outside party is using an implicit Intent
(e.g., action string) to start up your activity, you could have two <activity>
elements for the same <action>
in the manifest, one for each of your two implementations. However, they would each have android:enabled
pointing to boolean resources, where those resources would vary by API level. Suppose you want a different activity on Android 6.0 than on older versions. res/values/bools.xml
would define is23
to be false
and isPre23
to be true
. res/values-v23/bools.xml
would define is23
to be true
and isPre23
to be false
. Your pre-23 activity would have android:enabled="@bool/isPre23"
; your 23-and-above activity would have android:enabled="@bool/is23"
. This way, only one activity will be enabled for that action string, based on API level.
If you are in some screwball scenario where an explicit Intent
that you do not control is the one that is being used to start the activity, you would need a total of three activities:
The pre-23 one.
The 23-and-over one.
The one identified by that explicit Intent
, which would use Theme.NoDisplay
(so it has no UI). In onCreate()
, you would call startActivity()
for the right activity based on API level, then call finish()
, to pass control to the desired activity.