Нажмите кнопку «Назад», но не убивайте активность и оставьте ее в Back Stack (Android)

У меня есть 3 действия A, B и C.

Я динамически увеличиваю активность B по нажатию кнопки, и пользователь может добавлять столько просмотров, сколько ему нравится.

Операция такая:

Пользователь видит «Действие A» сначала вводит свои данные и нажимает кнопку «Сохранить», и я перевожу его в «Действие B», где он добавляет определенные поля столько раз, сколько ему нравится, и когда он снова нажимает «Сохранить», я перевожу его в «Действие C».

Теперь, когда я нахожусь в A и перехожу к B, добавляю несколько представлений и ввожу текст в TextViews, а затем нажимаю «Сохранить» и иду к C. Из C, если я нажимаю в ответ, я вижу B нетронутым вместе со всеми раздутыми представлениями и введенным текстом, очевидно, потому что это сохраняется в Back Stack, но если я перехожу от B к A, нажимая назад, а затем возвращаюсь к B, все просмотры исчезают, потому что он удаляется из Back Stack.

Я хотел знать, можно ли хранить только один экземпляр B в BackStack и вообще не убивать его, когда пользователь наносит ответный удар? Я переопределил ключ возврата, но безрезультатно, потому что активность все равно убита, некоторые люди предложили мне сохранить все представления и данные из него в Parcelable ArrayList и снова сгенерировать их в onCreate, но это не выглядит возможным для меня, как я думаю мы все равно можем сохранить его в BackStack.

Я наткнулся на это руководство у разработчиков Android http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html, в котором говорится об этих атрибутах активности.

android:taskAffinity
android:launchMode
android:allowTaskReparenting
android:clearTaskOnLaunch
android:alwaysRetainTaskState
android:finishOnTaskLaunch
android:singleTask
android:singleInstance

Но я не знаю, как их использовать.

Кто-нибудь пробовал это еще? Если это так, пожалуйста, помогите мне собрать кусочки вместе.


person Arif Nadeem    schedule 08.01.2012    source источник
comment
Вы не можете гарантировать, что какой-либо компонент вашего приложения будет существовать в течение определенного периода времени. Это включает в себя деятельность и услуги. Если на устройстве, на котором работает ваше приложение, недостаточно ресурсов, ОС Android уничтожит все, что, по ее мнению, в данный момент не используется. Если вы принимаете пользовательские данные, вы ДОЛЖНЫ предпринять шаги для их сохранения каким-либо образом, а не полагаться на тот факт, что они могут существовать или не существовать в стеке, когда вы решите вернуться или воссоздать. Судя по вашему вопросу... но мне это не кажется возможным... - Я предлагаю вам переосмыслить, так как это единственный гарантированный способ.   -  person Squonk    schedule 08.01.2012
comment
вы переопределили кнопку «Назад», и она все еще возвращается? вы вызываете метод super() или что-то в этом роде?   -  person MikeIsrael    schedule 08.01.2012
comment
@MikeIsrael: я пробовал без супер, но он все равно убивает активность, даже если она не убита, то как вы предотвратите запуск нового экземпляра активности B? Он всегда запускается как новая деятельность, не так ли?   -  person Arif Nadeem    schedule 08.01.2012
comment
@mirroredAbstraction, о да, не совсем понял проблему. Лучшее решение, которое я мог придумать, потребовало бы переработки вашего кода. Я реализую что-то похожее на то, что вы хотите сделать, но с одним действием для всех состояний и переключением представлений при необходимости. Я не думаю, что это действительно то, что вы ищете.   -  person MikeIsrael    schedule 08.01.2012


Ответы (2)


Да, я согласен с Нандишем.

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_BACK:
                //bring back the previous activity do your logic here           
                return false; //means you don't want to remove the activity from stack 
            }
        return super.onKeyDown(keyCode, event);  // means u want to remove the last activity from Activity stack.
    }

    so question  is that how u can go to other activity without remove it from stack, 
    you can use  :
                Intent myIntent = new Intent(CurrentClass.this, JumptoActivity.class);
                 startActivity(myIntent);*

example: at the switch case u can use this

if(KeyEvent.KEYCODE_BACK)
{
                Intent myIntent = new Intent(CurrentClass.this, NextActivity.class);
                 startActivity(myIntent);
                return false;
}
else
    return true;       //if you not write this then your  menu and other think will be affected.

Спасибо, я думаю, что эта небольшая информация будет полезна для вас.

person Hemant Menaria    schedule 08.01.2012
comment
Спасибо, но как мне убедиться, что андроид не создает новый экземпляр действия B, я хочу использовать действие, которое уже находится в стеке. - person Arif Nadeem; 08.01.2012
comment
используйте FLAG_ACTIVITY_REORDER_TO_FRONT для намерения при запуске - person nandeesh; 08.01.2012
comment
в файле манифеста для Activity B установите android:noHistory=true, чтобы он не создавал новый экземпляр и не брал его из истории - person Hemant Menaria; 09.01.2012

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

        switch(keyCode)
        {
        case KeyEvent.KEYCODE_BACK:
            //bring back the previous activity do your logic here           
            return false;
        }
    return super.onKeyDown(keyCode, event);
}

Вы можете использовать это, возвращая false, когда активность не должна быть закрыта. используйте FLAG_ACTIVITY_REORDER_TO_FRONT, чтобы запустить предыдущее действие

person nandeesh    schedule 08.01.2012