Android 关于长按back键退出应用程序的实现

Android _ Jetpack 处理回退事件的新姿势 —— OnBackPressedDispatcher 目录 前置知识 这篇文章的内容会涉及以下前置 / 相关知识,贴心的我都帮你准备好了,请享用~ 你真的懂 Fragment 吗?AndroidX Fragment 核心原理分析 1. 概述 OnBackPressedDispatcher 解决了什么问题: 在 Activity 里可以通过回调方法 onBackPressed() 处理,而 Fragment / View 却没有直接的回调方法。现在,我们可以使用 OnBackPressedDispatcher 替代 Activity#onBackP 阅读详情

          Android 关于长按back键退出应用程序的实现

最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面这种方法,实现起来比较简单:

复制代码
//代码来自:http://www.devdiv.com/home.php?mod=space&uid=67600&do=blog&id=7024
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
      if (keyCode == KeyEvent.KEYCODE_BACK) 
      {
        if ((System.currentTimeMillis() - mExitTime) > 2000) 
        {
          mHelperUtils.showToast(mContext, R.string.exit_content);
          mExitTime = System.currentTimeMillis();
        }
        else 
        {
          finish();
        }
        return true;
      }
      return super.onKeyDown(keyCode, event);
    }
复制代码

   从上面的代码可以看出,采用的思路就是连续两次点击back键的时间间隔在2s以内,则认为是双击,从而退出程序。

   因此,借鉴上面的思路,我的最初想法是:可以重写onKeyDown方法和onKeyUp方法,计算这执行这两个方法之间的时间间隔,如果大于2s,则认为是长按,从而退出程序;否则,则执行back键原有的响应。按照这个思路:

复制代码
public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
        if (keyCode == KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0) 
        { 
            start=System.currentTimeMillis(); 
            Log.e("start",String.valueOf(start));
            return false; 
        } 
        
        return super.onKeyDown(keyCode, event);
    } 
    
    public boolean onKeyUp(int keyCode,KeyEvent event)
    {
        if (keyCode == KeyEvent.KEYCODE_BACK &&event.getRepeatCount()==0) 
        { 
            end=System.currentTimeMillis(); 
            Log.e("end",String.valueOf(end));
            
            if(start!=-1&&(end-start)>2000)
            {
                AlertDialog.Builder builder = new Builder(MainActivity.this);
                builder.setMessage("确认退出吗?");
                builder.setTitle("提示");
                builder.setPositiveButton("确认",new DialogInterface.OnClickListener()
                {
                    public void onClick(DialogInterface dialog,int which)
                    {
                        dialog.dismiss();
                        MainActivity.this.finish();
                        System.exit(0);
                    }
                });

                builder.setNegativeButton("取消",new DialogInterface.OnClickListener() 
                {
                    public void onClick(DialogInterface dialog,int which) 
                    {
                        dialog.dismiss();
                    }
                });
                builder.create().show();
                return true;
            }
            else
            {
                
                return super.onKeyUp(keyCode, event);
            }
        }
        return super.onKeyUp(keyCode, event);
    }
复制代码

  然而,这样能够实现长按back键退出程序,但是非长按back键的时候,点击back则失效了,查找了很多Android 按键事件分发和处理机制方面的资料,还是没弄清楚原因(后面有时间再研究)。于是考虑换一种思路去处理,考虑去重写Activity中的dispatchKeyEvent方法。

