життєвий цикл onNewIntent () та зареєстровані слухачі


150

Я використовую SingleTop Activity для отримання намірів із діалогового вікна пошуку через onNewIntent().

Що я помітив, це те, що onPause()називається раніше onNewIntent(), а потім після нього дзвонить onResume(). Візуально:

  • розпочато діалогове вікно пошуку
  • намір пошуку, активований
  • onPause()
  • onNewIntent()
  • onResume()

Проблема полягає в тому, що у мене зареєстровані слухачі, onResume()які видаляються onPause(), але вони потрібні всередині onNewIntent()дзвінка. Чи існує стандартний спосіб зробити доступним для тих слухачів?

Відповіді:


294

onNewIntent()позначається як точка входу для операцій SingleTop, які вже виконуються десь в стеку і тому не можуть зателефонувати onCreate(). З точки зору життєвого циклу діяльності, тому потрібно зателефонувати onPause()раніше onNewIntent(). Я пропоную вам переписати свою діяльність, щоб не використовувати цих слухачів усередині onNewIntent(). Наприклад, більшість часу мої onNewIntent()методи просто виглядають так:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);
}

З усією логікою налаштування відбувається за onResume()допомогою використання getIntent().


@Rodja, будь ласка, прокоментуйте цей stackoverflow.com/questions/19092631/… також
Розробник

3
Відносяться до початкового питання: майте на увазі , якщо ви переміщаєте код для обробки пошуку Intentв onResume(), ваша активність, імовірно , спробує виконати пошук кожен раз , коли воно відновлюється, ймовірно , не поведінка , яке ви хочете.
Тоні Чан

1
Роджа говорить: З точки зору життєвого циклу діяльності, тому потрібно зателефонувати на Pauuse (), перш ніж onNewIntent () Android не потребував проектувати це таким чином. Ваша діяльність вже пройшла життєвий цикл, щоб відновити (). Немає необхідності, щоб андроїд закликав onPause (), а потім зателефонував onResume () знову. Якщо додаток відновлено, ОС може просто зателефонувати наNewIntent () та залишитися у відновленому стані.
Sani Elfishawy

Роджа говорить: З точки зору життєвого циклу діяльності, тому потрібно зателефонувати onPause (), перш ніж onNewIntent () Android не потребував цього розробити. Ваша діяльність вже пройшла життєвий цикл, щоб відновитись. Якщо дія буде відновлено, вони можуть просто зателефонувати на NewIntent () та залишитися у відновленому. Проблема послідовності Android полягає в тому, що вона не дозволяє розрізняти onPause через дії користувача проти onPause через фонові наміри. Якщо ви хочете діяти на Pauuse лише у випадку дії користувача, ви накрутили, тому що до майбутнього ви не будете знати, чому ви переходите на onPause ().
Sani Elfishawy

Важливим моментом слід зазначити, що getIntent () все ще повертає початковий намір. Ви можете використовувати setIntent (Намір) для оновлення до нового Наміру.
linuxjava

15

Примітка: виклик методу життєвого циклу з іншого не є хорошою практикою. У наведеному нижче прикладі я намагався досягти того, щоб ваш onNewIntent завжди називався незалежно від вашого типу діяльності.

OnNewIntent () завжди викликають події SingleTop / Task, за винятком першого разу, коли діяльність створена. У той час onCreate називається наданням рішення для кількох запитів, заданих на цій темі.

Ви завжди можете викликати onNewIntent, ввівши його в такий спосіб, як onCreate

@Override
public void onCreate(Bundle savedState){
    super.onCreate(savedState);
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}

59
Як правило, не годиться безпосередньо називати методи життєвого циклу, ні? Можливо, нешкідливий, а може, якась базова реалізація onNewIntent () передбачає, що onPause () вже викликано? Імовірно безпечніше інкапсулювати код програми методом, який можна дзвонити з обох місць.
BernalKC

12
Домовились. Ми зіткнулися з кількома крайніми випадками, використовуючи такий підхід. Краще уникати.
Саад Фарук

3
Так ... я теж погоджуюся уникати цього ... це було для тих, хто хоче звернутися до OnNewIntent з onCreate.
Pawan Maheshwari
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.