【问题标题】:Launcher development - Home button not going back to initial activity启动器开发 - 主页按钮不会回到初始活动
【发布时间】:2018-01-31 16:08:48
【问题描述】:

我有一个用作启动器的应用程序。此应用有 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: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

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

【问题讨论】:

  • 您能否围绕您的意图转换和 android 清单显示一些代码?否则很难说你是如​​何操纵后台堆栈的。
  • @Submersed 我尝试了很多启动选项和标志都无济于事。我会用代码更新问题。
  • 好酷,所以你是启动器屏幕,我现在明白了。

标签: android launcher


【解决方案1】:

这肯定与返回/任务堆栈有关。有关任务堆栈的更多信息,请参阅this link

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

您有几个不同的选择来解决这个问题:

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

【讨论】:

  • 已经尝试过 2 和 3。 2. 当任何 home 或 back 被按下时,总是会回到 LauncherActivity; 3. 还是一样的行为。将尝试其他建议的解决方案并回复您。
  • 对不起,忘了回到这个。 1 表现出相同的行为,因为 Android 会记住加载了哪个片段。 4 什么都解决不了,我尝试了所有的标志和组合都无济于事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多