日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Andorid Activity的本质是什么

發(fā)布時(shí)間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Andorid Activity的本质是什么 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文我主要通過(guò)查看Activity的實(shí)現(xiàn)源碼和推測(cè)其設(shè)計(jì)思想的方法來(lái)探討一下Android的本質(zhì)是什么。


Activity恐怖是Android用得最多且是最基本的組件了,估計(jì)也是每個(gè)學(xué)Android的人接觸的第一概念,對(duì)于Activity的理解和說(shuō)法,層出不窮,有人說(shuō)是一個(gè)窗口,有個(gè)說(shuō)是一個(gè)活動(dòng),但他的本質(zhì)是什么呢,官方的說(shuō)法是Activity一個(gè)應(yīng)用程序的組件,它提供一個(gè)屏幕來(lái)與用戶交互,以便做一些諸如打電話、發(fā)郵件和看地圖之類的事情,原話如下:

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.

這句話概括的很好,但我并不認(rèn)為這就是Activity的本質(zhì)。


切入主題之前,我們先要了解一下UI系統(tǒng)的職責(zé)和原理。所有的圖形界面,無(wú)論是什么UI系統(tǒng),都要收集用戶的活動(dòng),這些活動(dòng)包括打開和關(guān)閉程序,輸入事件等,這樣系統(tǒng)才能針對(duì)這些活動(dòng)做出一些反應(yīng),比如程序打開時(shí)加載一個(gè)數(shù)據(jù)庫(kù),建立一個(gè)網(wǎng)絡(luò)連接,不過(guò)針對(duì)這些活動(dòng)所作出的反應(yīng)都委托給了具體的應(yīng)用程序,系統(tǒng)相當(dāng)于只是把這些事件或消息轉(zhuǎn)發(fā)給應(yīng)用程序。下面是一個(gè)簡(jiǎn)單的圖:


這些消息怎么轉(zhuǎn)發(fā)給程序呢,可以約定好,要求應(yīng)程序?qū)懸粋€(gè)方法,或如果是C可要求傳入一個(gè)回調(diào),Java可以要求程序傳入一個(gè)監(jiān)聽器,總之實(shí)現(xiàn)這個(gè)功能還是很容易的,但這么多消息,全部傳到一個(gè)方法里嗎,我想那樣會(huì)很慘,那樣可能要求你寫應(yīng)用程序的時(shí)候可能要寫一個(gè)長(zhǎng)長(zhǎng)的swich語(yǔ)句或if語(yǔ)句,所以一般都把這些消息分類,如一種是整個(gè)程序的活動(dòng)的消息,如關(guān)閉和打開,還有就是輸入事件,如按鍵鼠標(biāo),每個(gè)分類里的消息還可以再細(xì)分,這樣的話,就可以封裝成多個(gè)類或接口,每個(gè)類有數(shù)個(gè)方法,之后應(yīng)用程序重寫這些類方法或?qū)崿F(xiàn)某個(gè)接口,系統(tǒng)就可以通過(guò)調(diào)用這些類或接口的實(shí)例發(fā)送消息了。

于是問(wèn)題轉(zhuǎn)化成了類的設(shè)計(jì)。在Windows中,有個(gè)窗口類來(lái)接受一個(gè)窗口的活動(dòng),系統(tǒng)就可以通過(guò)調(diào)用窗口類的方法來(lái)傳遞消息,這個(gè)窗口類既接受打開和關(guān)閉的活動(dòng),又接受用戶輸入事件。而在Android中而不同,Activity只接受打開和關(guān)閉等的活動(dòng),而不會(huì)接受輸入事件,那是由Activity內(nèi)嵌的Window類來(lái)接受的,然后轉(zhuǎn)發(fā)給相應(yīng)View,你有可能會(huì)說(shuō)Activity中有個(gè)onKeyDown方法,其實(shí)那只是處理沒(méi)人領(lǐng)的按鍵消息才會(huì)到達(dá)Activity。現(xiàn)在發(fā)現(xiàn)Android和Windows分發(fā)消息的的區(qū)別了吧,這樣化分,每個(gè)類的職責(zé)更細(xì)了,更明確了,當(dāng)然嘍,Android中的消息跟Windows中的可能有點(diǎn)稍小的區(qū)別。


