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