【问题标题】:Set first screen as current item on launcher when user presses home?当用户按下主页时,将第一个屏幕设置为启动器上的当前项目?
【发布时间】:2015-03-06 01:47:05
【问题描述】:

我正在构建一个启动器/主屏幕替换应用程序,我注意到所有启动器都允许用户按主页进入启动器的第一个屏幕。因此,显然可以为家庭替换应用程序收听 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_call 的标志来了解用户是否启动了呼叫。我现在的问题是当电话响起时两种方法都失败了。有没有办法过滤这些情况?

【问题讨论】:

标签: android launcher homescreen


【解决方案1】:

您无法收听主页按钮按下,因为它是系统事件并且未传递给应用程序。这在文档here 中有描述,也可以从Android 代码here 中看到。背后的想法很简单——你不应该编写一个会劫持手机的应用程序。您可以“破坏”返回按钮功能,但不能“破坏”主页按钮功能。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        isFinishing() 
        

          返回 TRUE,当活动将要完成或销毁时。

        isFinishing() 
        

         当活动进入后台返回 FALSE

        @Override
        protected void onPause() {
        
            super.onPause();
            if (!this.isFinishing()){
        
                //Insert code for HOME  key Event
            }
        }
        

        【讨论】:

        • 嗨,这是有效的,但是我不确定如何区分用户按下主页按钮和拨打电话时
        【解决方案5】:

        Overriding onUserLeaveHint() 与我一起工作 - 我可以在用户离开后使用 Home 按钮立即执行操作,it's not called 可以在有来电的情况下执行。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-17
          • 2013-12-09
          • 1970-01-01
          相关资源
          最近更新 更多