从这一篇文章开始,我们将进入到一个应用程序主界面UI的开发和设计中了,底部菜单栏在Android的应用 开发当中占有非常重要的地位。几乎所有的手机应用程序都有底部菜单栏这样的控件,主要是因为手机的屏幕 大小有限,这样一种底部菜单栏实现起来的效果可以很方便的为用户切换自己所需要的界面,具有更强的交互 性。底部菜单栏的样式和效果也是五花八门,多的数不胜数,但是实现的基本原理都是一样的。
这个 专题的几篇文章将更加详细的介绍几种大家比较常见的和效果比较炫的实例来进行讲解。话不多说,进入正题 。
一、TabActivity之感叹
1、TabActivity的现状
打开Google的API文档搜索 TabActivity,在介绍这个类时会发现有这么一句话,
大概的意思 是说:这个类已经在Android4.0的系统中被弃用了,新的应用程序应该使用Fragment来代替该类的开发大家可 以查看:Google开发文档
2、TabActivity是否还有存在的必要性
其实谷歌有此举动,我们也应 该早就想到了,为什么会这么说呢?那就要从TabActivity的原理开始说起了。
做个假定先: 比如我 们最外面的Activity是MainActivity, 第一个tab是FirstActivty, 第二个tab是SecondActivity。
相 信大家都用过TabActivity, 它是一个特殊的Activity,它特殊的地方在哪里?有以下几点为证:
<1> 它看起来违反了Activity的单一窗口的原则。因为它可以同时加载几个activity, 当用户点击它上面的tab时,就会跳到相应的Activity上面去。
<2> 用户首先进去 FirstActivity,然后进去SecondActivity,再点击返回键的时候。它返回的界面不是FirstActivity,而是退出 我们的应用程序。
<3> 当用户在FirstActivity按返回键的时候,如果MainActivity和 FirstActivity通过重写onKeyDown()方法,那么收到事件回调的只有FirstActivity。
3、谷歌当时的 困扰
<1> 首先我们要明白一点,android系统是单窗口系统,不像windows是多窗口的(比如在 windows系统上,我们可以一边聊QQ,一边斗地主等等)。也就是说,在一个时刻,android里面只有一个 activity可以显示给用户。这样就大大降低了操作系统设计的复杂性(包括事件派发等等)。
<2> 但是像TabActivity那种效果又非常必要,用户体验也比较好。所以我觉得当时google开发人员肯定很纠结,于 是,一个畸形的想法产生了,就是在单窗口系统下加载多个activity,它就是TabActivity。
4、 TabActivity实现加载多个Activity原理
我们都知道,想启动一个Activity,一般是调用 startActivty(Intent i)方法,然后这个方法会辗转调用到ams(ActivityManagerService)来启动目标 activity,所以,TabActivity实现的要点有两个:
<1> 找到一个入口,这个入口可以访问到 ActivityThread类(这个类是隐藏的,应用程序是访问不到的),然后调用ActivityThread里面的启动activity 方法
<2> 绕开ams,就是我们TabActivity加载的FirstActivity和SecondActivity是不能让ams 知道的。
所以,一个新的类诞生了 ---- LocalActivityManager , 它的作用如下:
<1> 这个类和ActivityThread处于一个包内,所以它有访问ActivityThread的权限。
<2> 这个类提供了类似Ams管理Activity的方法,比如调用activity的onCreate方法,onResume()等等 ,维护了activity生命周期。
也正如其名字一样,它是本地的activity管理。就是说它运行的进程和它管 理的Activity是在一个进程里面。所以,当TabActivity要启动一个activity的时候,会调用到 LocalActivityManager的创建activity方法,然后调用ActivityThread.startActivityNow(),这个方法绕过 了ams,就是说ams此时根本不知道LocalActivityManager已经在暗渡陈仓的启动了一个activity(所以ams的 task列表里面没有新启动activity的记录,所以用户按back键就直接退出我们的应用)。然后和正常启动 activity一样,初始化activity,在初始化activity的时候,有个方法非常重要:activity.attch()
final void attach(...){ .... mWindow.setCallback(this); ..... }
mWindow.setCallback(this)这个方法非常重要,它设置了window的回调接口,这是我们activity 能够接受到key事件的关键所在!因为在DecorView在接受到事件的时候,会回调这个接口,如:
final Callback cb = getCallback(); final boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event) : super.dispatchKeyEvent(event);
当我们启动FirstActivity的时候,我们设置FirstActivity为 PhoneWindow的回调实现,所以,按back键的时候,调用的是FirstActivity的onKeyDown方法。
5、 TabActivity小结
从以上的种种分析来看,TabActivity只是一个怪胎而已。所以,在后面的发展中肯 定会被代替,只是没想到会被替代的这么快。不经让我有了一种英雄暮路,美人辞暮的感觉,至少 TabActivity曾经在Android2.2/2.3版本那么显赫一时,不过终究还是逃不过被谷歌遗弃的命运。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索安卓 fragment
, activity
, 方法
, 安卓 activity
, tabactivity
, 底部菜单栏
, localactivitymanager
, activity引用安卓手机
, 一个
, android底部菜单
, 底部菜单
, 底部菜单实现
, android底部菜单栏
退出多个activity
android底部菜单栏、微信公众号底部菜单栏、html5 手机底部菜单栏、安卓底部菜单栏、苹果底部菜单栏设置,以便于您获取更多的相关知识。