复制代码
public boolean dispatchKeyEvent(KeyEvent event)
   {
        int keyCode=event.getKeyCode();
        //Log.e("start",String.valueOf(start));
        switch(keyCode)
        {
            case KeyEvent.KEYCODE_BACK:
            if(event.isLongPress())   //这句很重要,判断事件是否是长按事件
              {
                AlertDialog.Builder builder = new Builder(MainActivity.this);
                builder.setMessage("确认退出吗?");
                builder.setTitle("提示");
                builder.setPositiveButton("确认",new DialogInterface.OnClickListener()
                {
                    public void onClick(DialogInterface dialog,int which)
                    {
                        dialog.dismiss();
                        MainActivity.this.finish();
                        System.exit(0);
                    }
                });

                builder.setNegativeButton("取消",new DialogInterface.OnClickListener() 
                {
                    public void onClick(DialogInterface dialog,int which) 
                    {
                        dialog.dismiss();
                    }
                });
                builder.create().show();
                return true;
            }
            return super.dispatchKeyEvent(event);  //如果不是长按,则调用原有方法,执行按下back键应有的处理
            default:
                break;
        }
        return super.dispatchKeyEvent(event);
    }
复制代码

  最后通过重写dispatchKeyEvent方法实现了长按back键退出程序,而且没有屏蔽掉原有的非长按back键功能。

qml在stackView的情况下处理Android back键(返回键)全局双击back键退出程序 在qml中的使用StackView,编译到手机后想通过back键进行pop操作,但是用正常的Keys过滤的时候由于StackView在pop的时候丢失焦点所以back键直接变成android默认的推出功能,然后就想用c++来写一个过滤器来获取Key_Back; 思路来源于http://www.mamicode.com/info-detail-1434390.html(原链接已跪,上个转发的) 阅读详情

相关推荐

掌握Android的onBackPressed()方法:自定义返回键行为

在Android应用开发中,onBackPressed()方法是Android SDK提供的一个回调函数,与物理返回键或在Android虚拟设备上的”返回”按钮相关联。当用户尝试离开当前Activity,按下返回键时,onBackPressed()会被触发。它允许开发者在用户离开当前页面前执行特定的逻辑,比如保存数据或释放资源。开发者可以通过重写Activity中的onBackPressed()方法来自定义返回键的行为。

weixin_42405592的博客 1898

android fragment返回按钮,Android Fragment处理后退按钮按下

Android Fragment处理后退按钮按下这个问题在这里已有答案:如何在Fragments中实现onBackPressed()? 40个答案我的活动中有一些片段[1], [2], [3], [4], [5], [6]如果当前活动片段为[2],则必须从[2]返回[1],否则不执行任何操作。这样做的最佳做法是什么?编辑:申请...

weixin_36210213的博客 1104

FragmentBackPress

解决Fragment中没有OnbacPressed 方法的Demo。上面也用到了startActivityForResult的机制

【Android】Fragment中监听Backpress返回键

我们只要允许Fragment的RootView获得焦点,并获得焦点,再添加KeyListener即可。但是RootView默认是无法获取按键焦点的,所以即使添加了KeyListener也无效。可以给Fragment中的RootView添加KeyListener。在Fragment中监听返回键,并结束Activity。Fragment未提供监听返回键的方法。

天天向上 Up Up Up (*^▽^*) 892

Android 两种方法实现长按返回健退出

Android 长按返回健退出 背景 平常比较常见的都是一定时间间隔内按两次返回键来退出应用,并且第一次点击会有相应的提示,网上资料比较多,这里写一下,长按返回键退出。 实现 实现的方案常用的有两个: 重写dispatchKeyEvent(KeyEvent event)方法 重写onKeyDown(int keyCode, KeyEvent event)方法 方案一 @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BA

Android实现长按back键退出应用程序的方法

本文实例讲述了Android实现长按back键退出应用程序的方法。分享给大家供大家参考。具体分析如下: 最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面这种方法,实现起来比较简单: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK)

android Fragment 响应back键

Fragment中处理back键消息

kmblack1的专栏 905

从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南

本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。

sky77的博客 540

android中点击按钮退出应用程序,Android实现长按back键退出应用程序的方法

本文实例讲述了Android实现长按back键退出应用程序的方法。分享给大家供大家参考。具体分析如下:最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面这种方法,实现起来比较简单:@Overridepu...

weixin_30466329的博客 1057

基于CLICKHOUSE的数据仓库分层规范

接入层。

