我最近修改了我的项目,以便我可以处理由单个活动组成的“登录任务”和包含所有其他活动的“主要任务”。我通过清单做到了这一点:
<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,后者只负责从服务器获取数据。我为此实现了改造,交互者没有做这种重复,但演示者也显示重复的日志记录。
所以基本上我有两个问题:
- 为什么我得到双日志?
- 我是否正确处理了我想要实现的任务?- 我的直觉告诉我,我还需要指定
taskAffinity
所有其他活动都可以放在“主要任务”上
顺便说一句,我正在使用 Timber,而不是在每个 Activity 上种植树,而是在我的 App 类上
感谢您提供任何可能的建议。