Adroid学习之 从源码角度分析-禁止使用回退按钮方案

有时候,不能让用户进行回退操作,如何处理?

查看返回键触发了哪些方法。在打开程序后把这个方法禁止了。
问题:程序在后台驻留,这样就会出现,其他时候也不能使用回退按钮。如何处理,在onpase()时方法失效。
方案一:
1 //重载onBackPressed
2 @Override
3 public void onBackPressed() {
4         // TODO Auto-generated method stub
5         //super.onBackPressed();
6 }

查看Adroid源码 onBackPressed ()源码:

1     public void onBackPressed() {
2         finish();
3     }

重写这个方法会不会有什么问题呢?他执行一个finish();方法对其本身应该没什么问题,那么调用出呢?

下面是Activity中调用的两处:
Adroid源码调用1:
 1     public boolean onKeyDown(int keyCode, KeyEvent event) {
 2     //当按钮等于KEYCODE_BACK时执行下面方法,KEYCODE_BACK这个就是返回键
 3         if (keyCode == KeyEvent.KEYCODE_BACK) {
 4            //检测版本号   ECLAIR 值为:public static final int ECLAIR = 5;
 5             if (getApplicationInfo().targetSdkVersion
 6                     >= Build.VERSION_CODES.ECLAIR) {
 7             //当大于5是执行
 8             /**startTracking()解释:调用onKeyUp()方法。
 9             Call this during Callback.onKeyDown to have the system track the key through its final up (possibly including a long press). Note that only one key can be tracked at a time -- if another key down event is received while a previous one is being tracked, tracking is stopped on the previous event.
10             */
11                 event.startTracking();
12             } else {
13                 onBackPressed();
14             }
15             return true;
16         }
17 }

Adroid源码调用2:

 1     public boolean onKeyUp(int keyCode, KeyEvent event) {
 2         if (getApplicationInfo().targetSdkVersion
 3                 >= Build.VERSION_CODES.ECLAIR) {
 4             if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
 5                     && !event.isCanceled()) {
 6                 onBackPressed();
 7                 return true;
 8             }
 9         }
10         return false;
11     }

  到这里可以看出我们在onBackPressed()被调用处,都是在按下返回键的情况下,所以可以冲写onBackPressed方法,因为是被调用的,虽然不会出错,但是效率应该不高。

要不我们重写onKeyDown方法这样可行,直接拦截。
1  @Override 
2     public boolean onKeyDown(int keyCode, KeyEvent event) { 
3         if(keyCode==KeyEvent.KEYCODE_BACK) {
4             Toast.makeText(getApplicationContext(), "back press", Toast.LENGTH_LONG).show();
5              return false; // Disable back button.............. 
6 }

但是会如果在按钮处直接拦截,效果应该会高一些,这样就不会触发上面这两个方法了。

于是乎我们继续向上寻找。
细心的朋友可能发现onBackPressed()调用了finish()方法,所以干脆我们重写它吧。
方案二:重载finish函数:
查看Android的 finish()源码:
 1 public void finish() {
 2         if (mParent == null) {
 3             int resultCode;
 4             Intent resultData;
 5             synchronized (this) {
 6                 resultCode = mResultCode;
 7                 resultData = mResultData;
 8             }
 9             if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
10             try {
11                 if (ActivityManagerNative.getDefault()
12                     .finishActivity(mToken, resultCode, resultData)) {
13                     mFinished = true;
14                 }
15             } catch (RemoteException e) {
16                 // Empty
17             }
18         } else {
19             mParent.finishFromChild(this);
20         }
21     }

查看Android源码中调用它的方法:

 1     /**
 2      * This is called when a child activity of this one calls its
 3      * {@link #finish} method. The default implementation simply calls
 4      * finish() on this activity (the parent), finishing the entire group.
 5      *
 6      * @param child The activity making the call.
 7      *
 8      * @see #finish
 9      */
10     public void finishFromChild(Activity child) {
11         finish();
12     }

从说明中我们知道这个方法是在子Activity结束时调用的这个方法,所以不行,如果我们要重写,需要进行判断拿到的键值。效率不高。

继续寻找,看看哪里执行了调用方法按键吧。
方案三:重写keyevent方法 大括号里加上return true 这样就禁用父类方法达到禁止返回键的目的 
Android源码中找来找去找到了这个:
 1  /**
 2      * Called to process key events. You can override this to intercept all
 3      * key events before they are dispatched to the window. Be sure to call
 4      * this implementation for key events that should be handled normally.
 5      *
 6      * @param event The key event.
 7      *
 8      * @return boolean Return true if this event was consumed.
 9      */
10     public boolean dispatchKeyEvent(KeyEvent event) {
11         onUserInteraction();
12         Window win = getWindow();
13         if (win.superDispatchKeyEvent(event)) {
14             return true;
15         }
16         View decor = mDecor;
17         if (decor == null) decor = win.getDecorView();
18         return event.dispatch(this, decor != null
19                 ? decor.getKeyDispatcherState() : null, this);
20     }

就是在按钮触发的事件,当然是Activity中的。到此我们发现我们找到地方了,按钮进入后第一个处理的地方,再次我们重写这个方法就OK了。

 1 @Override
 2 
 3 public boolean dispatchKeyEvent(KeyEvent event) {
 4 
 5 if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) 
 6         {     
 7 
 8      return true; 
 9 
10         }
11 
12 return super.dispatchKeyEvent(event);
13 
14 }

 


