当用户按下主页时,将第一个屏幕设置为启动器上的当前项目?

Set first screen as current item on launcher when user presses home?

我正在构建一个 launcher/home 屏幕替换应用程序,我注意到所有启动器都允许用户按 Home 键转到启动器的第一个屏幕。所以显然可以听家庭更换应用程序的主页键,但我一直无法弄清楚如何。

当用户在我的启动器中按 home 键时,如何监听 home 键并触发 setCurrentItem(0)?

编辑

到目前为止我有两个选择:

@Override
public void onPause() {
    super.onPause();

    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    if(!this.isFinishing())
    {
        if (sharedPrefs.getBoolean("user_called", false))
        {
            // Si fue por una llamada del usuario eliminar bandera y no hacer nada
            Utils.setUserCalled(getApplicationContext(), false);
        }
        else
        {
            mPager.setCurrentItem(0);
        }
    }
}

另一种方法是这样的:

Boolean appState = false;

@Override
public void onPause() {
    super.onPause();
    appState = false;
}

@Override
public void onResume() {
    super.onResume();

    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    if(!appState)
    {
        if (sharedPrefs.getBoolean("user_called", false))
        {
            // Si fue por una llamada del usuario eliminar bandera y no hacer nada
            Utils.setUserCalled(getApplicationContext(), false);
        }
        else
        {
            mPager.setCurrentItem(0);
        }
    }
}

两者都使用名为 user_called 的标志来了解用户是否开始了呼叫。我现在的问题是当 phone 响铃时,这两种方法都失败了。有没有办法过滤这些案例?

isFinishing() 

return TRUE 当 activity 将要 完成或销毁时。

isFinishing() 

return FALSE 当 activity 进入后台时

@Override
protected void onPause() {

    super.onPause();
    if (!this.isFinishing()){

        //Insert code for HOME  key Event
    }
}

Ovverriding onUserLeaveHint() 与我一起工作 - 我可以在用户使用主页按钮离开时立即执行操作,并且 it's not called 以防来电。

不知道这是否适用于家庭 activity。

@Override
public void onUserLeaveHint() {
    super.onUserLeaveHint();
    mPager.setCurrentItem(0);
}

你当然可以使用 OnPause(),但你也可以试试这个:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {     
    if(keyCode == KeyEvent.KEYCODE_HOME) {
        //do things
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

如前面的答案所述,您可以挂钩主页键按下事件。但是,这仅在您的应用 运行(即显示在您的屏幕上)时有效。

但如果我没理解错的话,你实际上想要别的东西。您正在制作自定义启动器,因此您希望 Android 在按下主页按钮时启动您的应用程序。为此,您需要正确设置 AndroidManifest.xml 文件。

这是一份完整的分步指南,介绍如何制作自定义启动器应用程序。第 3 部分有详细说明,如何将您的应用程序注册为启动器。

http://code.tutsplus.com/tutorials/build-a-custom-launcher-on-android--cms-21358

您无法听到主页按钮按下,因为它是系统事件,不会传送到应用程序。文档 here and also can be seen from Android codes here 中对此进行了描述。背后的想法很简单——你不应该编写一个会劫持 phone 的应用程序。您可以 "break" 后退按钮功能,但不能使用主页按钮功能。

现在第三方启动器通常做的是首先在清单中声明启动器activity启动模式为singleInstanceandroid:launchMode="singleInstance"。然后,除了覆盖 onCreate() 之外,您还覆盖了 onNewIntent()。当 activity 已经是 运行 但有人发出了重新启动它的意图时,通常会调用它而不是 onCreate()。在启动器的情况下,当您的启动器已经 运行 但系统触发启动它的意图时,它将被调用,因为用户按下了主页按钮。在该功能中,您可以转到默认的 'home' 页面。