# Android之四大組件UI

Service onStartCommand返回參數(shù)說明

方法onStartCommand()的返回值為int類型,主要的作用是當(dāng)Service進(jìn)程被意外kill掉時(shí)矩父,Service服務(wù)下一步要做哪些行為,主要有3種值。
START_STICKY:Service被異外終止時(shí)不調(diào)用onDestroy()回調(diào),并且終止后自動重啟Service服務(wù)惑艇,只執(zhí)行Service對象的onCreate()生命周期方法。
START_NOT_STICKY:Service被異外終止時(shí)不調(diào)用onDestroy()回調(diào)拇泛,并且不自動重啟服務(wù)滨巴。
START_REDELIVER_INTENT:Service被異外終止時(shí)不調(diào)用onDestroy()回調(diào),并且終止后自動重啟Service服務(wù)碰镜,還要執(zhí)行Service對象的onCreate()和onStartCommand()生命周期方法兢卵,并且從Intent中能取到值。
http://book.51cto.com/art/201211/363296.htm

Service stopSelf

一直知道stopself是停掉Service的方法绪颖,但是卻不知道什么時(shí)候停止秽荤。以為調(diào)用了stopself就會馬上停止,實(shí)際上我錯(cuò)了.在onStartCommond方法里面調(diào)用stopself方法時(shí)柠横,不會馬上停止窃款,而是onStartCommond方法執(zhí)行結(jié)束才會停止。
還有一點(diǎn)牍氛,調(diào)用stopself方法之后晨继,service會執(zhí)行onDestory方法。
另外搬俊,如果onStartCommond中啟動一個(gè)線程紊扬,調(diào)用stopself,線程也不會被殺死唉擂。
來自 http://blog.csdn.net/hello0370/article/details/46781523

當(dāng)調(diào)用finish方法時(shí)餐屎,onCreate方法會繼續(xù)執(zhí)行,之后調(diào)用onDestory方法玩祟。
最后腹缩,總結(jié)一下,Service的stopself方法的功能是,當(dāng)完成所有功能之后藏鹊,將service停掉润讥,而不是等著系統(tǒng)回收。同樣finish方法盘寡,是當(dāng)系統(tǒng)執(zhí)行完onCreate方法之后楚殿,調(diào)用onDestory方法銷毀Activity。

ACTION_CANCEL 請簡述Android事件傳遞機(jī)制宴抚, ACTION_CANCEL事件何時(shí)觸發(fā)勒魔?

關(guān)于第一個(gè)問題甫煞,不做任何解釋菇曲。
關(guān)于ACTION_CANCEL何時(shí)被觸發(fā),系統(tǒng)文檔有這么一種使用場景:在設(shè)計(jì)設(shè)置頁面的滑動開關(guān)時(shí)抚吠,如果不監(jiān)聽ACTION_CANCEL常潮,在滑動到中間時(shí),如果你手指上下移動楷力,就是移動到開關(guān)控件之外喊式,則此時(shí)會觸發(fā)ACTION_CANCEL,而不是ACTION_UP萧朝,造成開關(guān)的按鈕停頓在中間位置岔留。
意思是當(dāng)滑動的時(shí)候就會觸發(fā),不知道大家搞沒搞過微信的長按錄音检柬,有一種狀態(tài)是“松開手指献联,取消發(fā)送”,這時(shí)候就會觸發(fā)ACTION_CANCEL何址。

簡述Android的View繪制流程里逆,Android的wrap_content是如何計(jì)算的

https://blog.csdn.net/qinjuning/article/details/7110211
繪制流程的三個(gè)步驟,即:
1用爪、 measure過程 --- 測量過程
2原押、 layout 過程 --- 布局過程
3、 draw 過程 --- 繪制過程
https://blog.csdn.net/qinjuning/article/details/8051811
https://blog.csdn.net/qinjuning/article/details/8074262
https://www.cnblogs.com/duanweishi/p/4301742.html

bundle的數(shù)據(jù)結(jié)構(gòu)偎血,如何存儲诸衔,既然有了Intent.putExtra,為啥還要用bundle颇玷。

bundle的內(nèi)部結(jié)構(gòu)其實(shí)是Map笨农,傳遞的數(shù)據(jù)可以是boolean、byte亚隙、int磁餐、long、float、double诊霹、string等基本類型或它們對應(yīng)的數(shù)組羞延,也可以是對象或?qū)ο髷?shù)組。當(dāng)Bundle傳遞的是對象或?qū)ο髷?shù)組時(shí)脾还,必須實(shí)現(xiàn)Serializable 或Parcelable接口伴箩。

Binder 線程池

