Android: динамический выбор активности запуска не всегда работает - PullRequest
3 голосов
/ 22 сентября 2011

Я прочитал несколько статей здесь (и в других местах), которые описывают, как динамически выбирать, какие действия показывать при запуске приложения.Ниже приведен мой код:

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();
    }
}

Оба ActivityOften и ActivityRare объявлены в манифесте (без категории средства запускаКонечно) и расширить ListActivity и Activity соответственно.В 99% случаев первым показанным действием является ActivityOften, основанный на RandomClass.getSomeStaticBoolean ().

Итак, запуская мое приложение с иконки в первый раз, я ломаюсь внутри StartupActivity.onCreate.Выбор сделан правильно.Но затем любые последующие попытки запустить приложение (из ярлыка или меню приложений) снова показывают ActivityOften.Никаких дальнейших разрывов внутри класса StartupActivity не происходит.Несмотря на то, что я знаю, что RandomClass.getSomeStaticBoolean () изменил значение и должно появиться ActivityRare, 1-е действие продолжает появляться.

Есть идеи?

Спасибо, Merci, Gracias, DankeГрейзи!Шон

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Это происходит потому, что ваше приложение загружается из стека истории.Установите android:noHistory=true в манифесте для ActivityOften и ActivityRare.Это должно решить вашу проблему.

2 голосов
/ 22 сентября 2011

Так же, как предложение, вы можете просто выполнить одно действие вместо трех, выбрав контент View динамически. т.е.

@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 ....
    }
}

Это будет означать, что вам нужно будет написать код установки в обоих представлениях об активности, что может стать немного запутанным.

...