我有一个充当启动器的应用程序。这个程序有3个活动:
SplashActivity
:在加载时显示启动画面,然后启动LauncherActivity
并完成。这是清单中标记为启动器的活动。
startActivity(Intent(this, LauncherActivity::class.java))
finish()
<activity
android:name=".SplashActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
LauncherActivity
:Launcher的主要活动。有一个菜单按钮,可以启动DashboardActivity
。
startActivity(Intent(this@LauncherActivity, DashboardActivity::class.java))
<activity
android:name=".LauncherActivity"
android:launchMode="singleTask"
android:screenOrientation="landscape" />
DashboardActivity
:显示应用列表并通过其启动意图启动它们。
private val DEFAULT_FLAGS_APP_LAUNCH = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(packageManager.getLaunchIntentForPackage(packageInfo.packageName).apply {
flags = DEFAULT_FLAGS_APP_LAUNCH
})
<activity
android:label="@string/apps"
android:theme="@style/TNA"
android:name=".DashboardActivity"
android:launchMode="singleTask"
android:screenOrientation="landscape" />
所有活动都是通过startActivity
启动的,包括应用。
我想要标准的Android Launcher行为,即:通过DashboardActivity
输入应用时,如果我点击主页按钮,请转到主Launcher活动(LauncherActivity
),然后点击返回,转到信息中心(DashboardActivity
)。
我遇到的问题是,当点击主页时,它会返回DashboardActivity
,而不是LauncherActivity
。如果我完成了DashboardActivity
,那么当点击某个应用时,它会回到LauncherActivity
。
关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
这肯定是后台/任务堆栈相关的。有关任务堆栈的更多信息,请参阅this link。
当您从LauncherActivity
转到DashboardActivity
时,仪表板会被放置到任务堆栈中。当通过HOME按钮再次请求LauncherActivity
时,任务堆栈将恢复到启动Activity
LauncherActivity
后正在使用的最后DashboardActivity
。
您有几种不同的选项可以解决此问题:
Activity
。考虑一个抽屉,甚至是显示内容的Fragment
,当调用LauncherActivity
来启动另一个应用时,可以弹回主startActivity
。DashboardActivity
来电startActivity
之后,它应该调用finish()
,这样它就会从当前任务堆栈弹出。singleInstance
模式启动,防止启动器Activity
的多个实例同时运行。请注意,您需要在onNewIntent
。LauncherActivity
FLAG_ACTIVITY_NO_HISTORY
时设置DashboardActivity
。