Android TabActivity之感歎

來源:互聯網
上載者:User

標籤:android   ar   art   cti   amp   sp   on   new   ad   

(一)前言
在以前一篇文章講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之感歎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.