(一)前言
在以前一篇帖子讲ams的时候,提了一下TabActivity。当时说它比较特殊就没有下文了,今天重发一篇帖子,跟大家探讨一下TabActivity。
做个假定先: 比如我们最外面的Activity是MainActivity, 第一个tab是FirstActivty, 第二个tab是SecondActivity .
相信大家都用过TabActivity, 它是一个特殊的Activity,它特殊的地方在哪里?有以下几点为证:     
a. 它看起来违反了Activity的单一窗口的原则。因为它可以同时加载几个activity, 当用户点击它上面的tab时,就会跳到相应的Activity上面去。
b. 用户首先进去FirstActivity,然后进去SecondActivity,再点击返回键的时候。它返回的界面不是FirstActivity,而是退出我们的应用程序。
c. 当用户在FirstActivity按返回键的时候,如果MainActivity和FirstActivity通过重写onKeyDown()方法,那么收到事件回调的只有FirstActivity。

(二)TabActivity存在必要性以及google当时的困扰
a. 首先我们要明白一点,android系统是单窗口系统,不像windows是多窗口的(比如在windows系统上,我们可以一边聊QQ,一边斗地主等等)。也就是说,在一个时刻,android里面只有一个activity可以显示给用户。
这样就大大降低了操作系统设计的复杂性(包括事件派发等等).
b. 但是像TabActivity那种效果又非常必要,用户体验也比较好。所以我觉得当时google开发人员肯定很纠结。。 于是,一个畸形的想法产生了,就是在单窗口系统下加载多个activity,它就是TabActivity。

(三)TabActivity实现加载多个Activity原理
我们都知道,想启动一个Activity,一般是调用startActivty(Intent i)方法。然后这个方法会辗转调用到ams(ActivityManagerService)来启动目标activity.
所以,TabActivity实现的要点有两个:
a. 找到一个入口,这个入口可以访问到ActivityThread类(这个类是隐藏的,应用程序是访问不到的),然后调用ActivityThread里面的启动activity方法
b. 绕开ams,就是我们TabActivity加载的FirstActivity和SecondActivity是不能让ams知道的。
所以,一个新的类诞生了 ---- LocalActivityManager , 它的作用如下:
1.  这个类和ActivityThread处于一个包内,所以它有访问ActivityThread的权限。
2.  这个类提供了类似Ams管理Activity的方法,比如调用activity的onCreate方法,onResume()等等,维护了activity生命周期, 和ams相比,就像西游记里面的大雷音寺和小雷音寺一样。
    也正如其名字一样,它是本地的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方法。

(四)TabActivity的现状
上面第二点也说了,TabActivity只是个怪胎而已。所以,在后面的发展中肯定会被代替。果然,google在android3.0推出了Fragment这个东东,这个东东就可以代替TabActivity.
不可避免的,和TabActivity相关的类都被声明为Deprecated,包括它的父类ActivityGroup, 已经我们的小雷音寺LocalActivityManager ....
写到这里,不仅有种英雄暮路,美人辞暮的感觉,突然想起了最近热播的楚汉传奇,楚霸王威武一世,到最后,也不免自刎于乌江.. TabActivity曾经在Android2.2/2.3版本时那么显赫一时,终难免被人抛弃。。不仅悲从心来,长歌当哭..

