Мои действия и фрагменты, кажется, запускают методы дважды после изменения их launchMode

Недавно я изменил свой проект, чтобы я мог обрабатывать "Задачу входа в систему", которая состоит из одного действия, и "Основную задачу", которая включает в себя все другие действия. Я сделал это через Манифест:

<application
    android:name=".MyApp"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name">

    <activity
        android:name=".ui.login.LoginActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask"
        android:taskAffinity="@string/affinity_login">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".ui.main.MainActivity"
        android:label="@string/title_activity_main"
        android:taskAffinity="@string/affinity_main"
        android:launchMode="singleTask"/>

    <activity
        android:name=".ui.tandc.TermsAndConditionsActivity"
        android:parentActivityName=".ui.main.MainActivity" />

    ...

</application>

Теперь я начинаю видеть дублированные строки каждый раз, когда что-то регистрирую. Сначала я подумал, что есть два экземпляра каждого действия / фрагмента (не знаю, как, на самом деле), но это не тот случай, который можно увидеть в журнале this.toString() по активам и фрагментам:

09-25 16:10:57.602/ D/LoginActivity: Activity onCreate() instance: com.mypackage.ui.login.LoginActivity@2a9a9e50                                
09-25 16:10:57.602/ D/LoginActivity: Activity onCreate() instance: com.mypackage.ui.login.LoginActivity@2a9a9e50
09-25 16:10:58.193/ D/LoginActivity: Activity onStart() instance: com.mypackage.ui.login.LoginActivity@2a9a9e50
09-25 16:10:58.193/ D/LoginActivity: Activity onStart() instance: com.mypackage.ui.login.LoginActivity@2a9a9e50
09-25 16:10:59.934/ D/MainActivity: Activity instance: com.mypackage.ui.main.MainActivity@3e7f641b
09-25 16:10:59.934/ D/MainActivity: Activity instance: com.mypackage.ui.main.MainActivity@3e7f641b
09-25 16:11:00.605/ D/WalletListFragment: newInstance()
09-25 16:11:00.605/ D/WalletListFragment: newInstance()
09-25 16:11:00.675/ D/ComprasListFragment: Fragment instance: ComprasListFragment{2cbeb452 #2 id=0x7f11079f android:switcher:2131822495:2}
09-25 16:11:00.685/ D/ComprasListFragment: Fragment instance: ComprasListFragment{2cbeb452 #2 id=0x7f11079f android:switcher:2131822495:2}
09-25 16:11:00.685/ D/ComprasListFragment: onCreate(savedInstanceState = new)
09-25 16:11:00.685/ D/ComprasListFragment: onCreate(savedInstanceState = new)
09-25 16:11:00.695/ D/RecargasFragment: Fragment onAttach() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:00.695/ D/RecargasFragment: Fragment onAttach() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:00.715/ D/RecargasFragment: Fragment onCreate() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:00.715/ D/RecargasFragment: Fragment onCreate() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:03.017/ D/StoresMapFragment: Fragment instance: StoresMapFragment{215cf0c5 #1 id=0x7f11079f android:switcher:2131822495:1}
09-25 16:11:03.017/ D/StoresMapFragment: Fragment instance: StoresMapFragment{215cf0c5 #1 id=0x7f11079f android:switcher:2131822495:1}
09-25 16:11:03.047/ D/RecargasFragment: Fragment onStart() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:03.047/ D/RecargasFragment: Fragment onStart() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}  

Когда я запускаю MainAcitivity (где находится ViewPager с четырьмя фрагментами) Я также занимаюсь установкой правильных (?) флагов:

protected void startMainActivity(String token) {
    Intent i = new Intent(this, MainActivity.class);
    i.putExtra(PARAM_1, token);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
    finish();
}

Я не использую флаг при открытии всех других действий из Main, так как все они указывают MainActivity как родитель, хотя я не думаю, что это связано.

Да, я прочитал и просмотрел официальную документацию, но до сих пор не могу понять, что происходит.

Что самое странное для меня, так это тот факт, что это приложение было построено с использованием MVP: каждое действие имеет свои собственные Presenter, View и Interactor, а последнее заботится только о получении данных с сервера. Я реализовал Retrofit для этого, и интеракторы не делают это дублирование, но докладчики также показывают дублированное ведение журнала.

В общем, у меня есть два вопроса:

  1. Почему я получаю двойные журналы?
  2. Правильно ли я выполняю задачи для того, чего хочу достичь? - Моя интуиция говорит мне, что мне также нужно указать taskAffinity так что все остальные действия могут быть на "главной задаче"

Кстати, я использую Timber и не сажаю дерево в каждом действии, а в своем классе приложений

Спасибо за любые возможные предложения.

1 ответ

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

Я добавил следующую дополнительную проверку в свой класс Application, чтобы предотвратить дублирование:

if (BuildConfig.DEBUG && Timber.treeCount() == 0)
  Timber.plant(new Timber.DebugTree());
  1. Основываясь на ваших журналах, я предполагаю, что это все еще дублирование журналов. Отметки времени равны. Я хотел бы заменить журналирование Timber на простой Log.d и попробовать, если это поможет. Если так - копайте глубже, чтобы отследить, когда древесина дублирует бревна.
  2. На первый взгляд все правильно.
Другие вопросы по тегам