在开发中其实不论前台、后台都会留一些后门,方便管理人员操作(有点超级权限的意思),但是这样的入口我们又不能让用户直接看到,所以就有一些芝麻开门的操作 ~

今天真是个好日子啊 - 2020.5.20, 计划终究还是赶不上变化 ~

  • 后门效果
  • 长按监听 (原生版)
  • 长按时长监听(乞丐版)
  • 长按时长监听(主推:土豪版)
    • 长按时长监听
    • 使用方式
  • 规定时间,点击次数(主推:土豪版)
  • 基于实践 - Demo
    • 监听方式
    • MainActivity
    • activity_main

后门效果

长按监听 (原生版)

Android系统自带的一种长按监听,长按时间差不多在0.5秒-1.5秒左右,如果入口想做的深一点,其实不必考虑这种,因为有的用户可能无意就会触发到 ~ 同时不太利于扩展,例如领导说做个5秒响应,那就凉凉了~

当然 - 如果说要求没有那么严格,那么可以直接使用这种方式,毕竟系统自带,分秒实现 ~

      findViewById(R.id.btn_1).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {Toast.makeText(MainActivity.this, "触发:隐藏入口", Toast.LENGTH_LONG).show();return true;}});

长按时长监听(乞丐版)

此种方式主要利用了Android中onTouch机制,在手指Down的时候记录当前时间,UP的时候计算时间差 ~

但是有一些瑕疵,因为你要一直不抬起手指的话,岂不是一直进不去隐藏入口 …

        Long startTime;Long endTime;findViewById(R.id.btn_2).setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN://记录起始时间startTime = System.currentTimeMillis();break;case MotionEvent.ACTION_UP://获取手指抬起时间,然后计算按压操作的时间差endTime = System.currentTimeMillis();if (endTime - startTime > 3 * 1000) {Log.e("tag", "触发:隐藏入口");Toast.makeText(MainActivity.this, "触发:隐藏入口", Toast.LENGTH_LONG).show();} else {Log.e("tag", "未超过5秒");Toast.makeText(MainActivity.this, "未超过5秒", Toast.LENGTH_LONG).show();}break;default:break;}return true;}});

长按时长监听(主推:土豪版)

起初我想着通过onTouch的Down事件记录时间和按压状态,开启计时器,当满足条件则开启入口,同时UP的时候判断是时间差,取消计时器,看是否满足开启入口条件,但是果断使用TimerTask 后如果第二次去创建调用schedule会报错 ~ 一时间想不到什么好的方式去处理,就直接搜索到了成型的方法 … 当然也是通过OnTouch这种方式执行的 ~ 但是有Handler的使用哈 ~

以下方法,早已流传多时,使用也确实没什么问题

长按时长监听

LongClickUtils(此类可直接copy)

