启动器开发 - 主页按钮不会回到初始 activity
Launcher development - Home button not going back to initial activity
我有一个用作启动器的应用程序。此应用有 3 个活动:
SplashActivity
:加载时显示启动画面,然后启动 LauncherActivity
并完成。这是清单中标记为启动器的 Activity。
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
:启动器的主要 activity。有一个启动 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 启动器行为,即:当通过 DashboardActivity
进入应用程序时,如果我单击主页按钮,转到主启动器 activity (LauncherActivity
),然后单击返回时,转到仪表板 (DashboardActivity
)。
我遇到的问题是,当单击主页时,它返回到 DashboardActivity
,而不是 LauncherActivity
。如果我完成 DashboardActivity
,然后在点击应用程序时返回 LauncherActivity
。
关于如何解决这个问题有什么想法吗?
这绝对是 back/task 堆栈相关的。有关任务堆栈的详细信息,请参阅 this link。
当您从 LauncherActivity
转到 DashboardActivity
时,仪表板将放置到任务堆栈中。当通过主页按钮再次请求 LauncherActivity
时,任务堆栈将恢复到启动 LauncherActivity
后使用的最后一个 Activity
,即 DashboardActivity
。
您有几种不同的选择来解决这个问题:
- 不要为 "dashboard" 使用单独的
Activity
。考虑一个抽屉,甚至是一个显示内容的 Fragment
,当它完成调用 startActivity
以启动另一个应用程序时,可以弹出回主 LauncherActivity
。
- 在您的
DashboardActivity
调用 startActivity
之后,它应该调用 finish()
,这样它就会从当前任务堆栈中弹出。
- 通常启动器设置为在
singleInstance
模式下启动,防止多个启动器实例同时 Activity
到 运行。请注意,您需要在 LauncherActivity
. 中支持 onNewIntent
- 为防止与任务管理器进行奇怪的交互,请考虑在
DashboardActivity
启动器时设置 FLAG_ACTIVITY_NO_HISTORY
。
我有一个用作启动器的应用程序。此应用有 3 个活动:
SplashActivity
:加载时显示启动画面,然后启动LauncherActivity
并完成。这是清单中标记为启动器的 Activity。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
:启动器的主要 activity。有一个启动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 启动器行为,即:当通过 DashboardActivity
进入应用程序时,如果我单击主页按钮,转到主启动器 activity (LauncherActivity
),然后单击返回时,转到仪表板 (DashboardActivity
)。
我遇到的问题是,当单击主页时,它返回到 DashboardActivity
,而不是 LauncherActivity
。如果我完成 DashboardActivity
,然后在点击应用程序时返回 LauncherActivity
。
关于如何解决这个问题有什么想法吗?
这绝对是 back/task 堆栈相关的。有关任务堆栈的详细信息,请参阅 this link。
当您从 LauncherActivity
转到 DashboardActivity
时,仪表板将放置到任务堆栈中。当通过主页按钮再次请求 LauncherActivity
时,任务堆栈将恢复到启动 LauncherActivity
后使用的最后一个 Activity
,即 DashboardActivity
。
您有几种不同的选择来解决这个问题:
- 不要为 "dashboard" 使用单独的
Activity
。考虑一个抽屉,甚至是一个显示内容的Fragment
,当它完成调用startActivity
以启动另一个应用程序时,可以弹出回主LauncherActivity
。 - 在您的
DashboardActivity
调用startActivity
之后,它应该调用finish()
,这样它就会从当前任务堆栈中弹出。 - 通常启动器设置为在
singleInstance
模式下启动,防止多个启动器实例同时Activity
到 运行。请注意,您需要在LauncherActivity
. 中支持 - 为防止与任务管理器进行奇怪的交互,请考虑在
DashboardActivity
启动器时设置FLAG_ACTIVITY_NO_HISTORY
。
onNewIntent