編輯:關於Android編程
本文我主要通過查看Activity的實現源碼和推測其設計思想的方法來探討一下Android的本質是什麼。
Activity恐怖是Android用得最多且是最基本的組件了,估計也是每個學Android的人接觸的第一概念,對於Activity的理解和說法,層出不窮,有人說是一個窗口,有個說是一個活動,但他的本質是什麼呢,官方的說法是Activity一個應用程序的組件,它提供一個屏幕來與用戶交互,以便做一些諸如打電話、發郵件和看地圖之類的事情,原話如下:
An Activity
is
an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.
這句話概括的很好,但我並不認為這就是Activity的本質。
切入主題之前,我們先要了解一下UI系統的職責和原理。所有的圖形界面,無論是什麼UI系統,都要收集用戶的活動,這些活動包括打開和關閉程序,輸入事件等,這樣系統才能針對這些活動做出一些反應,比如程序打開時加載一個數據庫,建立一個網絡連接,不過針對這些活動所作出的反應都委托給了具體的應用程序,系統相當於只是把這些事件或消息轉發給應用程序。這個消息怎麼轉發給程序呢,可以約定好,要求應程序寫一個方法,或如果是C可要求傳入一個回調,Java可以要求程序傳入一個監聽器,總之實現這個功能還是很容易的,但這麼多消息,全部傳到一個方法裡嗎,我想那樣會很慘,那樣可能要求你寫應用程序的時候可能要寫一個長長的swich語句或if語句,所以一般都把這些消息分類,如一種是整個程序的活動的消息,如關閉和打開,還有就是輸入事件,如按鍵鼠標,每個分類裡的消息還可以再細分,這樣的話,就可以封裝成多個類或接口,每個類有數個方法,之後應用程序重寫這些類方法或實現某個接口,系統就可以通過調用這些類或接口的實例發送消息了。
於是問題轉化成了類的設計。在Windows中,有個窗口類來接受一個窗口的活動,系統就可以通過調用窗口類的方法來傳遞消息,這個窗口類既接受打開和關閉的活動,又接受用戶輸入事件。而在Android中而不同,Activity只接受打開和關閉等的活動,而不會接受輸入事件,那是由Activity內嵌的Window類來接受的,然後轉發給相應View,你有可能會說Activity中有個onKeyDown方法,其實那只是處理沒人領的按鍵消息才會到達Activity。現在發現Android和Windows分發消息的的區別了吧,這樣化分,每個類的職責更細了,更明確了,當然喽,Android中的消息跟Windows中的可能有點稍小的區別。
現在應該可以很容易的理確Android的每一個生命周期對應的方法(onCreate, onStart...)其實是處理收到的消息,當用戶打開一個Activity的時候,系統(嚴格的說應該是ActivityManager)就會調用onCreate來告訴你這個消息,這個時候你就要加載你的XML布局文件並做一些初始化。然後離開的時候,就應該把這個Activity銷毀嗎,如果用戶是暫時離開,等下還要回來呢,如果銷毀了那就又得重創建,太浪費時間了(用我們家鄉話說就是太難費神了),所以不能銷毀,但是系統也得通知你用戶離開了(用的是onStop方法),因為可能需要暫停播放視頻。當下次重新進入的時候,系統又會通知你用戶又進來了,這時你可能要恢復播放了,但你有沒有發現,用戶第一次進入和再次進入,你需要做不同的處理,第一次可能是初始化一些資源,第二次可能只要恢復播放就可以了,所以系統應該告訴你,是第一次進入還是再次進入,於是系統就用了兩個方法,用onCreate告訴你用戶是第一次進入的,用onStart告訴你用戶是再次進入。
不過這還不算完,還有一種情況,用戶是半離開狀態,什麼是半離開呢,都知道Android的界在有全屏,還是非全屏,也有半透明的,這裡的半離開指的就是本界面被一個非全屏或半透明的界面蓋住,總之,你還能看到一點點被蓋的那個界面;全離開就是被全屏的界面蓋住,用戶完全看不到被蓋的。這兩種情況要有可能要區別對待,比如一個播放在線視頻的應用,它可能希望要在用戶半離開時只暫停播放,不暫停後台下載,而當用戶完全離開時,播放和下載都暫停。所以系統也應該區分這種情況,於是就有了onPause和onResume來表示半離開和從半離開恢復。值得注意的是,Android中全離開包括了半離開,半離開不包括全離開,什麼意思呢,就是即便是全離開,系統也是先調onPause再調onStop,從全離開中恢復,也是調了onStart後還會調onResume,而對於第一次進入,onCreate、onStart、onResume會被依次調用,所以記住,只要用戶進入,無論是怎麼進入的,都是調用onResume,在這裡恢復播放是再適合不過的了。還有一個onDestory也說一下,就是在銷毀的時候被調用,一般是回收資源或按了返回鍵會被銷毀。現在清楚了,也順便看一下Android官網的這張圖吧:
然後,你可能好奇系統是怎麼調用到你寫的onCreate方法的,有興趣的可以查看源碼的framewZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmGjrLTLwODA78Pm09DQ7bbgaGFuZGxlKioqQWN0aXZpdHm3vbeoo6zI52hhbmRsZVJlc3VtZUFjdGl2aXR5o6yyu7n91eKyu8rHsb7OxNXCzNbC27XE1ti146OsuvPQ+NPQv8nE3MHt0LTSu8aqzNbC26GjPC9wPgo8cD7PwsPmztLDx8C0zNbC29K7z8JBY3Rpdml0edXiuPbA4LDJo6zO0rnAvMa63LbgyMu2vLr2wtTBy0FjdGl2aXR5wODSssrH0ru49sDgo6zL/NKyv8nS1NPQubnU7Lqvyv2jrMTju7m/ydLU1Nq5udTsuq/K/cDvs/XKvLuv0rvQqbarzvejrLK7uf3H69ei0uKjrEFjdGl2aXR5tcRvbkRlc3Ryb3mxu7X308PKsaOsQWN0aXZpdHnV4rj2wOCxvsntu7nDu9PQsbvP+rvZoaO7udK7tePSsrrcydnIy7r2wtSjrM7Ss6POytOmxrjV30FjdGl2aXR51q685NT1w7TNqNDFo6zL+8PH0ruw47a8u+HLtUludGVudLvyQUlETKOsyOe5+8G9uPZBY3Rpdml0ecrHzazSu7j206bTw7XEo6zSu7DjysfUy9DQ1NrNrNK7vfizzNbQtcSjqLP9t8fE49TaQW5kcm9pZE1hbmlmZXN0wO/F5NbDwcvIw8v8w8eyu9TL0NDU2s2s0ru9+LPMo6mjrLb4x9LSu7DjysfNrNK7z9+zzLXEo6zL+dLU1+688rWltcTNqNDFt723qKOsxKq5/dPa1NpBCiBBY3Rpdml0edbQ0LTSu7j2t723qKOsyMNCIEFjdGl2aXR5wLS199PDo6zE49TZwMHSu7Xjo6zWsb3Tt8POyrHkwb+2vL/J0tSjrNa7yse35yYjMjY2ODQ7sru6w6GjPC9wPgo8cD7G5Mv8o6y7udKqy7XD97XEysejrNK7uPZBY3Rpdml0ebD8uqzBy9K7uPZXaW5kb3ejrFdpbmRvd7LFysfV5tX9tPqx7dK7uPa0sL/ao6zSsr7NysfLtUFjdGl2aXR5v8nS1MO709BXaW5kb3ejrMTH1f26w8rHU2VydmljZcHLo6zC277dvs3Kx7jVuNXLtbXEQWN0aXZpdHlUaHJlYWTA4KOsy/u1xNaw1PCw/MCotKbA7VNlcnZpY2WjrKOoQWN0aXZpdHlUaHJlYWSyu8rHVGhyZWFktcTX08Dgo6y1q8v7w+jK9sHL1vfP37PM0qrX9rXEysKjrL7fzOWxvs7E1N2yu8zWwtujqaGjV2luZG93sPy6rMHL0ru49kRlY29yVmlld6Os1eKyxcrH1ebV/bXEvefD5tSqy9ijrMv8ysfV+7j2Vmlld8r3tcS4+aOsxOO/ydLUytTK1NTaQWN0aXZpdHnA77X308PPwsPm1eK+5LT6wuuw0dX7uPa958PmyL667KO6PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">getWindow().getDecorView().setBackgroundColor(Color.RED);
另外,還有一個ViewRoot,這個和DecorView經常有人搞混,首先是它對應的類的真正名字是ViewRootImpl,然後,他不是一個View,即他不是View的子類,他的工作與視覺元素無直接關系,但他確定Android View系統的一個重要類,它是負責通信的,如果你知道bridge設計模式就好理解了,這就是一個活生生的例子啊,不過不知道也沒關系,不會阻礙對下文的理解,負責誰跟誰通信呢,是負責你的WindowManager與WindowManagerSerivce之間通信,整個系統的窗口都是由WindowManagerSerivce管理的,因為所有窗口的Z-order,事件分發,都要由一個中樞統一管理才可能有秩序,這就是WindowManagerSerivce的職責了。這樣說,你肯定不能完全理解,要理解還是看代碼吧,路徑:frameworks/base/core/java/android/view/ViewRootImpl.java。其中有一句:
mOrigWindowType = mWindowAttributes.type; res = sWindowSession.add(mWindow, mSeq, mWindowAttributes, getHostVisibility(), mAttachInfo.mContentInsets, mInputChannel);就是向WindowManagerSerivce注冊了一個輸入事件處理監聽器mInputChannel,具體實現可以寫一篇很長的文章,暫不討論。
這就是與Activity主要相關的信息,希望本文加深了你對Activity的理解。
參考資料:
官網指南:http://developer.android.com/guide/components/activities.html
首先,我們把自定義View的步驟搬上來,一切按套路干活: 繼承View,覆蓋構造方法 自定義屬性 重寫onMeasure方法測量寬高 重寫onDraw方法繪制控件很多人
目前本書已上傳到百度閱讀, 在百度中搜索[Anroid Studio實用指南]便可以找到本書.什麼是演示模式?顧名思義,當你想給別人演示你的代碼時就會用到這個演示模式.演
背景Vulkan為Khronos Group推出的下一代跨平台圖形開發接口,用於替代歷史悠久的OpenGL。Android從7.0(Nougat)開始加入了對其的支持。V
目前64bitandroid系統也慢慢的多了,看到也有apk聲稱支持64bitsystem,然後就往裡面打包搞了個arm64-v8a 目錄,放了個64bit的so,但是a