3

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

4

2 回答 2

3

It is happening because your application activity is loaded from the history stack. Set android:noHistory=true in the manifest for both ActivityOften and ActivityRare. That should solve your problem.

于 2011-09-30T09:37:42.613 回答
2

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.

于 2011-09-22T07:34:53.990 回答