Search code examples
androiddynamicandroid-activitylauncher

Android: dynamically choosing a launch activity doesn't always work


I've read a few articles here (and other places) that describe how to dynamically choose which activity to show when launching an app. Below is my code:

AndroidManifest.xml

<activity android:name=".StartupActivity"
          android:theme="@android:style/Theme.NoDisplay">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

StartupActivity.java

public class StartupActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        Intent intent;
        if (RandomClass.getSomeStaticBoolean())
        {
           intent = new Intent(this, ActivityOften.class);
        }
        else
        {
           intent = new Intent(this, ActivityRare.class);
        }
        startActivity(intent);
        finish();
    }
}

Both ActivityOften and ActivityRare are declared in the manifest (without the launcher category of course) and extend ListActivity and Activity respectively. 99% of the time the 1st activity to get shown is ActivityOften based on RandomClass.getSomeStaticBoolean().

So launching my app from the icon for the 1st time I break inside the StartupActivity.onCreate. The choice is properly made. But then any subsequent attempts to launch the app (from a shortcut or the apps menu) show the ActivityOften again. No further breaks occur inside the StartupActivity class. Despite the fact that I know that RandomClass.getSomeStaticBoolean() has changed value and that ActivityRare should appear, the 1st activity keeps popping up.

Any ideas?

Thanks, Merci, Gracias, Danke, Grazie! Sean


Solution

  • Just as a suggestion, you could just have one activity instead of three by choosing the content View dynamically. i.e.

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    
        if (RandomClass.getSomeStaticBoolean())
        {
           setContentView(R.layout.Often);
    
           // Set up often ....
        }
        else
        {
           setContentView(R.layout.Rare);
    
           // Set up rare ....
        }
    }
    

    This would mean that you would have to write setup code both views in on activity, which can get a bit messy.