前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 双击退出程序但活动不结束功能!

Android 双击退出程序但活动不结束功能!

作者头像
圆号本昊
发布2021-09-24 11:26:50
6510
发布2021-09-24 11:26:50
举报
文章被收录于专栏:github@hornhuang

本片博客将详细介绍:

  • Android 活动中  onKeyDown()   onKeyUp()   onBackPressed()  三个方法的关系及使用
  • 最后给出实现双击退回桌面的源码实例
“Android 双击退出”的图片搜索结果
“Android 双击退出”的图片搜索结果

大家经常能接到一个需求

app 退到主界面之后,点击一下 home 键弹出提示:”再点一下退出程序“,要实现这个功能,首先就要先搞懂这三个方法之间的调用关系。

所以,见名知意:

  1. onKeyDown 就是按下按键的意思,
  2. onKeyUp 就是松开按键的意思,
  3. onBackPressed 就是返回键被点击的意思。

我们先看下源码

首先瞅瞅 onKeyDown() 的源码:(太长了咱看重点)

可以看到,如果是点击了 Home 键( 也就是 KEYCODE_BACK )的话,将会调用 onBackPressed() 方法


我们接着看 onBackPressed() 方法

我们可以看到,在 onBackPressed() 方法中,又调用了 finishAfterTransition() 方法

很明显该方法的作用就是结束丹铅活动,所以流程就很清晰了,再看看它的调用

你也可以那自己的音量键做做测试,一直按着一直调用 onKeyDown()


总结一下

  1. 当我们按下 Home 键(其他键,像音量键啥的也一样)的时候调用 onKeyDown() ,
  2. 然后该方法会判断是那个键被按下,
  3. 如果是 Home 键的话,就调用 onBackPressed() 方法,
  4. 接着 onBackPressed() 方法又调用了 finishAfterTransition() 方法结束当前活动

onKeyUp() 方法

类似这里贴下官方文档,就不唠叨了:


双击退回桌面但活动仅退到后台的实现

很明显,要实现这个功能,首先要重写这几个方法,这时我们先注意下文档,我们看到:无论是 onKeyDown onKeyUp 都有类似这么一句话

重点:如果我们仅仅希望使用我们自己的代码,不希望再去执行系统代码,就返回 true ,如果执行完我们自己的代码后,依然打执行系统代码,就返回 false,我们当然不希望在执行系统代码,是的活动又被 finish() 调,所以我们这里返回 true。


重写 onKeyUp() 方法

首先判断 是否为 Home 键,如果是,执行自己代码,否则执行系统代码( 不加判断的话,你双击音量键也得退出 )

代码如下:

代码语言:javascript
复制
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK){
        long secondTime = System.currentTimeMillis();
        if (secondTime - firstClicked > 2000) {
            LogUtils.d("up");
            ToastUtils.makeText(MainActivity.this, "在按一次退出");
            firstClicked = secondTime;
            return true;
        } else {
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addCategory(Intent.CATEGORY_HOME);
            startActivity(intent);
        }
    }
    return true;
}

这时你会发现音量键也失效了,所以我们得加上另一个条件,如果不是 Home 键则一切照常:

代码语言:javascript
复制
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK){
        long secondTime = System.currentTimeMillis();
        if (secondTime - firstClicked > 2000) {
            LogUtils.d("up");
            ToastUtils.makeText(MainActivity.this, "在按一次退出");
            firstClicked = secondTime;
            return true;
        } else {
            Intent intent = new Intent(Intent.ACTION_MAIN);// 退到后台而不结束
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addCategory(Intent.CATEGORY_HOME);
            startActivity(intent);
        }
        return true;
    }else {
        return super.onKeyUp(keyCode, event);// 按其他键则照常调用
    }
}

如果觉得不错,别忘了点赞哦!! ?

这就是我自己的理解,如果有错误的话欢迎大家在评论区指出~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本片博客将详细介绍:
  • 大家经常能接到一个需求
  • 我们先看下源码
  • 我们接着看 onBackPressed() 方法
  • 总结一下
    • onKeyUp() 方法
    • 双击退回桌面但活动仅退到后台的实现
    • 重写 onKeyUp() 方法
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档