Як отримати startActivityForResult, як отримати requestCode у дочірній діяльності?


85

У мене є чотири дії, скажімо A, B, C і D. Моя ситуація полягає в тому, що A розпочне діяльність B за допомогою startActivityForResult.

startActivityForResult(new Intent(this,B.class),ONE);

В іншій ситуації я буду B з іншою ситуацією. люблю

 startActivityForResult(new Intent(this,B.class),TWO);

У B мені потрібно зателефонувати C або D залежно від requestCode. Тобто, якщо ОДНОМ потрібно запустити C ще D.
Тому мені потрібно знати, як перевірити requestCode у дочірній діяльності (B тут).
Іншими словами, я хочу отримати код запиту, з якого було розпочато Дію B.

Відповіді:


137

Ви можете передати код запиту, поставивши додатково.

intent.putExtra("requestCode", requestCode);   

Або , якщо ви використовували startActivityForResultбагато разів, то краще , ніж редагування кожного, ви можете в вашому , додати вам код там , як це overridestartActivityForResultActivity

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

Тож немає потреби редагувати всі ваші startActivityForResult
Сподіваюся, це допомогло вам


49
Невже немає можливості для дитячої діяльності отримати свій код запиту?
i_am_jorf

1
До цих пір, до моїх найкращих знань, я не думаю, що інакше.
Labeeb Panampullan

17
Замислювався про те саме - це одна з речей в Android API, яка не має жодного логічного сенсу.
Артем Руссаковський

7
startActivityForResult можна використовувати для запуску діяльності в інших програмах, requestCode - це особиста справа вашого додатка. У цьому світлі має сенс, що Intent не має такого методу, і правильним підходом є setAction, який точно вказує, що ви хочете, щоб Робота робила.
Maciej Beimcik

27

Код запиту не передається розпочатій діяльності автоматично, оскільки він не повинен (і не повинен) знати це значення. Потрібно лише знати, що робити, а не звідки було почато.

Початок діяльності насправді є лише черговою формою виклику методу. Коли ви викликаєте метод, ви отримуєте результат синхронно (саме там, де ви здійснили виклик). У цьому випадку ви передаєте лише інформацію, необхідну методу для виконання своєї роботи. Ви не розповідаєте, звідки ви це зателефонували.

Початок дії є асинхронним аналогом виклику методу, і в цьому випадку ви отримуєте результат за допомогою спеціального методу onActivityResult (). У цьому методі ви повинні знати, що робити з результатом, який ви щойно отримали, і у вас є код запиту для цього.

Щоб трохи зрозуміти, чому не є гарною ідеєю передавати код запиту як параметр, розглянемо приклад діяльності, який показує товар, який ви можете придбати. У цій діяльності є дві кнопки з написом "Купити" та "Увійти" (оскільки ви зараз не авторизовані). Якщо натиснути кнопку «Вхід», розпочнеться дія під назвою «Вхід», яка спробує увійти в систему за допомогою наданої інформації. Якщо натиснути кнопку "Купити", спочатку розпочнеться та сама операція "Вхід", і якщо вхід був успішним, розпочніть операцію покупки.

Тепер кнопка «Вхід» використовує код запиту 1 для запуску входу в систему, але кнопка «Купити» не може використовувати той самий код запиту, оскільки для успішного входу потрібно буде зробити щось інше. Отже, кнопка "Купити" використовує код запиту 2.

В операції "Вхід" ви можете отримати два різні коди запиту, залежно від того, звідки він був викликаний, але вам потрібно буде виконати ту саму процедуру.

Отже, якщо ви введете код запиту як параметр, ви отримаєте код, який повинен робити одне і те ж для декількох різних кодів запиту, наприклад:

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

У кінцевому підсумку ви також збережете константи коду запиту в центральному розташуванні, наприклад, у класі з іменем RequestCodes.

Коротше кажучи, код запиту слід використовувати лише для вирішення, що робити з отриманим результатом. Таким чином ви отримаєте більш модульний, простіший в обслуговуванні та простіший розширення код.


1
Що робити, якщо це свого роду "менеджер", і ви хочете, щоб увійшов код запиту, щоб "зберегти" певне значення (значення, збережене в додаткових додатках). Ще один код запиту, який "отримує" значення (і повертає додаткові послуги), але в рамках цієї діяльності вони також можуть загалом керувати збереженими значеннями, такими як перейменування, редагування, видалення тощо. Які ваші думки щодо чогось подібного? Я думаю, це завадило б дублювати код / ​​дії, щоб робити ті самі дії.
JRomero

@ J.Romero Не робіть цього, це просто ускладнить справи. Просто поставте цю функціональність у клас (утиліта / одиночний). Можливо, ви також захочете поглянути на Handler and Service
Szabolcs Berecz

3
Szabolcs Дієва діяльність, навіть якщо їй "не потрібно знати це значення", можливо, доведеться передати це значення наступній діяльності в ланцюжку. Як не дивно, нам потрібно написати більше зайвого коду для цього. Про те, що нам не потрібно знати стільки, скільки ми отримуємо більше лекцій, щоб прочитати про те, що ми не повинні робити.
user250343

Я не розумію, як це ілюструє, чому дитячій діяльності слід забороняти доступ до коду запиту. Я навіть не впевнений, чому доступ до коду запиту був би необхідний у вашому конкретному прикладі, враховуючи те, що покупка зараз і дзвінки для входу в будь-якому випадку виконуються двома окремими діями.
Дражен Біловук

1
@EvanR. можливо, кращою архітектурою було б підкласувати активність елемента "master" на окремі дії додавання / редагування. Отже, мінімальне повторне використання коду, але кожна дія може бути використана незалежно.
Дейн Пауелл

11

У підсумку я використав спеціальну дію "Намір", щоб передати такий тип інформації до запуску.

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

Тоді ви підете так:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

А в Activity Bви легко отримуєте дію:

getIntent().getAction();

0

Ви можете використовувати getCallingActivity (), щоб отримати активність, яка розпочала поточну активність і яка отримає значення результату з кодом відповіді в кінці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.