Android: восстановление активной активности при возобновлении работы приложения - PullRequest
6 голосов
/ 07 апреля 2009

У меня запущено два действия: mainActivity и childActivity . Всякий раз, когда пользователь нажимает кнопку в mainActivity , запускается childActivity . Что я хочу сделать, это:

Когда активным действием является childActivity , и пользователь нажимает кнопку «Домой», а затем повторно запускает приложение , я хочу вместо него увидеть childActivity mainActivity , которая запущена.

У меня были некоторые предложения, которые можно обойти. Я пытался манипулировать событиями onStart, onRestart, onResume, onStop, onDestroy. Но они не полностью решили проблему. Там должен быть умный выход. Спасибо.

Редактировать:

Спасибо за ответ, Сонил. Случай, который вы сказали, происходит, когда действие вызывается из окна недавних действий. (окно открывается при долгом нажатии кнопки домой) Однако; Этого не происходит, когда вы открываете его с домашнего экрана. (например, открытие с самого начала) Я не думаю, что в моем коде есть особая проблема для генерации этой ошибки Потому что я создал тестовый проект и попробовал автономно перед отправкой вопроса и столкнулся с той же проблемой. Во всяком случае, вот код теста:

public class MainActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.setTitle("MainActivity");

        ((Button) findViewById(R.id.btnChildActivity)).setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        startActivity(new Intent(this, ChildActivity.class));
    }

}

public class ChildActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
        this.setTitle("ChildActivity");

    }
}

Ответы [ 2 ]

3 голосов
/ 07 апреля 2009

РЕДАКТИРОВАТЬ : нашли решение вашей проблемы несколько случайно сегодня! Смотрите это сообщение об ошибке . Это точно объясняет вашу проблему. Причина, по которой я не смог воспроизвести проблему, заключается в том, что Eclipse никогда не запускал приложение напрямую. Я использую Eclipse для установки приложения и запускаю его сам.


Это уже стандартное поведение для приложений Android, никаких специальных приемов для этого не требуется. Я удивлен, что ваше приложение не демонстрирует такое поведение. Каждое Android-приложение поддерживает стек Activity, буквально стек LIFO. Эти действия могут быть далее сгруппированы в задачи, но 99% мирских приложений никогда не нужно будет ничего знать о задачах в моем опыте.

При нажатии кнопки «Домой» весь стек приложения помещается в фоновый режим. Находясь в фоновом режиме, он может быть уничтожен из-за проблем с памятью в любое время, но если до его восстановления не проходит много времени, он, как правило, не уничтожается и не нуждается в воссоздании. При повторном выборе приложения стек (или, точнее, только верхний элемент в стеке) восстанавливается.

Если ваше приложение не демонстрирует такого поведения, я подозреваю, что оно как-то связано с тем, как вы запускаете mainActivity и childActivity, и с любыми дополнительными флагами Intent, которые вы можете использовать. Есть ли шанс опубликовать фрагменты кода о том, как вы запускаете mainActivity и childActivity?

0 голосов
/ 08 апреля 2009

Я вернулся и протестировал с аналогичным приложением, и даже когда процесс вытесняется из памяти, ChildActivity воссоздается автоматически, как говорит Soonil. Вы видите это на эмуляторе или на реальном устройстве?

Если вы запустите свое приложение и посмотрите logcat, после запуска приложения вы должны увидеть что-то похожее на следующее, затем откройте ChildActivity и нажмите Home, а затем снова запустите свою деятельность:

Начало действия: Intent {action = android.intent.action.MAIN Categories = {android.intent.categroy.LAUNCHER} flags = ... comp = {com.yourpackagename.MainActivity}} Запустите proc для активности yourpackagename.ChildActivity: pid = x uid = y gids = {} Отображаемая активность / .ChildActivity

Не могли бы вы опубликовать вывод logcat, если вы не видите ожидаемого поведения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...