Android TabActivity之感叹的更多相关文章

  1. Android TabActivity中onKeyDown无效问题

    @Override     public boolean onKeyDown(int keyCode, KeyEvent event)     {                  //按下键盘上返回 ...

  2. android TabActivity的局限性 是否还有存在的必要性

     TabActivity的局限性 是否还有存在的必要性 其实谷歌有此举动,我们也应该早就想到了,为什么会这么说呢?那就要从TabActivity的原理开始说起了. 做个假定先: 比如我们最外面的Act ...

  3. Android TabActivity与Activity之间的动画跳转(主要Tabhost中跳转出来的动画效果解决)

    首先,要说的是ActivityA到ActivityB的切换这个相对简单,只要overridePendingTransition(In,out). 这里不就说了.但是这里要说名的ActivityA不能T ...

  4. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  5. 使用ActivityGroup来切换Activity和Layout

    前言 在一个主界面中做Activity切换一般都会用TabActivity,使用方便,Activity互相之间相对独立,但是可定制性不强,而且修改起来很麻烦.当然也可以把layout分开,把逻辑代码全 ...

  6. Android之TabActivity的使用

    TabActivity实现多页显示效果 由于手机屏幕有限,所以我们要尽量充分利用屏幕资源.在我们的应用程序中通常有多个Activity,而且会经常切换显示,这样我们就可以用TabActivity来显示 ...

  7. Android Tab -- 使用TabWidget、TabHost、TabActivity来实现

    原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 TabActivity在API13之后被fragment替代了,所以不建议使用 ...

  8. Android(java)学习笔记122:TabActivity使用

    1.首先我们要知道TabActivity是结合TabHost使用的,于是我们自然而然要说明一下TabHost 所谓的TabHost是提供选项卡(Tab页)的窗口视图容器. 此对象包含两个子对象: 一个 ...

  9. Android之对TabActivity的见解,个人觉得不错

    http://www.cnblogs.com/answer1991/archive/2012/05/08/2489844.html answer1991 无法停止我内心的狂热,对未来的执着. Andr ...

随机推荐

  1. 装饰者模式(Decorator)

    首先来看一个例子: 比如,饮料可以分为很多种类,而这里我取一个咖啡,那么这个咖啡呢,有多种形式的, 比如有加糖了的咖啡,有加奶的咖啡,也有加热了的咖啡,也有加了冰块的咖啡. 而各个顾客的选择却是不同的 ...

  2. VBoxManage命令详解

    转自:http://zhang-ly520.iteye.com/blog/300606 由于最近工作对vbox有一定涉猎,发现这个写的比较好,先转来,稍有空时再根据自己的心得整理一下. VBoxMan ...

  3. js 求两个日期之间相差天数

    //求两个日期之间的相差天数 function daysBetween(DateOne, DateTwo) { var OneMonth = DateOne.substring(5, DateOne. ...

  4. spring 入门笔记(一)

    最近学习spring 通过笔记形式加深自己对spring的理解,也希望能跟各位入门者分享和讨论. 一.下载spring 下载spring也费了不少功夫,目前还没从spring官网找到下载入口,我从下面 ...

  5. 10 款强大的JavaScript图表图形插件推荐

    转自:http://www.iteye.com/news/24535 网上有很多用于绘制图表图形的免费JavaScript插件和图表库,这类插件大量出现的原因,一是人们不再依赖于Flash,二是浏览器 ...

  6. Win7 64位 php-5.5.13+Apache 2.4.9+mysql-5.6.19 配置

    一 :准备阶段 1:php php-5.5.13下载链接:http://windows.php.net/downloads/releases/php-5.5.13-Win32-VC11-x64.zip ...

  7. apache 修改端口号 修改根目录 建立多个网站

    修改apache端口号选择Apache下的httpd.conf,查找:Listen,你会看到 #Listen 12.34.56.78:80Listen 80把80改成90,保存就好了 修改WampSe ...

  8. 手把手教你使用python复杂一点点的装饰器

    #只要@deco后面跟括号,都要 先传装饰器参数,返回 再传目标待装饰函数,返回 传目标函数的参数 #这个参数可以是类 def deco(arg):#装饰器的函数在这里传 print('0',arg) ...

  9. 实验一:基于Winsock完成简单的网络程序开发

    第一部分:简答的UDP网络通信程序 // UDP5555.cpp : Defines the entry point for the application. //================== ...

  10. 触摸事件 - UIControlEvents

    首先,UIControlEvents有这个几种: UIControlEventTouchDown           = 1 <<  0,      // on all touch dow ...