Home 按键行为

Posted

技术标签:

【中文标题】Home 按键行为【英文标题】:Home key press behaviour 【发布时间】:2011-03-03 19:32:30 【问题描述】:

在开发示例 android 应用程序时,我构建了两个活动 1)活动一 2)活动2

现在活动 2 是前台活动,而活动 1 是后台活动。现在用户按下 Home 键。应用程序(即两个活动)消失。现在我们重新启动我们将 Activity 1 视为前台 Activity 的应用程序。我的问题是:

1) 平台是否在按下 Home 键时保留任何历史记录? 2)我们如何在重新启动应用程序时将用户带到最后一个启动活动?

【问题讨论】:

这是一个已知的 Android 错误。见code.google.com/p/android/issues/detail?id=26658 可以在code.google.com/p/android/issues/detail?id=2373#c21找到解决方法 【参考方案1】:

我已经为这种奇怪的行为苦苦挣扎了一个多月,但我终于通过反复试验找到了原因。

当您从 Eclipse、命令行启动应用程序或安装应用程序并在安装后立即按“打开”按钮(而不是“完成”按钮)启动应用程序时,会发生此行为。

如果在其中一种情况下,您启动应用程序,转到 Activity1,然后转到 Activity 2,按 HOME 按钮,然后按应用程序图标,它将打开 Activity1 的一个新实例。不要相信我的话。只需按 BACK 即可看到它会将您带到按 HOME 时离开的 Activity2。

如果应用程序以上述方式之一启动,启动器活动似乎不会放在活动堆栈中,这就是为什么它会在应用程序堆栈中的当前活动之上创建一个新的启动器活动实例.这在我看来就像一个错误。

因此,解决方法是退出应用程序,第一次从 Eclipse 或命令行或打开按钮等启动时,根据需要多次按 BACK 按钮,然后再次进入应用程序。从那时起,行为将如预期的那样。

编辑: 更好的解决方法是:创建一个 DummyActivity 并将其设置为应用程序的主要入口点。另外,添加标志android:noHistory="true"DummyActivity 很简单,看起来像这样:

公共类 DummyActivity 扩展 Activity

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    if (!MyApplication.startedApp) 
        Intent intent = new Intent(this, HomeActivity.class);
        startActivity(intent);
    

    finish();
 

MyApplication 是一个扩展 android.app.Application 并在 AndroidManifest.xml 中定义的类。在HomeActivity.class 中,您在onCreate() 方法中将布尔字段startedApp 设置为true。如果用户在屏幕上按 BACK,则需要将 startedApp 的值移动为 false。

公共类 HomeActivity 扩展 Activity

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    MyApplication.startedApp = true;


@Override
public void onBackPressed() 
    MacawApplication.startedApp = false;
    super.onBackPressed();

因此,第一次启动应用程序时,它会进入 if 块并在我们的应用程序中启动第一个实际活动。如果您浏览应用程序,然后按 HOME,然后再次启动应用程序,DummyActivity 将被第二次调用,它只会调用自己的 finish(),应用程序将显示您按 HOME 之前的最后一个活动。

【讨论】:

可以在code.google.com/p/android/issues/detail?id=2373#c21找到更好的解决方法 阅读其他人的cmets,似乎不确定该方法是否适用于所有版本。目前,我坚持使用它,因为我已经使用了将近 2 年,而且效果很好。 在我看来,您的解决方案有一个漏洞。布尔值MyApplication.startedApp 在应用程序启动时设置并且永远不会被清除。这意味着如果用户启动您的应用程序然后单击 BACK 按钮,则活动堆栈中将没有活动,但MyApplication.startedApp 将是true。如果用户随后再次从主屏幕启动应用程序,这将启动您的 DummyActivity,然后立即调用finish()。您的代码假定一旦用户离开应用程序,操作系统将立即终止您的应用程序进程,我认为这不好 你是对的。我添加了我已经在自己的代码中使用的缺失部分。拦截 onBackPressed 并将startedApp 设置为false。 解决这个问题已经几个月了,我对一个更好的、“框架正确”的解决方案充满信心,它不需要维护您自己的应用程序/堆栈状态。这是对上面提到的 #21 修复的轻微增强,可在此处获得:code.google.com/p/android/issues/detail?id=2373#c40【参考方案2】:

当按下 Home 键时,平台是否保留任何历史记录?

是的。启动/完成时的活动被推入/弹出历史堆栈。

我们如何在重新启动时将用户带到上次启动活动 申请?

AFAICT,这应该是默认行为。当您重新启动应用程序时,您将被带到堆栈上的最后一个 Activity,除非您更改堆栈。

详情请阅读:Application Fundamentals - Activities and Tasks

【讨论】:

理论上这是默认行为。但在实践中,在某些用例中,它的行为并不正常。【参考方案3】:

这是 Android 操作系统的错误。

请执行以下步骤。

1)删除您的应用程序并重新安装。

2) 安装应用程序后,将显示两个选项“完成”和“打开”点击完成按钮。

3) 现在从应用程序菜单打开应用程序。您的问题将得到解决。

只要按下 HOME 按钮,应用程序就会从它离开的状态开始。

【讨论】:

【参考方案4】:

我也可以推荐阅读Activity and Task Design Guidelines。这些是关于在按下 Home 按钮、按下 Back 按钮等时如何表现的用户界面指南。

这不是非常技术性的,但它很好地说明了您的应用程序应该如何运行以及操作系统期望什么。

【讨论】:

【参考方案5】:

您无法处理主页按钮... Android开发页面说主页按钮更新处理.. 很容易理解..谢谢

【讨论】:

【参考方案6】:

Activity 的启动模式会影响按 Home 后重新启动时的行为。如果第一个活动是作为单任务或单实例启动的,那么它总是第一个将被恢复的活动。

如果activity使用默认启动模式启动,那么当应用重启时,之前的activity会恢复

【讨论】:

【参考方案7】:

当您按下主页按钮时应用程序将消失,当重新启动应用程序时前台活动将恢复,

原因是安卓操作系统的行为

【讨论】:

【参考方案8】:

我遇到了类似的问题。它不是启动最后一个打开的活动,而是启动器活动。但我也放了

android:launchMode="singleTask"

在清单中的我的启动器活动中。删除它解决了我的问题。 如果您也放置了相同的东西,请尝试将其删除,它也可能会为您修复。

【讨论】:

以上是关于Home 按键行为的主要内容,如果未能解决你的问题,请参考以下文章

安卓平板按键凹陷没有home键怎么开机?

unity行为树怎么输入按键

Android拦截HOME键

怎样减少ipad的home按键的使用

Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息

选项卡上的按键事件行为