Короче говоря, я разрабатываю многофункциональное приложение для 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;
}
}