onNewIntent () вызывается без необходимости без дополнений - PullRequest
3 голосов
/ 14 января 2020

У нас есть краткие sh отчеты из нашего приложения, которые мы не можем объяснить. Cra sh происходит в MyActivity, потому что ожидаемое «дополнительное» отсутствует в Intent. У нас есть обширная регистрация в нашем приложении, и это последовательность обратных вызовов жизненного цикла, которые мы видим, когда это происходит:

06:04:22.574#a.b.c.MyActivity.onCreate() with flags 0 a.b.c.MyActivity@80773a0
06:04:22.592#a.b.c.MyActivity.onStart() a.b.c.MyActivity@80773a0
06:04:22.596#a.b.c.MyActivity.onResume() a.b.c.MyActivity@80773a0
06:04:23.601#a.b.c.MyActivity.onPause() a.b.c.MyActivity@80773a0
06:04:23.614#a.b.c.MyActivity.onNewIntent() with flags 30000000 a.b.c.MyActivity@80773a0
06:04:23.654#a.b.c.MyActivity.onResume() a.b.c.MyActivity@80773a0

Мы регистрируем идентификатор объекта (в данном случае 80773a0), чтобы мы могли сказать, как используется много экземпляров данного Activity.

Вы можете видеть (из-за идентификатора объекта), что здесь задействован только один экземпляр MyActivity. Activity создается, запускается и возобновляется как обычно. В оригинальном Intent нет специальных флагов (мы регистрируем флаги в onCreate() и onNewIntent()).

Приблизительно через 1 секунду после onResume() мы видим вызов onPause(), за которым сразу следует по телефону onNewIntent(), а затем onResume(). Intent, переданный в onNewIntent(), содержит флаги 0x30000000, которые равны FLAG_ACTIVITY_NEW_TASK (0x10000000) и FLAG_ACTIVIY_SINGLE_TOP (0x20000000). Intent, переданный в onNewIntent(), не имеет дополнительных функций, которые вызывают приложение to cra sh.

Мы дважды проверили, и в нашем коде абсолютно нет места, где мы установили бы оба этих флага в Intent.

Мы не понимаем, что вызывая вызовы onPause(), onNewIntent() и onResume(), и мы не понимаем, почему Intent имеет этот набор флагов и почему он не содержит необходимых «дополнений». В приложении есть только одно место, где этот Activity запускается и необходимые «дополнительные функции» помещаются в Intent до вызова startActivity().

Данный Activity работает правильно почти все время, поэтому с ним нет общих проблем Должно быть определенное c поведение, которое вызывает эту проблему, и мы исчерпали наши представления о том, что это может быть.

В записи манифеста для MyActivity не указан специальный режим запуска.

1 Ответ

0 голосов
/ 04 февраля 2020

Если возможно, пожалуйста, извлеките части кода, необходимые для изучения этой проблемы, потому что мы стреляем вслепую.

То, что я могу прочитать в документах , равно:

Деятельность не может получить новое намерение в возобновленном состоянии. Вы можете рассчитывать на onResume (), вызываемую после этого метода, но не обязательно сразу после завершения этого обратного вызова. Если действие было возобновлено, оно будет приостановлено и будет доставлено новое намерение, а затем onResume (). Если действие не было в возобновленном состоянии, то новое намерение может быть доставлено немедленно, при этом onResume () вызывается через некоторое время, когда действие снова становится активным.

Так что, похоже, ваш случай точно соответствует в этой части документов! Я предполагаю, что какой-то бастерд дважды звонит startActivity с флагом FLAG_ACTIVITY_SINGLE_TOP.

Я думаю, что это может произойти, например, если вы делаете startIntent из кнопки onclicklisteners - быстрые кликеры могут сделай это дважды. Решение для этого приходит с Rx Java debounce .

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