转载于:https://www.cnblogs.com/dava/p/3688577.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

骑士游历问题问题_骑士步行问题

骑士游历问题问题Problem Statement: 问题陈述: There is a chessboard of size NM and starting position (sx, sy) and destination position (dx,dy). You have to find out how many minimum numbers of moves a knight goes to that destination position? 有…

Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)...

一、搭建Android开发环境 准备工作:下载Eclipse、JDK、Android SDK、ADT插件 下载地址:Eclipse:http://www.eclipse.org/downloads/ JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html Android SD…

《dp补卡——01背包问题》

目录01背包[416. 分割等和子集](https://leetcode-cn.com/problems/partition-equal-subset-sum/)[1049. 最后一块石头的重量 II](https://leetcode-cn.com/problems/last-stone-weight-ii/)[494. 目标和](https://leetcode-cn.com/problems/target-sum/)01背包 1、dp数组以及…

用JavaScript往DIV动态添加内容

参考&#xff1a;http://zhidao.baidu.com/link?url6jSchyqPiEYCBoKdOmv52YHz9r7MTBms2pK1N6ptOX1kaR2eg320mlW1Sr6n36hpOeOadBxC2rWWGuhZPbms-K <div id"show"></div>要填充的数据为: 这是一个测试例子.jquery&#xff1a;$(function(){ var data …

《dp补卡——完全背包问题》

N件物品和一个最多能背重量为W的背包。第i件物品的重量为weight[i]&#xff0c;得到的价值是value[i]。每件物品都有无限个(可以放入背包多次)&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 01背包和完全背包唯一不同在于遍历顺序上。 01背包的核心代码&#xff1a…

Java中的类型转换

类型转换 (Typecasting) Typecasting is a term which is introduced in all the language similar to java. Typecasting是一个用与Java类似的所有语言引入的术语。 When we assign primitive datatype to another datatype. 当我们将原始数据类型分配给另一个数据类型时。 I…

让crash文件中的内存地址变成函数名称,

假如程序员编译了inhouse给测试。 如果在测试过程中出现奔溃现象&#xff0c;我想程序员一般会来看Device Log 也就是 crash文件 如果crash文件遇到如下的情况&#xff0c;在重要的地方看不到函数名称。我想是一件很奔溃的事情。 1 Exception Type: EXC_BAD_ACCESS (SIGSEGV)2…

《dp补卡——多重背包》

多重背包简介&#xff1a; 有N种物品和一个容量为V的背包。第i种物品最多有Mi件可用&#xff0c;每件耗费的空间为Ci&#xff0c;价值为Wi。求解将哪些物品装入背包可使得这些物品耗费的空间总和不超过背包容量&#xff0c;且价值总和最大。 将Mi件摊开&#xff0c;就是一个01背…

kafka消息确认ack_什么是确认(ACK)? ACK代表什么?

kafka消息确认ackACK&#xff1a;致谢 (ACK: Acknowledgment) An acknowledgment (ACK) is a signal that is passed among the communicating processes, computers, or devices to indicate acknowledgment, or delivery of the message, as a component of a communications…

CocoaAsyncSocket 套接字

CocoaAsyncSocket 套接字 https://github.com/robbiehanson/CocoaAsyncSocket Asynchronous socket networking library for Mac and iOS 用于iOS以及Mac的异步套接字网络库。 TCP GCDAsyncSocket and AsyncSocket are TCP/IP socket networking libraries. Here are the key…

谷歌浏览器设置缓存方法

谷歌浏览器设置缓存方法&#xff1a; 1、在桌面Google Chrome快捷方式&#xff0c;目标&#xff1a;找到 C:\Users\Splendid\AppData\Local\…\Application\chrome.exe 在这后面加上-Disk-Cache-Dir”Z:\TEMP” 注意: -Disk前面有空格&#xff0c;”Z:\TEMP” 是文件存放在Z盘T…

《dp补卡——买卖股票问题》

目录121. 买卖股票的最佳时机贪心dp思路滚动数组优化122. 买卖股票的最佳时机 II123. 买卖股票的最佳时机 III188. 买卖股票的最佳时机 IV309. 最佳买卖股票时机含冷冻期714. 买卖股票的最佳时机含手续费121. 买卖股票的最佳时机 贪心 取最左最小值&#xff0c;取最右最大值&…

oo0ooo0ooo0oo_OoO的完整形式是什么?

oo0ooo0ooo0ooOoO&#xff1a;外出 (OoO: Out of Office) OoO is an abbreviation of "Out of Office". OoO是“不在办公室”的缩写。 It is an expression, which is commonly used in the Gmail platform. It is written in the body or the subject of the email…

SP2010开发和VS2010专家食谱--第三章节--高级工作流(2)--为沙盒解决方案创建自定义活动...

尽管沙河解决方案功能有限&#xff0c;你仍然可以开发自定义活动&#xff0c;在SharePoint Designer中使用而不用改变web.config或添加.ACTION文件到根文件夹。 转载于:https://www.cnblogs.com/crazygolf/p/3856795.html

sql where 1=1和 0=1 的作用

where 11; 这个条件始终为True&#xff0c;在不定数量查询条件情况下&#xff0c;11可以很方便的规范语句。 一、不用where 11 在多条件查询中的困扰 举个例子&#xff0c;如果您做查询页面&#xff0c;并且&#xff0c;可查询的选项有多个&#xff0c;同时&#xff0c;还让用户…

j@2ff4f00f_J4F的完整形式是什么?

j2ff4f00fJ4F&#xff1a;只是为了好玩 (J4F: Just For Fun) J4F is an abbreviation of "Just For Fun". J4F是“ Just For Fun”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceboo…

《dp补卡——子序列问题》

目录300. 最长递增子序列674. 最长连续递增序列718. 最长重复子数组1143. 最长公共子序列53. 最大子序和392. 判断子序列115. 不同的子序列583. 两个字符串的删除操作72. 编辑距离647. 回文子串 &#xff08;与 5.最长回文子串思路差不多&#xff09;516. 最长回文子序列300. 最…

[LeetCode] Maximal Rectangle

Given a 2D binary matrix filled with 0s and 1s, find the largest rectangle containing all ones and return its area. 在做 Largest Rectangle in Histogram的时候有人说可以用在这题&#xff0c;看了一下还真是&#xff0c;以每行为x轴&#xff0c;每列往上累计的连续的…

什么是alpha测试_什么是ALPHA?

什么是alpha测试Α (ALPHA) Alpha is the first and foremost letter of the Greek alphabet. In the classification of Greek numerals or numbers, it constitutes a value of 1. Alpha是希腊字母的第一个也是最重要的字母 。 在希腊数字或希腊数字的分类中&#xff0c;它的…

《leetcode : 647. 回文子串 思考分析双指针解法》

647. 回文子串 如何确定是回文串&#xff1a; 找中心然后往两边扩散&#xff0c;判断是否对称即可。 在遍历中心点的时候&#xff0c;注意中心点可以是一个元素也可以是两个元素。 class Solution { public:int cal_two_extend(const string& s,int i,int j,int n){int re…