Binder線程池:每個(gè)Server進(jìn)程在啟動時(shí)會創(chuàng)建一個(gè)binder線程池,并向其中注冊一個(gè)Binder線程鄙漏;之后Server進(jìn)程也可以向binder線程池注冊新的線程嗤谚,或者Binder驅(qū)動在探測到?jīng)]有空閑binder線程時(shí)會主動向Server進(jìn)程注冊新的的binder線程。對于一個(gè)Server進(jìn)程有一個(gè)最大Binder線程數(shù)限制怔蚌,默認(rèn)為16個(gè)binder線程巩步,例如Android的system_server進(jìn)程就存在16個(gè)線程。對于所有Client端進(jìn)程的binder請求都是交由Server端進(jìn)程的binder線程來處理的桦踊。

LocalBroadcastmanager使用

首先獲取LocalBroadcastManager實(shí)例:
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
然后通過函數(shù) registerReceiver方法來注冊監(jiān)聽器:
lbm.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
}
}, new IntentFilter("com.android.action.PRIVATE_BROADCAST"));
最后調(diào)用sendBroadcast方法發(fā)送廣播:
Intent intent=new Intent("com.android.action.PRIVATE_BROADCAST");
intent.putExtra(KEY, SENSITIVE_DATA);
lbm.sendBroadcast(intent);

Sticky broadcast

首先點(diǎn)擊next Activity從代碼中可以看到receiver已經(jīng)注冊椅野,但Log無輸出,這是當(dāng)然的了~~~因?yàn)闆]有廣播發(fā)出自然就不會有人響應(yīng)了籍胯。
按back后退到上圖
下面分別點(diǎn)擊send broadcast 和 send stickybroadcast按鈕竟闪,隨便點(diǎn)擊幾次,此時(shí)對應(yīng)的receiver并沒有注冊杖狼,所以是不會有人響應(yīng)這兩條廣播的炼蛤。然后點(diǎn)擊next activity,當(dāng)打開新的activity后對應(yīng)的receiver被注冊蝶涩,此時(shí)從日志中就能看出已經(jīng)收到了send stickybroadcast發(fā)出的廣播理朋,但沒有send broadcast發(fā)出的廣播。這就是sendStickyBroadcast的特別之處子寓,它將發(fā)出的廣播保存起來暗挑,一旦發(fā)現(xiàn)有人注冊這條廣播,則立即能接收到斜友。
日志打印為: action = com.android.action.sticky.broadcastand count = 4
從上面的日志信息可以看出sendStickyBroadcast只保留最后一條廣播炸裆,并且一直保留下去,這樣即使已經(jīng)處理了這條廣播但當(dāng)再一次注冊這條廣播后依然可以收到它鲜屏。
如果你只想處理一遍烹看,removeStickyBroadcast方法可以幫你,處理完了后就將它刪除吧洛史。
http://blog.csdn.net/yihua0607/article/details/6890805

要知道區(qū)別首先需要看一下Android Developers Reference惯殊, 它可是我們最好的老師了,sendBroadcast 大家應(yīng)該都會用了我就不贅述了也殖,下面來看看sendStickyBroadcast
google官方的解釋是:
Perform a sendBroadcast(Intent) that is "sticky," meaning the Intent you are sending stays around after the broadcast is complete, so that others can quickly retrieve that data through the return value ofregisterReceiver(BroadcastReceiver, IntentFilter). In all other ways, this behaves the same as sendBroadcast(Intent).
You must hold the BROADCAST_STICKY permission in order to use this API. If you do not hold that permission,SecurityException will be thrown.
大概的意思是說: 發(fā)出的廣播會一直滯留(等待)土思,以便有人注冊這則廣播消息后能盡快的收到這條廣播务热。其他功能與sendBroadcast相同。但是使用sendStickyBroadcast 發(fā)送廣播需要獲得BROADCAST_STICKY permission己儒,如果沒有這個(gè)permission則會拋出異常崎岂。

Activity生命周期

http://www.cnblogs.com/zyw-205520/p/3313268.html
https://developer.android.com/guide/components/activities/activity-lifecycle.html#tba

按back鍵處理流程

我們在使用安卓手機(jī)時(shí)候,常常會用到back(返回)鍵來退出當(dāng)前正在使用的Activity闪湾。這個(gè)事件的主要流程可以概括為兩個(gè)步驟冲甘。

  1. InputReader,InputDispatcher對輸入事件的分發(fā)處理途样,包括調(diào)用PhoneWindowManager的interceptKeyBeforeDispatching和View江醇,ViewGroup的dispatchTouchEvent等方法。
    2.事件分發(fā)到該Activity后何暇,Activity方法調(diào)用finish方法退出陶夜,銷毀Activity。眾多第三方軟件常常設(shè)置連續(xù)兩次按下back鍵退出應(yīng)用程序的功能赖晶,或者是在各瀏覽器APP中返回上一頁瀏覽過的網(wǎng)頁的功能律适,就是通過重寫這一步驟中涉及的方法而實(shí)現(xiàn)的。
    本文分析的是第二步流程遏插,第1步過程將在隨后《android輸入事件分發(fā)機(jī)制》一文中進(jìn)行探討。
    由于大部分Activity不會重寫onBackPressed()方法纠修,因此它們在接受到back鍵輸入事件后胳嘲,最終會輾轉(zhuǎn)調(diào)用到父類Activity.Java的onBackPressed()方法。
    http://blog.csdn.net/jakioneplus/article/details/50034653

