启动器开发 - 主页按钮不会回到初始活动

时间:2018-01-31 16:08:49

标签: android launcher

我有一个充当启动器的应用程序。这个程序有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

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:2)

这肯定是后台/任务堆栈相关的。有关任务堆栈的更多信息,请参阅this link

当您从LauncherActivity转到DashboardActivity时,仪表板会被放置到任务堆栈中。当通过HOME按钮再次请求LauncherActivity时,任务堆栈将恢复到启动Activity LauncherActivity后正在使用的最后DashboardActivity

您有几种不同的选项可以解决此问题:

  1. 不要为&#34;仪表板&#34;使用单独的Activity。考虑一个抽屉,甚至是显示内容的Fragment,当调用LauncherActivity来启动另一个应用时,可以弹回主startActivity
  2. DashboardActivity来电startActivity之后,它应该调用finish(),这样它就会从当前任务堆栈弹出。
  3. 通常,启动器设置为以singleInstance模式启动,防止启动器Activity的多个实例同时运行。请注意,您需要在onNewIntent
  4. 中支持LauncherActivity
  5. 为防止与任务管理器发生奇怪的互动,请考虑在启动FLAG_ACTIVITY_NO_HISTORY时设置DashboardActivity