2017-02-12 16 views
0

Любое намерение, которое передается либо при создании активности, либо в качестве параметра в onNewIntent(), живет до тех пор, пока активность не была уничтожена. Ну, даже если activity is launched from recent apps section после уничтожения, но это еще одна проблема.Android-активность состоит из нескольких циклов onStart и onStop

Вопрос в том, какой должна быть лучшая практика в таких случаях, чтобы избежать дублирования обработки из-за старого намерения, когда действие запускается/возобновляется с фона или «создается» из последнего раздела приложений.

Скажите, я тяну getDataString(), например, для аналитики, которая в идеале должна отслеживаться только тогда, когда приложение действительно началось через deeplink. Но он очень доступен каждый раз в цепочке звонков onStart(), внутри старого намерения. Что рекомендуется?

  1. Устанавливается в onStop()? // кажется наиболее логичным для меня. подводные камни?
  2. некоторые местные проверки, чтобы игнорировать значения?
  3. установка временных полей в onStop(), чтобы определить, является ли это старым?

ответ

0

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

  1. установка намерение нуля является рискованным и может привести к NPE, так как мы не может гарантий того, что все намерения существо используются в коде, в том числе используются косвенно некоторой внутренней апи, например activity getReferrer
  2. локальных проверки в любом случае, это слабый способ исправить это.
  3. Как и выше, но гораздо чище. Сохранял поле в самом намерении, указывающее, было ли оно «потреблено» [для любой обработки]. Функция выглядит следующим образом:

    private void markIntentValuesTracked(final boolean status){ 
         if(getIntent() != null){ 
          getIntent().putExtra(LAUNCH_INTENT_VALUES_CONSUMED, status); 
         } 
        } 
    

метод вызывает:

onCreate():

boolean isOldIntent = (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0; 
markIntentValuesTracked(isOldIntent); 

onNewIntent(): markIntentValuesTracked(false);

onStop(): markIntentValuesTracked(true)

 Смежные вопросы

  • Нет связанных вопросов^_^