0

我最近修改了我的项目,以便我可以处理由单个活动组成的“登录任务”和包含所有其他活动的“主要任务”。我通过清单做到了这一点:

<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 构建的:每个 Activity 都有自己的 Presenter、View 和 Interactor,后者只负责从服务器获取数据。我为此实现了改造,交互者没有做这种重复,但演示者也显示重复的日志记录。

所以基本上我有两个问题:

  1. 为什么我得到双日志?
  2. 我是否正确处理了我想要实现的任务?- 我的直觉告诉我,我还需要指定taskAffinity所有其他活动都可以放在“主要任务”上

顺便说一句,我正在使用 Timber,而不是在每个 Activity 上种植树,而是在我的 App 类上

感谢您提供任何可能的建议。

4

2 回答 2

2

你有任何图书馆也种植木材树吗?我的应用程序在调试时复制了日志条目,因为我的一个库也在使用 Timber。

我在我的 Application 类中添加了以下额外检查以防止重复:

if (BuildConfig.DEBUG && Timber.treeCount() == 0)
  Timber.plant(new Timber.DebugTree());
于 2019-10-25T08:56:45.647 回答
1
  1. 根据您的日志,我认为它仍然是日志的重复。时间戳是相等的。我假设用简单的 Log.d 替换 Timber 日志记录并尝试是否有帮助。如果是这样 - 深入挖掘以跟踪木材何时复制原木。
  2. 乍一看,一切都是正确的。
于 2017-09-25T22:24:34.567 回答