現(xiàn)在應(yīng)該可以很容易的理確Android的每一個(gè)生命周期對(duì)應(yīng)的方法(onCreate, onStart...)其實(shí)是處理收到的消息,當(dāng)用戶打開一個(gè)Activity的時(shí)候,系統(tǒng)(嚴(yán)格的說(shuō)應(yīng)該是ActivityManager)就會(huì)調(diào)用onCreate來(lái)告訴你這個(gè)消息,這個(gè)時(shí)候你就要加載你的XML布局文件并做一些初始化。然后離開的時(shí)候,就應(yīng)該把這個(gè)Activity銷毀嗎,如果用戶是暫時(shí)離開,等下還要回來(lái)呢,如果銷毀了那就又得重創(chuàng)建,太浪費(fèi)時(shí)間了(用我們家鄉(xiāng)話說(shuō)就是太難費(fèi)神了),所以不能銷毀,但是系統(tǒng)也得通知你用戶離開了(用的是onStop方法),因?yàn)榭赡苄枰獣和2シ乓曨l。當(dāng)下次重新進(jìn)入的時(shí)候,系統(tǒng)又會(huì)通知你用戶又進(jìn)來(lái)了,這時(shí)你可能要恢復(fù)播放了,但你有沒(méi)有發(fā)現(xiàn),用戶第一次進(jìn)入和再次進(jìn)入,你需要做不同的處理,第一次可能是初始化一些資源,第二次可能只要恢復(fù)播放就可以了,所以系統(tǒng)應(yīng)該告訴你,是第一次進(jìn)入還是再次進(jìn)入,于是系統(tǒng)就用了兩個(gè)方法,用onCreate告訴你用戶是第一次進(jìn)入的,用onStart告訴你用戶是再次進(jìn)入。

不過(guò)這還不算完,還有一種情況,用戶是半離開狀態(tài),什么是半離開呢,都知道Android的界在有全屏,還是非全屏,也有半透明的,這里的半離開指的就是本界面被一個(gè)非全屏或半透明的界面蓋住,總之,你還能看到一點(diǎn)點(diǎn)被蓋的那個(gè)界面;全離開就是被全屏的界面蓋住,用戶完全看不到被蓋的。這兩種情況要有可能要區(qū)別對(duì)待,比如一個(gè)播放在線視頻的應(yīng)用,它可能希望要在用戶半離開時(shí)只暫停播放,不暫停后臺(tái)下載,而當(dāng)用戶完全離開時(shí),播放和下載都暫停。所以系統(tǒng)也應(yīng)該區(qū)分這種情況,于是就有了onPause和onResume來(lái)表示半離開和從半離開恢復(fù)。值得注意的是,Android中全離開包括了半離開,半離開不包括全離開,什么意思呢,就是即便是全離開,系統(tǒng)也是先調(diào)onPause再調(diào)onStop,從全離開中恢復(fù),也是調(diào)了onStart后還會(huì)調(diào)onResume,而對(duì)于第一次進(jìn)入,onCreate、onStart、onResume會(huì)被依次調(diào)用,所以記住,只要用戶進(jìn)入,無(wú)論是怎么進(jìn)入的,都是調(diào)用onResume,在這里恢復(fù)播放是再適合不過(guò)的了。還有一個(gè)onDestory也說(shuō)一下,就是在銷毀的時(shí)候被調(diào)用,一般是回收資源或按了返回鍵會(huì)被銷毀。現(xiàn)在清楚了,也順便看一下Android官網(wǎng)的這張圖吧:


然后,你可能好奇系統(tǒng)是怎么調(diào)用到你寫的onCreate方法的,有興趣的可以查看源碼的frameworks/base/core/java/android/app/ActivityThread.java,此類里面有許多handle***Activity方法,如handleResumeActivity,不過(guò)這不是本文章討論的重點(diǎn),后續(xù)有可能另寫一篇討論。

下面我們來(lái)討論一下Activity這個(gè)類吧,我估計(jì)很多人都忽略了Activity類也是一個(gè)類,它也可以有構(gòu)造函數(shù),你還可以在構(gòu)造函數(shù)里初始化一些東西,不過(guò)請(qǐng)注意,Activity的onDestroy被調(diào)用時(shí),Activity這個(gè)類本身還沒(méi)有被銷毀。還一點(diǎn)也很少人忽略,我常問(wèn)應(yīng)聘者Activity之間怎么通信,他們一般都會(huì)說(shuō)Intent或AIDL,如果兩個(gè)Activity是同一個(gè)應(yīng)用的,一般是運(yùn)行在同一進(jìn)程中的(除非你在AndroidManifest里配置了讓它們不運(yùn)行在同一進(jìn)程),而且一般是同一線程的,所以最簡(jiǎn)單的通信方法,莫過(guò)于在A Activity中寫一個(gè)方法,讓B Activity來(lái)調(diào)用,你再懶一點(diǎn),直接訪問(wèn)變量都可以,只是風(fēng)格不好。

其它,還要說(shuō)明的是,一個(gè)Activity包含了一個(gè)Window,Window才是真正代表一個(gè)窗口,也就是說(shuō)Activity可以沒(méi)有Window,那正好是Service了,論據(jù)就是剛剛說(shuō)的ActivityThread類,他的職責(zé)包括處理Service,(ActivityThread不是Thread的子類,但他描述了主線程要做的事,具體本文暫不討論)。Window包含了一個(gè)DecorView,這才是真正的界面元素,它是整個(gè)View樹的根,你可以試試在Activity里調(diào)用下面這句代碼把整個(gè)界面染紅:

getWindow().getDecorView().setBackgroundColor(Color.RED);


