当用户按下主页时,将第一个屏幕设置为启动器上的当前项目?
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启动模式为singleInstance:android:launchMode="singleInstance"
。然后,除了覆盖 onCreate()
之外,您还覆盖了 onNewIntent()
。当 activity 已经是 运行 但有人发出了重新启动它的意图时,通常会调用它而不是 onCreate()
。在启动器的情况下,当您的启动器已经 运行 但系统触发启动它的意图时,它将被调用,因为用户按下了主页按钮。在该功能中,您可以转到默认的 '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启动模式为singleInstance:android:launchMode="singleInstance"
。然后,除了覆盖 onCreate()
之外,您还覆盖了 onNewIntent()
。当 activity 已经是 运行 但有人发出了重新启动它的意图时,通常会调用它而不是 onCreate()
。在启动器的情况下,当您的启动器已经 运行 但系统触发启动它的意图时,它将被调用,因为用户按下了主页按钮。在该功能中,您可以转到默认的 'home' 页面。