android检测返回键onBackPressed和onKeyDown区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android检测返回键onBackPressed和onKeyDown区别相关的知识,希望对你有一定的参考价值。

参考技术A 本篇文章介绍如何在android中实现监听返回键,主键,菜单键。一般情况下,我们都可以在Android手机底部看到三个按钮,这三个按钮就分别是返回键,主键,菜单键。

接下来介绍监听这三个键的实现。

第一种方法通过onBackPressed()方法来实现

/**
* 注意:
* super.onBackPressed()会自动调用finish()方法,关闭当前Activity.
*/
@Override
public void onBackPressed()
super.onBackPressed();
Toast.makeText(this, "按下了back键 onBackPressed()", Toast.LENGTH_SHORT).show();


onBackPressed()提供的功能有限,它这是在退出之前通知onBackPressed()方法,并不能改变用户原来的行为

利用onKeyDown方法,就可以实现

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
if ((keyCode == KeyEvent.KEYCODE_BACK))
Toast.makeText(this, "按下了back键 onKeyDown()", Toast.LENGTH_SHORT).show();
return false;
else
return super.onKeyDown(keyCode, event);



onKeyDown方法返回true表示退出,返回false便不退出。

还可以通过跳转来实现退出,

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN)
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);

return super.onKeyDown(keyCode, event);


通过onKeyDown我们可以实现,实现“再按一次返回键退出程序”的功能

private long exitTime = 0;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN)
if((System.currentTimeMillis()-exitTime) > 2000)
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
else
finish();
System.exit(0);

return true;

return super.onKeyDown(keyCode, event);


监听Home键可以通过onUserLeaveHint()方法来实现,

@Override
protected void onUserLeaveHint()
super.onUserLeaveHint();
Toast.makeText(this, "onUserLeaveHint", Toast.LENGTH_SHORT).show();


在这个方法中,我们可以观察出,如果onUserLeaveHint方法是不能改变用户的行为的。

在手机下方的三个键中,最右边的键就是菜单键,通常是用方括号表示的。经过笔者的测试发现,如果轻点一下,那么会跳出菜单界面,如果长点的话,那么会退出程序。这个过程会自动调用onUserLeaveHint方法,也就是主键。

菜单的监听也可以通过onKeyDown()方法来实现

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)

处理上面这样的方法,onOptionsMenuClosed()方法也可以实现。

@Override
public void onOptionsMenuClosed(Menu menu)
super.onOptionsMenuClosed(menu);
Toast.makeText(this, "onOptionsMenuClosed clicked", Toast.LENGTH_SHORT)
.show();

经过笔者的测试,发生这些方法在高版本中可能出现不兼容的情况,关于菜单可以查看 Android中Menu菜单

原文地址: https://www.cnblogs.com/HDK2016/p/8695052.html#a1

膨胀视图和返回键 android 或 onBackPressed()

【中文标题】膨胀视图和返回键 android 或 onBackPressed()【英文标题】:inflate view and back key android or onBackPressed() 【发布时间】:2013-11-28 06:48:45 【问题描述】:

final View view1 = getLayoutInflater().inflate( R.layout.activity, homescreen, false);

我们正在使用getLayoutInflater() 来扩充活动中的自定义视图。所以流程是当用户点击一个按钮时,我们删除一个视图并在同一活动中膨胀另一个视图。现在这种方法的问题是如果使用点击手机的后退键,应用程序就会停止活动。我们真正想要的是获得以前的布局。

    有android提供的方法我们应该实现吗? 在每个视图的SetOnKeyListner 上处理返回键 处理 onBackPressed() 的活动以查看当前打开的视图并手动扩展另一个视图 使用片段事务? 还有其他方法吗?

【问题讨论】:

【参考方案1】:

我建议你使用Fragments

您可以将片段添加到后台堆栈,以便在应用中管理您的后台导航。

【讨论】:

【参考方案2】:

1.有android提供的方法我们应该实现吗?

没有。尽管在 Activity 中替换视图是可以接受的,但没有方便的方法来保持视图集合并在它们之间导航。

2.在每个视图的SetOnKeyListner上处理返回键

绝对不是。

3.Handle onBackPressed() 的activity来查看当前打开的是哪个view并手动给另一个view充气

仅在绝对必要时才应处理 BACK 压力。你必须记住的是,Android 设备的用户会期望有规律的使用和感觉——偏离预期的行为太远可能会降低你的应用程序的吸引力。也就是说,根据您的应用的功能,在 Activity 级别处理 BACK 可能是可以接受的,但您仍然没有简单的方法来管理视图堆栈。

4.使用分片交易?

是的。绝对是首选方法。片段以模块化形式结合了子活动功能和视图。该操作系统还将为您处理后台堆栈,让您在编写应用程序时更加轻松。

【讨论】:

【参考方案3】:

最好的方法是使用 ViewFlipper 或 Pager 实现您的逻辑,您可以在视图之间导航并通过按钮控制它们。考虑到您的情况,您可以通过触摸按钮更改视图或页面,这两个小部件都对此提供了很好的支持。

在后按期间,您可以轻松地导航回上一页,直到它到达第一个页面,然后您就可以简单地完成您的活动。

希望对您有所帮助。

【讨论】:

以上是关于android检测返回键onBackPressed和onKeyDown区别的主要内容,如果未能解决你的问题,请参考以下文章

react native 之 Android物理返回键

android中使用startactivityforresult跳转Activity后需要重写onBackPressed()方法

安卓开发重写onBackPressed()方法不能处理对话框返回事件

android Intent跳转页面之后按手机返回键 怎样使他不再返回到跳转之前的页面

cocos构建的android项目的返回键相应

Android Activity返回键控制的两种方式