另外,還有一個(gè)ViewRoot,這個(gè)和DecorView經(jīng)常有人搞混,首先是它對(duì)應(yīng)的類的真正名字是ViewRootImpl,然后,他不是一個(gè)View,即他不是View的子類,他的工作與視覺(jué)元素?zé)o直接關(guān)系,但他確定Android View系統(tǒng)的一個(gè)重要類,它是負(fù)責(zé)通信的,如果你知道bridge設(shè)計(jì)模式就好理解了,這就是一個(gè)活生生的例子啊,不過(guò)不知道也沒(méi)關(guān)系,不會(huì)阻礙對(duì)下文的理解,負(fù)責(zé)誰(shuí)跟誰(shuí)通信呢,是負(fù)責(zé)你的WindowManager與WindowManagerSerivce之間通信,整個(gè)系統(tǒng)的窗口都是由WindowManagerSerivce管理的,因?yàn)樗写翱诘腪-order,事件分發(fā),都要由一個(gè)中樞統(tǒng)一管理才可能有秩序,這就是WindowManagerSerivce的職責(zé)了。這樣說(shuō),你肯定不能完全理解,要理解還是看代碼吧,路徑:frameworks/base/core/java/android/view/ViewRootImpl.java。其中有一句:

mOrigWindowType = mWindowAttributes.type;res = sWindowSession.add(mWindow, mSeq, mWindowAttributes,getHostVisibility(), mAttachInfo.mContentInsets,mInputChannel);就是向WindowManagerSerivce注冊(cè)了一個(gè)輸入事件處理監(jiān)聽器mInputChannel,具體實(shí)現(xiàn)可以寫一篇很長(zhǎng)的文章,暫不討論。

這就是與Activity主要相關(guān)的信息,希望本文加深了你對(duì)Activity的理解。


參考資料:

官網(wǎng)指南:http://developer.android.com/guide/components/activities.html

總結(jié)

以上是生活随笔為你收集整理的Andorid Activity的本质是什么的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: v天堂在线观看 | 精品无码国产av一区二区三区 | 一本大道久久 | 一区二区三区四区视频在线观看 | 狠狠天天 | 草草影院国产第一页 | 亚洲第一字幕 | 精品无码国产污污污在线观看 | 碧蓝之海动漫在线观看免费高清 | 黄色一级片 | 欧美国产中文 | 国产精品免费入口 | 中国av一区二区 | 日日射日日操 | 国产精品免费网站 | 四川少妇xxx奶大xxx | 国产成人精品一区二区三区网站观看 | 有码一区| 黄色大片aa| 精品久草 | 日韩精品av一区二区三区 | 国内精品久久久久久久久久 | 伊人蕉| 日本黄色三级网站 | 日本亚洲最大的色成网站www | 欧美熟妇另类久久久久久多毛 | 阿的白色内裤hd中文 | 久久日视频| 中文欧美日韩 | 国产在线一区二区三区 | 在线观看av资源 | 日韩精品久久久久久久电影99爱 | 国产女主播在线观看 | 精品成人免费一区二区在线播放 | 亚洲国产综合在线 | 国产精品成人99一区无码 | 亚洲黄色av | 波多野结衣视频免费看 | 国模人体私拍xvideos | 福利片在线观看 | 91精品啪在线观看国产线免费 | 4444亚洲人成无码网在线观看 | 亚洲乱码精品 | 亚洲国产精品成人无码区 | 天天色综合图片 | 伊人久久久久久久久久久久久 | 福利一区在线观看 | 超碰成人在线观看 | 亚洲第一色区 | 亚洲一区二区三区在线免费观看 | 免费在线看黄色片 | 天堂色av | 在线精品播放 | 97精品人妻一区二区三区在线 | 久久高清内射无套 | 欧美性爱视频久久 | 日本黄网站 | 亚洲精品久久久久av无码 | 亚洲AV无码久久精品色三人行 | 可以免费观看av的网站 | 亚洲激情在线视频 | 亚洲成人mv| 日本xx视频免费观看 | 在线视频亚洲 | 欧美精品videos另类日本 | 69精品人人人人 | 9i免费看片黄 | 精品少妇一区二区三区免费观 | 久久亚洲精品国产精品黑人v | 少妇献身老头系列 | 最近日本中文字幕 | 国产高清视频免费 | 亚洲综合福利 | 少妇肥臀大白屁股高清 | 五月天综合激情 | 国产色婷婷 | 在线视频第一页 | 久久久久一区二区三区 | 色无极在线 | 国产猛男猛女超爽免费视频 | 欧美一区二区三区视频 | 不卡视频免费在线观看 | 91精产国品一二三 | 噜噜噜久久 | 国产91啪| 龚玥菲一级淫片 | 亚洲精品二区三区 | 国产精品毛片久久久久久久av | 欧美亚洲精品在线 | 99免费精品 | 国模人体一区二区 | 淫视频在线观看 | 久久人人爽爽人人爽人人片av | 成人久久影院 | 激情五月色综合国产精品 | 欧美激情偷拍 | 欧美bbbbbbbbbbbb18av| 男女午夜视频 | aaa在线视频 |