Программно возобновить деятельность ребенка

Короче говоря, я разрабатываю многофункциональное приложение для Amazon Kindle. У Kindle есть несколько экзотический лаунчер, который не поддерживает (правильно) более одного LAUNCHER активность в manifest, поэтому, если вы находитесь на дочернем действии, перейдите на начальный экран, затем снова нажмите значок приложения, дочернее действие прекратится, и основное действие будет перезапущено.

У меня есть 2 действия: ACTIVITY_PLAY и ACTIVITY_DESIGNER. Типичный сеанс начинается в ACTIVITY_PLAY, затем пользователь может перейти к ACTIVITY_DESIGNER, чтобы выполнить некоторую работу. Это действие создается ACTIVITY_PLAY. Если он / она покидает приложение на мгновение (т.е. проверяет почту), то попытка возврата приведет к запуску PLAY_MODE.

Чтобы решить эту проблему, я создал действие "Launcher" (см. Источник ниже), которое теперь является единственной точкой входа в приложение. Это действие решает, запускать ли ACTIVITY_PLAY или ACTIVITY_DESIGN в зависимости от статического значения, которое я изменяю из этих действий "onResume": последнее полученное onResume - это последнее действие, над которым работал пользователь.

Моя проблема в том, что теперь, когда я выбираю значок приложения в панели запуска, он запускает правильное действие, НО перезапускает его, даже если все задействованные действия имеют android:launchmode = singleTask, Также все вовлеченные действия имеют то же самое android:taskAffinity,

Есть идеи? Правильно ли объявить 3 действия (Launcher/Play/Design) с одной и той же taskAffinity? Разве это не должно работать?

public class Launcher extends Activity {

    private static final String TAG = "Launcher";
    public static final int ACTIVITY_PLAY=1, ACTIVITY_DESIGN=2, ACTIVITY_QUIT=3;

    private static int msFocused=FUNQ_PLAY;

    private void launch() {

        Bundle bundle=getIntent().getExtras();

        switch (msFocused) {
        case ACTIVITY_DESIGN:
            Log.v(TAG, "*** Launcher launch DESIGNER");
            Misc.runActivity(this, DesignActivity.class, bundle);
            break;
        case ACTIVITY_QUIT: // special code to quit instead of launching anything
            finish();
            setFocused(ACTIVITY_PLAY); // so next button press will launch play mode if the app is still alive
            break;
        case ACTIVITY_PLAY:
        default:
            Log.v(TAG, "*** Launcher launch PLAYER");
            Misc.runActivity(this, PlayActivity.class, bundle);
            break;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        launch();
    }

    // called from the child activities' onResume.
    public static void setFocused(int activityCode) {
        Log.i(TAG, "*** CURRENTLY FOCUSED IS "+activityCode);
        msFocused=activityCode;
    }

}

2 ответа

Решение

Мне удалось это решить, надеюсь, это кому-нибудь пригодится.

Launcher: taskAffinity=".launcher" launchMode="normal"
Master Activity: taskAffinity=".workflow" launchMode="singleTop"
Child Activity: taskAffinity=".workflow" launchMode="singleTop"

Отключение лаунчера от задачи рабочего процесса и нормальное launchMode кажется, делает трюк для Kindle. Функция SingleTop специфична для моих приложений, возможно, не связана с проблемой, но я изначально тоже использовал singleTop в панели запуска, и это, очевидно, привело к побочному эффекту моего вопроса.

Вы можете использовать SharedPreferences, чтобы сохранить последнее состояние, а затем проверить SharedPreferences, чтобы решить, какое действие начать. Я добавлю пример кода через минуту.

Изменить: вот пример кода:

в своей деятельности по запуску функция onCreateView делает что-то вроде этого:

SharedPreferences reader = pActivity.getSharedPreferences( "PutDesiredPrefNameHere", Context.MODE_PRIVATE);

int lastState = reader.getInt( "LAST_STATE", 0 ); //if there is no last state saved it will return second parameter. 0 in this situation.

switch( lastState ){

     case 0:
            Intent i=new Intent( this, PlayModeActivity.class);
        startActivity(i);

        //Remove launcher activity
        finish();
            break;

     case 1:
            Intent i=new Intent( this, EditModeActivity.class);
        startActivity(i);

        //Remove launcher activity
        finish();
            break;

}

и в методе onCreateView вашей PlayModeActivity вызовите это:

  SharedPreferences.Editor writer = pActivity.getSharedPreferences( "PutDesiredPrefNameHere" , Context.MODE_PRIVATE).edit();   //Don't forget pref names must be same

  write.putInt( "LAST_STATE" ,0 );
  write.comit();

и в методе onCreateView вашего EditModeActivity вызовите это:

  SharedPreferences.Editor writer = pActivity.getSharedPreferences( "PutDesiredPrefNameHere" , Context.MODE_PRIVATE).edit();   //Don't forget pref names must be same

  write.putInt( "LAST_STATE" ,0 );
  write.comit();

Вот ссылка о SharedPreferences:

http://www.tutorialspoint.com/android/android_shared_preferences.htm

Другие вопросы по тегам