Дизайн / жизненный цикл: активность возобновляется при создании приложения; контролировать, какая активность отображается в зависимости от состояния приложения? - PullRequest
0 голосов
/ 13 октября 2011

Итак, вкратце, мое приложение имеет следующую процедуру запуска:

При запуске -> Запускает StartupActivity
StartupActivity -> Запускает MyService (startService, длительный запуск)
MyService подает некоторыетекст для StartupActivity, пока MyService не установит TCP-соединение с сервером
MyService затем запустит следующее действие, LoginActivity
LoginActivity отправит пакет входа в систему (через MyService), а когда ответ получен (в MyService), MyService запустит следующее действие, MainActivity,Итак:

StartupActivity -> LoginActivity -> MainActivity
|
+ ---> MyService

Тогда MainActivity является единственным действующим действием.

У меня есть несколько проблем:

1) Если я в любой момент времени нажму кнопку HOME, а затем захочу вернуться в приложение (щелкнув значок приложения), я хочу вернуться к любой активности, которая былавиден до нажатия кнопки HOME.Это может быть StartupActivity, LoginActivity или MainActivity.
Однако, если я нажимаю кнопку HOME, когда я нахожусь в LoginActivity, я всегда возвращаюсь к StartupActivity (даже если это завершило работу () и LoginActivity запускается с * Intent.FLAG_ACTIVITY_NEW_TASK *)

2) Я также заметил, что onCreate StartupActivity всегда выполняется, когда я возвращаюсь в приложение (как описано в 1 выше).Я ожидал, что StartupActivity.onCreate будет выполнен только один раз (если только он не был уничтожен, чего в данном случае нет).Когда я нажимаю значок запуска, запускается onCreate, а после этого onDestroy.Я понятия не имею, почему.

3) Каков наилучший подход для принудительного включения приложения в действие, которое должно быть «текущим»?Средство запуска - StartupActivity, но в большинстве случаев я хотел бы, чтобы LoginActivity или MainActivity отображались (если бы мы пришли в это состояние).

Любые советы и указатели приветствуются =)

Iдумал, что мне следует опубликовать некоторый код, но там нет ничего странного, странного или даже продвинутого.Поэтому я просто опубликую некоторые материалы, чтобы они были перед вами.

MyService.onCreate

public void onCreate(){
    super.onCreate();
    SRef.clientHandlerLS = new ClientHandler(); // my TCP connection
    startupProgressIntent = new Intent("STARTUP_PROGRESS_MESSAGE");
    loginProgressIntent = new Intent("LOGIN_PROGRESS_MESSAGE");
    mainIntent = new Intent("MAIN_MESSAGE");

    ANDROID_ID = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);

    addTextToStartup("Sometext...\n");

    loginHandler = new Handler();
    startupHandler = new Handler();

    createNotification("Starting...", "Starting...", true);

    SRef.myService = myBinder;

    startupHandler.postDelayed(startupStuff, 1000);
}

Вот так я запускаю LoginActivityот MyService

Intent myIntent = new Intent(MyService.this, LoginActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyService.this.startActivity(myIntent);

StartupActivity.onCreate

@Override
protected void onCreate(android.os.Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.startup);

    tv = (TextView)findViewById(R.id.textViewStartupData);
    tv.append("StartupActivity.onCreate\n");

    registerReceiver(connectionReceiver, new IntentFilter("STARTUP_PROGRESS_MESSAGE"));
    registerReceiver(connectionReceiver, new IntentFilter("STARTUP_FINISH"));
    registerReceiver(connectionReceiver, new IntentFilter("SERVICE_CONNECTED"));

    startService(new Intent(StartupActivity.this, MyService.class));
}
...