Как определить, запущено ли действие для обработки onActivityResult или было запущено просто воссоздать действие из-за изменения ориентации или другого события.

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

В ситуациях с нехваткой памяти действие A уничтожается и воссоздается для обработки результата от B. Во время onInit мое внутреннее состояние показывает, что мне все еще нужно отображать действие B, и, таким образом, B отображается повторно.

Как я мог справиться с этим правильно?

1
ZsJoska 25 Дек 2013 в 01:05

2 ответа

Лучший ответ

Отредактировано, чтобы попытаться ответить на фактический вопрос.

Чтобы предотвратить запуск кода установки при возврате к действию, вы можете воспользоваться методом onSaveInstanceState. Вы можете переопределить этот метод в классе A, чтобы, если ваше действие было прекращено по какой-либо причине, вы могли сохранить его состояние (например, тот факт, что вы уже начали действие B для получения результата) . В этом методе вы изменяете переданный в Bundle, задавая для него пары "ключ-значение". Этот пакет затем будет передан классу onCreate при перезапуске действия. Таким образом, соответствующие части вашего класса A могут выглядеть следующим образом:

public class A extends Activity {
    boolean startedB = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        startedB = savedInstanceState != null && savedInstanceState.getBoolean("started_b", false);
        if (!startedB) {
            Intent intent = new Intent(this, B.class);
            startActivityForResult(intent, 1);
            startedB = true;
        }
        // rest of code
        // .....
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean("started_b", startedB);
    }
}

Исходный ответ

Когда вы начинаете действие для получения результата, вы можете установить дополнительный флаг или значение для намерения, используемого для запуска действия. Например, если я хочу начать действие Foo для получения результата, я могу использовать

Intent intent = new Intent(this, Foo.class);
intent.putExtra(IS_FOR_RESULT, true);
startActivityForResult(intent, REQUEST_CODE);

Где IS_FOR_RESULT - это строка, например "IS_FOR_RESULT", а REQUEST_CODE - целое число, например 1. В запущенном действии onCreate (в данном случае для класса Foo) вы можете проверить, было ли оно запущено, для получения результата с помощью следующих

Intent intent = getIntent();
if (intent.hasExtra(IS_FOR_RESULT) && intent.getBooleanExtra(IS_FOR_RESULT) {
    // Handle activity being started for a result
}

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

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

1
FuegoFro 26 Дек 2013 в 08:39

Вы можете определить, было ли действие запущено для результата только в вашем приложении , реализовав логику, предложенную FuegoFro. Однако вы не можете определить, каким образом ваша Activity была запущена из других приложений. Это можно сделать из исходных кодов Android: единственная разница между запуском Activity для результата и его запуском - это значение requestCode:

@Override
public void startActivity(Intent intent) {
    startActivityForResult(intent, -1);
}

И этот requestCode недоступен из вашего Activity.

0
Community 23 Май 2017 в 12:28