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

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

У меня два действия: 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) с одной и той же задачей Affinity? Разве это не должно работать?

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

}

person rupps    schedule 12.08.2014    source источник


Ответы (2)


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

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

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

person rupps    schedule 12.08.2014

Вы можете использовать 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();

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

  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

person Arda Kara    schedule 12.08.2014
comment
Я уже решил задачу решить какую запускать. Моя проблема в том, что эта деятельность ПЕРЕЗАПУСКАЕТСЯ, а не возобновляется! - person rupps; 12.08.2014
comment
Извините за недоразумение, я постараюсь найти для вас решение. - person Arda Kara; 12.08.2014
comment
stackoverflow.com/ questions / 9541991 / вы можете попробовать предлагаемые здесь ответы или создать сохраненный экземпляр и сохранить его с помощью ObjectOutputStream и при необходимости перезагрузить с помощью ObjectInputStream. Вы можете проверить эту ссылку, чтобы узнать, как сохранить состояние: stackoverflow .com / questions / 151777 / - person Arda Kara; 12.08.2014
comment
спасибо за исследование, но, к сожалению, это не очень связано, я предполагаю, что это больше связано с TaskAffinities и LaunchModes, поскольку приложение определенно живо, только оно перезапускается, отбрасывая свое предыдущее состояние :( - person rupps; 12.08.2014
comment
Я сделал правку и добавил ссылку для сохранения состояния. Если хочешь, я могу объяснить идею немного подробнее. - person Arda Kara; 12.08.2014
comment
Спасибо, но я ищу не этот маршрут! Я уже сохраняю состояние. Я стараюсь избежать перезапуска, а не обходного пути, мое приложение довольно тяжелое, и я теряю много вещей, просто чтобы его воссоздать. - person rupps; 12.08.2014
comment
Сделать его как сервис - хороший совет, но его все равно можно перезапустить. Я не думаю, что есть способ предотвратить убийство вашего приложения Android, если оно довольно тяжелое. Вы можете проверить ответ Ценга здесь: forum.unity3d.com/ темы / - person Arda Kara; 12.08.2014
comment
Привет! Мне удалось это решить, проблема заключалась в том, что лаунчер неправильно настроил launchMode = singleTop. Мне нужна эта настройка для занятий. Таким образом, если поместить действия Play и Design в одну и ту же группу по интересам, а средство запуска - вне нее, и без singleTop, наконец, это поможет! Тем не менее, спасибо за вашу преданность! - person rupps; 13.08.2014
comment
Если я помог, вы можете проголосовать «за» и не забудьте ответить на свой вопрос, чтобы поделиться своим решением с другими. Рад слышать, что вы решили это :) Редактировать: Я только что видел, как вы ответили извините. - person Arda Kara; 13.08.2014