Android界面跳转与Activity返回栈的关系及重写系统返回键

版权声明:如果需要引用文中内容,希望可以带上相应的链接地址,万分感谢。地址: https://blog.csdn.net/shaowanyunBLOG/article/details/82180914

Android开发中,使用Intent完成一个界面跳转是再寻常不过的一个功能。我们会用一个又一个的Intent跳转去衔接我们的app的不同界面,那么问题就来了,一般我们实现返回上一个界面的时候,要么我们会在布局中添加一个返回按钮之类的控件去做,但是同样的,安卓设备上还有一个物理的返回键,当我们点击这个按键的时候一般也是可以返回到上一个界面的,但是不知道是否大家遇到过这样一个场景:我们进入注册界面,注册成功之后跳转到登录界面,登录也成功之后,就会进入到主界面,假设这里所有的跳转都由Intent来完成。一般来讲,主界面里面我们不会加返回按钮,那么这个时候我们点击系统返回键,会不会就很奇怪的退回到了登录界面呢?更奇怪的,我们再点击一下返回键会不会又退到了登录界面了呢?那么这样的逻辑会不会很奇怪呢,是的,那相当的奇怪了。

为什么会发生上述的情况呢?我觉得需要了解一下系统返回键的实现机制,相关的比较细致的讲解可以自行百度,我这里只把最关键的地方勾勒一下。我们不论是在书上还是在其他地方看到的Intent跳转代码大部分是这样的:

Intent intent = new Intent(A.this,B.class);

startActivity(intent);

这是比较常见的一种,但是我们应该还见过一种,就是在上面两行代码之后添加一个finish()方法这种类型的。那么这有什么区别呢?我想这就是要考虑什么是Activity的返回栈的含义的时候了,简而言之,“栈”,简单说,特征就是“先进后出”,这个大家应该都了解。那Activity返回栈又是什么含义呢?跟“先进后出”有什么关系呢?什么时候“进”,什么时候“出”呢?怎么做算是“进”,怎么做又算是“出”呢?一系列的问题摆在我们面前,接下来进一步用代码分析。接下来的分析是我个人的意见,可能不一定严谨,但是我觉得最起码应该是没错的。仅仅给大家提供一个大致的概念。

闲言少叙,直接分析。按照我的理解,什么是“进栈”?下面我以一个简单的app运行过程来进行分析。

(1)整个app的第一个进栈,就是配置文件里面声明的主界面,当app启动时,会读取配置文件,然后将我们定义的主界面Activity加载进返回栈中,这个是栈中第一个Activity。(这里命名为MainActivity)

(2)Intent intent = newIntent(MainActivity.this,AActivity.class);

        startActivity(intent);

这里,就是第二个“进栈”的过程,我从MainActivity跳转到了AActivity,那么这时,返回栈中,就是AActivity+MainActivity,而且,MainActivity在栈底。也就是说,我们每当使用一次Intent,就相当于给Activity的返回栈中push了一个“新的”Activity,这里为什么说是“新的”Activity,我后面再说。

(3)从(2)中其实可以观察到一点,就是我们没有使用finish()方法,那么假如我们在(2)中Intent代码后面使用了finish();会怎样呢?其实显而易见,这个finish()方法就是把当前Activity从返回栈中pop出来的方法。也就是说,添加了finish()方法之后的结果就是,从MainActivity跳转到AActivity的之后,返回栈中,只剩下AActivity了。

扫描二维码关注公众号,回复: 3111929 查看本文章

(4)上面基本上讲解了关于Intent的使用以及finish()的作用,那么系统返回键又是实现了什么方法呢,其实我觉得,系统返回键就是finish()方法。

(5)利用(4)中的说法,我们模拟一下情景。(1)中,初始时只有MainActivity,我们点击系统返回键,这时将会退出app,因为执行过finish()方法之后,返回栈中没有任何一个界面,那么系统将会杀掉app;(2)中,有两个Activity,分别是栈底的MainActivity和当前的AActivity,我们点击系统返回键,那么当前的AActivity将会被杀掉,然后我们就会看到MainActivity,如果再点击一次返回键,就如(1)中一样,退出app了;(3)中,MainActivity向AActivity跳转时把自己finish掉了,导致此时返回栈中只有AActivity剩余,那么,此时如果点击了系统返回键,同样因为返回栈中没有任何一个界面而退出app。那么,综上所述,其实我们可以类似的去类比(2) = (3)+(1),这个式子如果理解了上面的过程,我觉得还是挺好理解的。

上面的五点,就是我所理解的关于安卓返回栈和Intent跳转以及finish方法这三者之间的关系了,可能讲的不是很清晰,但是大概的意思,我觉得还是表达出来了,如果能够自己写一个简单的小例子按照我上面的(1)(2)(3)(4)(5)去跟着尝试一下,我觉得理解会更加轻松一些,对于理解安卓返回栈,以及怎样实现很常见的“再次点击返回将退出app”的功能都是比较有帮助的。同时了解这三者之间的关系,也会对我们在设计app时界面之间的转换关系,以及什么时候要在Intent后面添加finish,什么时候只用finish,等等问题给一个清楚的导向,剩下的还是需要大家去练习。

最后我的标题里面还提到了重写系统返回键方法,是的,如我上面所说,系统返回键默认执行finish()方法,但是加入我不希望用户可以点到返回键,或者是我想自定义返回键怎么办呢?那么就要重写系统的返回键方法了,其实很简单,我在最后面把代码直接贴出来了,在注释部分我们就可以按照自己的需求和设计去自定义我们想要的系统返回键方法了(注意上面的@Override 一定不能少,因为这里是重写方法)。有时间的话,大家也可以尝试一下我这篇文章中分享的东西,尝试让自己的app的流程更加清晰可控。

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

   if (keyCode == KeyEvent.KEYCODE_BACK) {

       //点击完返回键,执行的动作

   }

   return true;

}

猜你喜欢

转载自blog.csdn.net/shaowanyunBLOG/article/details/82180914
今日推荐