zjyy1987的博客 770

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 380

Android BACK键和HOME键应用差异详解

在Android设备上,BACK键和HOME键是两个常见的导航按钮,它们的功能和行为有所不同。理解这两个键的区别有助于开发人员更好地设计应用程序的用户体验。BACK键主要用于导航到之前的屏幕或退出当前活动(Activity)。具体功能包括:应用程序可以通过重写方法来自定义BACK键的行为: 1.2 HOME键 功能 HOME键用于返回设备的主屏幕。它的行为特点包括:开发者无法直接拦截或重写HOME键的行为,这是为了保证用户能够随时返回主屏幕,维护一致的用户体验。导航目的:可自定义性:应用生命周期影响:用户体

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 1万+

IFIX往Mysql数据库同步数据方法

通过IFix数据库向Mysql数据库同步数据

仙人掌 1596

android,连续点击两次back键退出应用程序

第一步,定义一个变量,用于标识是否退出 boolean isExit;   第二步,重写Activity中onKeyDown方法 [java] view plaincopy @Override      public boolean onKeyDown(int keyCode, KeyEvent event) {          if 

berry666的专栏 3189

PostgreSQL的学习心得和知识总结(一百二十六)|深入理解PostgreSQL数据库SQL执行时间计算 \timing 和 log_duration的使用和原理

1、参考书籍:《PostgreSQL数据库内核分析》2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》3、

孤傲小二~阿沐的博客 984

图神经网络实战(1)——图神经网络(Graph Neural Networks, GNN)基础

本节全面介绍了图神经网络 (Graph Neural Network, GNN) ,包括其在数据分析和机器学习中的重要性。首先探讨了图作为数据表示的相关概念及其在各个领域的广泛应用;然后深入探讨图学习的重要性,包括不同的应用和技术。最后,重点介绍了 GNN 架构,并对比了它与其他方法之间的原理和性能差异。

盼小辉丶的博客 15万+

Android之back键拦截处理

Back键是手机上的后退键,在Android上有两种方法来获取该按钮的事件。 **一:如何捕获Back按键事件**1.直接获取按钮按下事件,直接重写Activity的onKeyDown方法即可,代码如下:@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEY

LYJ的IT生活 1万+

《QGIS快速入门与应用基础》079:KML/KMZ格式:Google Earth兼容

KML/KMZ是专为地理可视化设计的空间数据格式,原生兼容Google Earth,支持点线面要素标注与多媒体集成。KML为XML文本格式,KMZ是其压缩版本。该格式优势在于可视化表现力强、跨平台共享便捷,适合地理标注、路线分享等场景,但存在属性支持弱、大数据量处理效率低等局限。QGIS中可便捷加载和导出KML/KMZ数据,需注意编码设为UTF-8、勾选"导出样式"以保留可视化效果。建议中小规模标注数据使用KMZ格式,确保关联资源完整,提升共享效率。

LuckyHanMo的博客 772

Android Back 键与Home键相互作用效果

隐藏。

qq_46687516的博客 1454

第4章--CANoe library开发 - 诊断功能

因为专栏要做的是汽车ECU自动化测试程序,测试的是ECU的诊断和刷新,因此就需要利用CANoe的接口,开发一些方便使用的诊断报文收发函数。

j187067046的博客 1398

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android back键退出动画,Android Back键点击两次退出应用详解及实现方法总结

思路:Android中捕获用户按键是在onKeyDown方法中,只需要判断用户按键是否是KEYCODE_BACK即后退键即可,剩下的即为判断两次点击BACK键时间间隔问题了第一种实现方式package com.example.clickexittest;import android.app.Activity;import android.os.Bundle;import android.os.Ha...

weixin_39520199的博客 291

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: android:java.lang.OutOfMemoryError: bitmap size exceeds VM budget---缩略图
下一篇: Java 根据定路径删除文件和文件夹下的所有文件
onlywaitforyou
博客等级 码龄15年 6粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值