startActivity(намерение) и onStop

У меня проблема с startActivity(intent) и onStop. Android API предлагает сохранять данные в onStop, что я и делаю:

public void onStop(){
    super.onStop();

    if(tosave)
    {
        Editor editor = sp.edit();
        editor.putInt(getString(R.string.index_of_text_color), text_color_index);
        editor.putInt(getString(R.string.index_of_background_color), background_color_index);
        editor.commit();
    }
}

Однако я хотел бы начать следующее действие после его сохранения, поэтому мне нужно использовать намерение и startActivity (намерение).

public void click(View v){
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

Мой вопрос: вызывает ли startActivity(intent) с двумя флагами метод onStop(), когда он завершает приложение, или мне нужно вызвать finish()? Разрешено ли мне вызывать finish() после того, как я начну новую деятельность? Или из-за того, что новая активность будет наверху, Android автоматически вызывает onStop, поскольку сейчас он находится в фоновом режиме?

Есть так много вопросов о том, как startActivity(intent) работает с циклом приложения, что я не понимаю. Будет полезно, если кто-то укажет мне ссылку.

Спасибо!

РЕДАКТИРОВАТЬ: цель не в onStop. Это другой метод, который соответствует кнопке. Как только кнопка будет нажата, мне нужно будет сохранить данные — перейти к остановке — и затем перейти к следующему действию. Как я могу это сделать?


person Jason Tang    schedule 12.11.2013    source источник
comment
onStop вызывается, когда ваша активность полностью скрыта. Начинать новую активность в этом состоянии кажется действительно плохой идеей, потому что обычно причина того, что ваша активность скрыта, заключается в том, что запущена другая активность! Я надеюсь, что он выдаст исключение, если вы попытаетесь это сделать.   -  person wvdz    schedule 12.11.2013


Ответы (1)


Вы должны сохранять состояние в onPause(), а не onStop(), потому что при определенных условиях onStop() никогда не будет вызываться. Вам гарантировано, что onPause() будет вызван.

onPause() всегда будет вызываться для вашей активности, когда перед ней отображается другая активность.

Это должно решить вашу проблему.

person David Wasser    schedule 12.11.2013
comment
Когда я вызываю startActivity(intent), будет ли приложение по-прежнему вызывать onpause... и нужно ли мне потом Finish()? Кроме того, onPause не должен обрабатывать вещи, которые требуют слишком много процессора, например, сохранение данных ... но я думаю, это сработает. - person Jason Tang; 13.11.2013
comment
Вы не должны делать слишком много вещей в onPause(). Что вы там пытаетесь сделать? Из какого компонента вы вызываете startActivity()? Вам нужно вызвать finish() для действий, которые вы хотите явно завершить. Я думаю, вам нужно больше узнать о жизненных циклах активности. Пожалуйста, объясните свою проблему более подробно и предоставьте больше кода. - person David Wasser; 13.11.2013
comment
Я ничего не делал с onPause(). startActivity(intent) вызывается из android:onClick в xml методу click, как уже упоминалось. Я не знаю, нужно ли мне ставить finish() в методе щелчка. Намерение настроено так, что в приложении не останется стеков после открытия другого, поэтому я не знаю, нужно ли мне вызывать finish() - person Jason Tang; 14.11.2013
comment
Если Intent очищает действие из стека, то он вызовет finish() для действия для вас. Вам не нужно этого делать. - person David Wasser; 14.11.2013
comment
Вам не нужно использовать Intent.FLAG_ACTIVITY_NEW_TASK, если это открывает действие в той же задаче. - person David Wasser; 14.11.2013
comment
Я не открываю ту же активность - я вызываю другую активность. - person Jason Tang; 14.11.2013
comment
Да, я знаю. Но это в той же задаче. Так что вам не нужно Intent.FLAG_ACTIVITY_NEW_TASK. Вам также, вероятно, нужно прочитать о разнице между действиями, задачами, процессами и приложениями. - person David Wasser; 14.11.2013