Android事件分發(fā)機(jī)制

Activity ViewGroup View
View是所有ViewGroup TextView LinearLayout等的基類
LinearLayout/RelativeLayout還有一些可以包含多個(gè)TextView扣草、Button等的組裝均繼承自ViewGroup了牛,因此也是一個(gè)view
Android事件分發(fā)主要是從Activity到ViewGroup到具體某個(gè)View響應(yīng)的過程,事件都是以MotionEvent.ACTION_DOWN事件開始辰妙、UP事件結(jié)束鹰祸,中間有無數(shù)的MOVE事件。
主要是dispatchTouchEvent onTouchEvent onInterceptTouchEvent之間的傳遞和攔截處理密浑⊥苡ぃ基本思路是從Activity->ViewGroup->View的dispatchTouchEvent一直往下執(zhí)行,如果有一個(gè)返回false那么直接向上返回onTouchEvent執(zhí)行尔破,如果返回true那么直接消費(fèi)掉結(jié)束街图,如果不返回那么繼續(xù)下一層dispatchTouchEvent; 如果到最后一層dispatchTouchEvent還沒有返回懒构,那么執(zhí)行onTouchEvent依次往上執(zhí)行餐济,如果onTouchEvent返回true,那么就消費(fèi)掉結(jié)束胆剧,否則一直向上執(zhí)行onTouchEvent絮姆,到最上層結(jié)束。
http://www.reibang.com/p/38015afcdb58
查看解析步驟:
https://upload-images.jianshu.io/upload_images/944365-aea821bbb613c195.png?imageMogr2/auto-orient/

startActivity流程

http://gityuan.com/2016/03/12/start-activity/

image

啟動流程:
點(diǎn)擊桌面App圖標(biāo),Launcher進(jìn)程采用Binder IPC向system_server進(jìn)程發(fā)起startActivity請求篙悯;
system_server進(jìn)程接收到請求后冤灾,向zygote進(jìn)程發(fā)送創(chuàng)建進(jìn)程的請求;
Zygote進(jìn)程fork出新的子進(jìn)程辕近,即App進(jìn)程韵吨;
App進(jìn)程,通過Binder IPC向sytem_server進(jìn)程發(fā)起attachApplication請求移宅;
system_server進(jìn)程在收到請求后归粉,進(jìn)行一系列準(zhǔn)備工作后,再通過binder IPC向App進(jìn)程發(fā)送scheduleLaunchActivity請求漏峰;
App進(jìn)程的binder線程(ApplicationThread)在收到請求后糠悼,通過handler向主線程發(fā)送LAUNCH_ACTIVITY消息;
主線程在收到Message后浅乔,通過發(fā)射機(jī)制創(chuàng)建目標(biāo)Activity倔喂,并回調(diào)Activity.onCreate()等方法。
到此靖苇,App便正式啟動席噩,開始進(jìn)入Activity生命周期,執(zhí)行完onCreate/onStart/onResume方法贤壁,UI渲染結(jié)束后便可以看到App的主界面悼枢。 啟動Activity較為復(fù)雜,后續(xù)計(jì)劃再進(jìn)一步講解生命周期過程與系統(tǒng)是如何交互脾拆,以及UI渲染過程馒索,敬請期待。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末名船,一起剝皮案震驚了整個(gè)濱河市绰上,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渠驼,老刑警劉巖蜈块,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渴邦,居然都是意外死亡疯趟,警方通過查閱死者的電腦和手機(jī)黎比,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門疯溺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捡偏,“玉大人浩村,你說我怎么就攤上這事艺蝴∞仁啵” “怎么了像樊?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵倡蝙,是天一觀的道長。 經(jīng)常有香客問我踢步,道長癣亚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任获印,我火速辦了婚禮述雾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兼丰。我一直安慰自己玻孟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布鳍征。 她就那樣靜靜地躺著黍翎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艳丛。 梳的紋絲不亂的頭發(fā)上匣掸,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音氮双,去河邊找鬼碰酝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛眶蕉,可吹牛的內(nèi)容都是我干的砰粹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼造挽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弄痹?” 一聲冷哼從身側(cè)響起饭入,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肛真,沒想到半個(gè)月后谐丢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚓让,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年乾忱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片历极。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窄瘟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趟卸,到底是詐尸還是另有隱情蹄葱,我是刑警寧澤氏义,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站图云,受9級特大地震影響惯悠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竣况,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一克婶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丹泉,春花似錦情萤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睬塌,卻和暖如春泉蝌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揩晴。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工勋陪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硫兰。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓诅愚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劫映。 傳聞我的和親對象是個(gè)殘疾皇子违孝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容