Android TabActivity之感叹
(一)前言
在以前一篇帖子讲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之感叹的更多相关文章
- Android TabActivity中onKeyDown无效问题
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { //按下键盘上返回 ...
- android TabActivity的局限性 是否还有存在的必要性
TabActivity的局限性 是否还有存在的必要性 其实谷歌有此举动,我们也应该早就想到了,为什么会这么说呢?那就要从TabActivity的原理开始说起了. 做个假定先: 比如我们最外面的Act ...
- Android TabActivity与Activity之间的动画跳转(主要Tabhost中跳转出来的动画效果解决)
首先,要说的是ActivityA到ActivityB的切换这个相对简单,只要overridePendingTransition(In,out). 这里不就说了.但是这里要说名的ActivityA不能T ...
- Android UI开发第三十九篇——Tab界面实现汇总及比较
Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...
- 使用ActivityGroup来切换Activity和Layout
前言 在一个主界面中做Activity切换一般都会用TabActivity,使用方便,Activity互相之间相对独立,但是可定制性不强,而且修改起来很麻烦.当然也可以把layout分开,把逻辑代码全 ...
- Android之TabActivity的使用
TabActivity实现多页显示效果 由于手机屏幕有限,所以我们要尽量充分利用屏幕资源.在我们的应用程序中通常有多个Activity,而且会经常切换显示,这样我们就可以用TabActivity来显示 ...
- Android Tab -- 使用TabWidget、TabHost、TabActivity来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 TabActivity在API13之后被fragment替代了,所以不建议使用 ...
- Android(java)学习笔记122:TabActivity使用
1.首先我们要知道TabActivity是结合TabHost使用的,于是我们自然而然要说明一下TabHost 所谓的TabHost是提供选项卡(Tab页)的窗口视图容器. 此对象包含两个子对象: 一个 ...
- Android之对TabActivity的见解,个人觉得不错
http://www.cnblogs.com/answer1991/archive/2012/05/08/2489844.html answer1991 无法停止我内心的狂热,对未来的执着. Andr ...
随机推荐
- Windows上帝模式
在桌面新建一个文件夹 按F2重命名为 GodMode.{ED7BA470-8E54-465E-825C-99712043E01C} 完成
- MD5算法的使用
using System.Security.Cryptography; using System.Text; StringBuilder sb = new StringBuilder();//构建一个 ...
- ES5严格模式
http://www.cnblogs.com/snandy/p/3428171.html 介绍了由ECMA262规范定义的Javascript标准,旨在改善错误检查功能并且标识不会延续到未来js版本的 ...
- 正则表达式 U贪婪模式
<?php/*模式修正符号: i u 位置:"//模式修正符位置" 可以一次使用一个,也可以一次使用多个 对整个正则表达式调优用的,也可以说是对正则表达式功能的扩展 &quo ...
- windows Server 2008 IIS7 503错误解决方案
windows 2008 R2 在访问的时候经常会出现503错误,于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,下面是具体的解决方案: w ...
- 【FLYabroad 】微软内部代码检查工具 (Microsoft Source Analysis for C#)[转]
SourceAnalysis (StyleCop)的终极目标是让所有人都能写出优雅和一致的代码,因此这些代码具有很高的可读性. 早就听说了微软内部的静态代码检查和代码强制格式美化工具 StyleCop ...
- sql 语句左连接右连接小例子
A表(a1,b1,c1) B表(a2,b2) a1 b1 c1 a2 b2 01 数学 95 01 张三 02 语文 90 02 李四 03 英语 80 04 王五 select A.*,B.* fr ...
- postgres常用类型
数值类型 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字节 常用的整数 -2147483648 到 +2147483647 ...
- Word中封面的问题
老师给了封面,当从一个文档复制到另一个文档时格式变了,即便用格式刷也解决不了一些问题,那么就把正文复制到带有封面的文档,把老师的其他内容删掉.
- 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错
原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...