package nk.com.hideentrance;import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;/*** @author MrLiu* @date 2020/5/20* desc*/
public class LongClickUtils {private static final String TAG = "LongClickUtils";/*** @param handler           外界handler(为了减少handler的泛滥使用,最好全局传handler引用,如果没有就直接传 new Handler())* @param longClickView     被长按的视图(任意控件)* @param delayMillis       长按时间,毫秒* @param longClickListener 长按回调的返回事件*/public static void setLongClick(final Handler handler, final View longClickView, final long delayMillis, final View.OnLongClickListener longClickListener) {longClickView.setOnTouchListener(new View.OnTouchListener() {private int TOUCH_MAX = 50;private int mLastMotionX;private int mLastMotionY;@Overridepublic boolean onTouch(View v, MotionEvent event) {int x = (int) event.getX();int y = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 每次按下重新计时// 按下前,先移除 已有的Runnable回调,防止用户多次单击导致多次回调长按事件的bughandler.removeCallbacks(r);mLastMotionX = x;mLastMotionY = y;// 按下时,开始计时handler.postDelayed(r, delayMillis);break;case MotionEvent.ACTION_MOVE:if (Math.abs(mLastMotionX - x) > TOUCH_MAX || Math.abs(mLastMotionY - y) > TOUCH_MAX) {// 移动误差阈值// xy方向判断// 移动超过阈值,则表示移动了,就不是长按(看需求),移除 已有的Runnable回调handler.removeCallbacks(r);}break;case MotionEvent.ACTION_UP:// 抬起时,移除已有Runnable回调,抬起就算长按了(不需要考虑用户是否长按了超过预设的时间)handler.removeCallbacks(r);break;}//onclick等其他事件不能用请改这里return true;}private Runnable r = new Runnable() {@Overridepublic void run() {// 回调给用户,用户可能传null,需要判断nullif (longClickListener != null) {longClickListener.onLongClick(longClickView);}}};});}
}
使用方式
        LongClickUtils.setLongClick(new Handler(), view, 3000, new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {Toast.makeText(MainActivity.this, "触发:隐藏入口", Toast.LENGTH_LONG).show();return true;}});

规定时间,点击次数(主推:土豪版)

这份功能代码其实网上早就有了,主要是在一个时间差内记录用户的点击次数是否达标,如果满足条件即出发入口,反之重置时间与次数 ~

        //临时时间private long mTempTime;//点击次数private int mClickNum;/*规定时间内:点击次数的方式*/findViewById(R.id.btn_3).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {long time = System.currentTimeMillis();//第一次点击隐藏入口,保存临时时间if (mTempTime == 0) {mTempTime = time;} else {//这里设置两秒的超时时间,如果超过两秒,重置状态if (time - mTempTime > 2000) {//给临时时间和点击次数进行初始化mTempTime = time;mClickNum = 0;return;}mClickNum++;mTempTime = time;//因为一次点击走if语句,这里可以设置对应的点击次数,但是最少也要2次,不然用这个没有意义,mClickNum == 连续点击数-1if (mClickNum == 4) {Toast.makeText(MainActivity.this, "连续点击五次", Toast.LENGTH_SHORT).show();//给临时时间和点击次数进行初始化mTempTime = 0;mClickNum = 0;}}}});

基于实践 - Demo

可通过此处,下载Demo ~

监听方式

LongClickUtils(针对时长监听,此类可直接copy)

package nk.com.hideentrance;import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;/*** @author MrLiu* @date 2020/5/20* desc*/
public class LongClickUtils {private static final String TAG = "LongClickUtils";/*** @param handler           外界handler(为了减少handler的泛滥使用,最好全局传handler引用,如果没有就直接传 new Handler())* @param longClickView     被长按的视图(任意控件)* @param delayMillis       长按时间,毫秒* @param longClickListener 长按回调的返回事件*/public static void setLongClick(final Handler handler, final View longClickView, final long delayMillis, final View.OnLongClickListener longClickListener) {longClickView.setOnTouchListener(new View.OnTouchListener() {private int TOUCH_MAX = 50;private int mLastMotionX;private int mLastMotionY;@Overridepublic boolean onTouch(View v, MotionEvent event) {int x = (int) event.getX();int y = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 每次按下重新计时// 按下前,先移除 已有的Runnable回调,防止用户多次单击导致多次回调长按事件的bughandler.removeCallbacks(r);mLastMotionX = x;mLastMotionY = y;// 按下时,开始计时handler.postDelayed(r, delayMillis);break;case MotionEvent.ACTION_MOVE:if (Math.abs(mLastMotionX - x) > TOUCH_MAX || Math.abs(mLastMotionY - y) > TOUCH_MAX) {// 移动误差阈值// xy方向判断// 移动超过阈值,则表示移动了,就不是长按(看需求),移除 已有的Runnable回调handler.removeCallbacks(r);}break;case MotionEvent.ACTION_UP:// 抬起时,移除已有Runnable回调,抬起就算长按了(不需要考虑用户是否长按了超过预设的时间)handler.removeCallbacks(r);break;}//onclick等其他事件不能用请改这里return true;}private Runnable r = new Runnable() {@Overridepublic void run() {// 回调给用户,用户可能传null,需要判断nullif (longClickListener != null) {longClickListener.onLongClick(longClickView);}}};});}
}
MainActivity
package nk.com.hideentrance;import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {//Down按下时间Long startTime;//UP抬起时间Long endTime;//临时时间private long mTempTime;//点击次数private int mClickNum;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/***长按监听 (原生版)*/findViewById(R.id.btn_1).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {Toast.makeText(MainActivity.this, "触发:隐藏入口", Toast.LENGTH_LONG).show();return true;}});/***长按时长监听(乞丐版)*/findViewById(R.id.btn_2).setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:startTime = System.currentTimeMillis();Log.e("tag", "startTime:" + startTime);break;case MotionEvent.ACTION_UP:endTime = System.currentTimeMillis();Log.e("tag", "开始:" + startTime);Log.e("tag", "结束:" + endTime);if (endTime - startTime > 3 * 1000) {Log.e("tag", "触发:隐藏入口");Toast.makeText(MainActivity.this, "触发:隐藏入口", Toast.LENGTH_LONG).show();} else {Log.e("tag", "未超过5秒");Toast.makeText(MainActivity.this, "未超过5秒", Toast.LENGTH_LONG).show();}break;default:break;}return true;}});/***长按时长监听(主推:土豪版)*/LongClickUtils.setLongClick(new Handler(), findViewById(R.id.btn_3), 3000, new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {Toast.makeText(MainActivity.this, "触发:隐藏入口", Toast.LENGTH_LONG).show();return true;}});/***规定时间,点击次数(主推:土豪版)*/findViewById(R.id.btn_4).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {long time = System.currentTimeMillis();//第一次点击隐藏入口,保存临时时间if (mTempTime == 0) {mTempTime = time;} else {//这里设置两秒的超时时间,如果超过两秒,重置状态if (time - mTempTime > 2000) {//给临时时间和点击次数进行初始化mTempTime = time;mClickNum = 0;return;}mClickNum++;mTempTime = time;//因为一次点击走if语句if (mClickNum == 4) {Toast.makeText(MainActivity.this, "已连续点击五次 - 触发:隐藏入口", Toast.LENGTH_SHORT).show();//给临时时间和点击次数进行初始化mTempTime = 0;mClickNum = 0;}}}});}
}
activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/btn_1"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:gravity="center"android:text="长按监听 (原生版) - 隐藏入口" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#fb5" /><TextViewandroid:id="@+id/btn_2"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:gravity="center"android:text="长按时长监听(乞丐版) - 隐藏入口" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#fb5" /><TextViewandroid:id="@+id/btn_3"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:gravity="center"android:text="长按时长监听(主推:土豪版) - 隐藏入口" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#fb5" /><TextViewandroid:id="@+id/btn_4"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:gravity="center"android:text="规定时间,点击次数(主推:土豪版) - 隐藏入口" />
</LinearLayout>

Android进阶之路 - 隐藏入口相关推荐

  1. Android进阶之路 - 软键盘中右下角的设置与监听

    在项目中,多多少少会遇到修改软键盘右下角按钮的需求,虽然已经写过几次,但是还是觉得在这里专心做个笔记比较放心 ~ 我的那些软键盘Blog ~ Android进阶之路 - 常见软键盘操作行为 Andro ...

  2. Android进阶之路 - 解决部分手机拍照之后图片被旋转的问题

    这几天犯了一个错误,初期想着甩锅给后台的- 但还好及时发现了是自身的问题~ 关联文章 Android基础进阶 - 调用拍照.获取图片(基础) Android基础进阶 - 获取.调用相册内图片(基础) ...

  3. Android进阶之路 - 批量下载、缓存图片、视频

    之前已经记录过,批量下载图片和缓存本地的方式,此篇主要记录批量下载图片.视频,同时缓存在本地的功能实现 关联篇 Android进阶之路 - 批量下载.缓存图片 Android进阶之路 - 批量下载.缓 ...

  4. Android进阶之路 - 批量下载、缓存图片

    在日常项目开发中,关于图片批量下载,数据缓存的相关功能比比皆是,这次也是去年在项目中需要在本地缓存商品数据,所以用到了批量下载的功能,特此记录 ~ 关联篇 Android进阶之路 - 批量下载.缓存图 ...

  5. Android进阶之路 - 存、取、读 本地 Json 文件

    最近在开发中又开始加载一些本地的json数据源,回头看之前竟然没记录,赶紧记录一波 ~ 如何准备一个合格的json文件? AndoridStudio中如何存放json文件? 如何读取本地Json文件数 ...

  6. 浅谈Android进阶之路

    原址 过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期.依然记得在 2010-2013 年期间,从事 ...

  7. Android 进阶之路(我的博客文章目录)

    原文地址:http://blog.csdn.net/u011240877 为了方便读者阅读以及自己回顾,总结写过的文章和一些想要写的文章目录如下: #1.Java Java 解惑:Comparable ...

  8. Android 进阶之路:ASM 修改字节码,这样学就对了!

    本文已授权个人公众号「鸿洋」原创发布. 恢复双休了,准备捡起来写博客这件事,会尝试写好每一篇博客,准备写一个「进阶之路」的系列,希望对你有用. 没错,看了很多 ASM 入门的文章,都感觉文章写的很轻松 ...

  9. Android进阶之路 - 代码规范

    后来 - 回头再看该篇的时候,发现当项目处于中后期的时候,命名规范还是不太严谨,扩展性有限,所以推荐各位可以借鉴阿里.美团.华为等大厂的命名规范 ~ 关于代码规范(主要针对Android),我于202 ...

最新文章

  1. Xamarin.Forms教程下载安装JDK配置环境变量
  2. Vmware Vsphere虚拟化技术:6.7新特性介绍
  3. 在 SELECT 查询中使用表表达式
  4. python爬虫下载重试_python爬虫多次请求超时的几种重试方法(6种)
  5. 烂泥:NFS做存储与KVM集成
  6. deeplearning中卷积后尺寸的变化
  7. 监控系统选型,这篇不可不读
  8. 学小易电脑端——大学生搜题平台
  9. rarlinux 安装与使用
  10. 古董Mac电脑复活最佳工具 macOS Mojave Patcher工具
  11. 【线性代数】范德蒙行列式
  12. 手机传感器你知道多少个?
  13. android小米4c 权限,小米4C root教程_小米4C卡刷获取root权限的方法
  14. 浏览器(2):自制Chromium内核浏览器,自动统计CSDN社区打卡记录
  15. 一个完整的NES模拟器
  16. 第三方对接-支付宝支付
  17. javascript getDay()方法 语法
  18. win10没有改用本地账户登录选项怎么办
  19. 简述Thread的interrupt()、interrupted()及isInterrupted()的区别
  20. mysql 1265错误_Mysql出现ERROR 1265: Data truncated for

热门文章

  1. DocuSign网站用户资料泄露,病毒团伙利用邮件疯狂作恶
  2. excel添加删除线
  3. 企业入职测试题目及答案_公司新员工入职三级安全教育测试题(附答案)
  4. JavaScript 解决计算误差
  5. 手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
  6. 人口流向数据_数读:全国各省人口流入流出图
  7. 概率论与数理统计测试(一)
  8. 解决百度云限速以及网页上无法下载大文件的问题
  9. 使用intellijidea无法识别@SpringbootApplication问题
  10. 关于MLCC陶瓷电容,这篇总结得太全面了