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è)步驟冲甘。
- 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/
啟動流程:
點(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渲染過程馒索,敬請期待。