1. service生命周期(http://blog.csdn.net/todo_/article/details/51097453)
被啟動的服務(wù)的生命周期:如果一個Service被某個Activity 調(diào)用
Context.startService 方法啟動奸晴,那么不管是否有Activity使用bindService綁定或unbindService解除綁定到該Service,該Service都在后臺運行。如果一個Service被startService 方法多次啟動缰雇,那么onCreate方法只會調(diào)用一次衡查,onStart將會被調(diào)用多次(對應(yīng)調(diào)用startService的次數(shù))个盆,并且系統(tǒng)只會創(chuàng)建Service的一個實例(因此你應(yīng)該知道只需要一次stopService調(diào)用)吧凉。該Service將會一直在后臺運行,而不管對應(yīng)程序的Activity是否在運行怎栽,直到被調(diào)用stopService丽猬,或自身的stopSelf方法宿饱。當(dāng)然如果系統(tǒng)資源不足,android系統(tǒng)也可能結(jié)束服務(wù)
被綁定的服務(wù)的生命周期:如果一個Service被某個Activity 調(diào)用
Context.bindService 方法綁定啟動脚祟,不管調(diào)用
bindService 調(diào)用幾次谬以,onCreate方法都只會調(diào)用一次,同時onStart方法始終不會被調(diào)用由桌。當(dāng)連接建立之后为黎,Service將會一直運行,除非調(diào)用Context.unbindService
斷開連接或者之前調(diào)用bindService
的
Context 不存在了(如Activity被finish的時候)行您,系統(tǒng)將會自動停止Service铭乾,對應(yīng)onDestroy將被調(diào)用。
被啟動又被綁定的服務(wù)的生命周期:如果一個Service又被啟動又被綁定娃循,則該Service將會一直在后臺運行炕檩。并且不管如何調(diào)用,onCreate始終只會調(diào)用一次捌斧,對應(yīng)startService調(diào)用多少次笛质,Service的onStart便會調(diào)用多少次。調(diào)用unbindService將不會停止Service骤星,而必須調(diào)用
stopService 或
Service的
stopSelf 來停止服務(wù)经瓷。
當(dāng)服務(wù)被停止時清除服務(wù):當(dāng)一個Service被終止(1爆哑、調(diào)用stopService洞难;2、調(diào)用stopSelf揭朝;3队贱、不再有綁定的連接(沒有被啟動))時,onDestroy方法將會被調(diào)用潭袱,在這里你應(yīng)當(dāng)做一些清除工作柱嫌,如停止在Service中創(chuàng)建并運行的線程。
特別注意:
你應(yīng)當(dāng)知道在調(diào)用
bindService 綁定到Service的時候屯换,你就應(yīng)當(dāng)保證在某處調(diào)用 unbindService 解除綁定(盡管 Activity 被 finish 的時候綁定會自動解除编丘,并且Service會自動停止);
你應(yīng)當(dāng)注意 使用
startService 啟動服務(wù)之后彤悔,一定要使用 stopService停止服務(wù),不管你是否使用bindService;
同時使用 startService 與 bindService 要注意到媳瞪,Service 的終止睹栖,需要unbindService與stopService同時調(diào)用,才能終止 Service杨赤,不管 startService 與 bindService 的調(diào)用順序敞斋,如果先調(diào)用 unbindService 此時服務(wù)不會自動終止截汪,再調(diào)用 stopService 之后服務(wù)才會停止,如果先調(diào)用 stopService 此時服務(wù)也不會終止植捎,而再調(diào)用 unbindService 或者 之前調(diào)用 bindService 的 Context 不存在了(如Activity 被 finish 的時候)之后服務(wù)才會自動停止衙解;
當(dāng)在旋轉(zhuǎn)手機屏幕的時候,當(dāng)手機屏幕在“橫”“豎”變換時焰枢,此時如果你的
Activity 如果會自動旋轉(zhuǎn)的話丢郊,旋轉(zhuǎn)其實是 Activity 的重新創(chuàng)建,因此旋轉(zhuǎn)之前的使用 bindService 建立的連接便會斷開(Context 不存在了)医咨,對應(yīng)服務(wù)的生命周期與上述相同枫匾。
在 sdk 2.0 及其以后的版本中,對應(yīng)的 onStart 已經(jīng)被否決變?yōu)榱?onStartCommand拟淮,不過之前的 onStart 任然有效干茉。這意味著,如果你開發(fā)的應(yīng)用程序用的 sdk 為 2.0 及其以后的版本很泊,那么你應(yīng)當(dāng)使用 onStartCommand 而不是 onStart角虫。
生命周期方法說明
onStartCommand()當(dāng)另一個組件(如 Activity)通過調(diào)用 startService() 請求啟動服務(wù)時,系統(tǒng)將調(diào)用此方法委造。一旦執(zhí)行此方法戳鹅,服務(wù)即會啟動并可在后臺無限期運行。
如果您實現(xiàn)此方法昏兆,則在服務(wù)工作完成后枫虏,需要由您通過調(diào)用 stopSelf() 或 stopService() 來停止服務(wù)。(如果您只想提供綁定爬虱,則無需實現(xiàn)此方法隶债。)
onBind()
當(dāng)另一個組件想通過調(diào)用 bindService() 與服務(wù)綁定(例如執(zhí)行 RPC)時,系統(tǒng)將調(diào)用此方法跑筝。在此方法的實現(xiàn)中死讹,您必須通過返回 IBinder 提供一個接口,供客戶端用來與服務(wù)進(jìn)行通信曲梗。請務(wù)必實現(xiàn)此方法赞警,但如果您并不希望允許綁定,則應(yīng)返回 null虏两。
onCreate()
首次創(chuàng)建服務(wù)時愧旦,系統(tǒng)將調(diào)用此方法來執(zhí)行一次性設(shè)置程序(在調(diào)用 onStartCommand() 或 onBind() 之前)。如果服務(wù)已在運行碘举,則不會調(diào)用此方法忘瓦。
onDestroy()
當(dāng)服務(wù)不再使用且將被銷毀時,系統(tǒng)將調(diào)用此方法。服務(wù)應(yīng)該實現(xiàn)此方法來清理所有資源耕皮,如線程境蜕、注冊的偵聽器、接收器等凌停。
這是服務(wù)接收的最后一個調(diào)用粱年。
2. Android子線程更新UI的方法( http://blog.csdn.net/silleyj/article/details/55006573 )
專業(yè)術(shù)語:
Message:消息,其中包含了消息ID罚拟,消息處理對象以及處理的數(shù)據(jù)等台诗,由MessageQueue統(tǒng)一列隊,終由Handler處理赐俗。?
Handler:處理者拉队,負(fù)責(zé)Message的發(fā)送及處理。使用Handler時阻逮,需要實現(xiàn)handleMessage(Message msg)方法來對特定的Message進(jìn)行處理粱快,例如更新UI等。?
MessageQueue:消息隊列叔扼,用來存放Handler發(fā)送過來的消息事哭,并按照FIFO規(guī)則執(zhí)行。當(dāng)然瓜富,存放Message并非實際意義的保存鳍咱,而是將Message以鏈表的方式串聯(lián)起來的,等待Looper的抽取与柑。?
Looper:消息泵谤辜,不斷地從MessageQueue中抽取Message執(zhí)行。因此仅胞,一個MessageQueue需要一個Looper每辟。?
Thread:線程,負(fù)責(zé)調(diào)度整個消息循環(huán)干旧,即消息循環(huán)的執(zhí)行場所。
用Handler
主線程中定義Handler (handleMessage(Message msg))
子線程發(fā)消息妹蔽,通知Handler完成UI更新 (Thread(new Runnable()))
用Activity對象的runOnUiThread方法更新 椎眯,在子線程中通過runOnUiThread()方法更新UI
View.post(Runnabler)
3. Android Service和Thread的區(qū)別(https://www.cnblogs.com/carlo/p/4947342.html )
Thread:Thread 是程序執(zhí)行的最小單元,可以用Thread 來執(zhí)行一些異步的操作胳岂。Thread 的運行是獨立的编整,也就是說當(dāng)一個 Activity 被 finish 之后,如果沒有主動停止 Thread 或者 Thread 里的 run 方法沒有執(zhí)行完畢的話乳丰,Thread 也會一直執(zhí)行掌测。因此這里會出現(xiàn)一個問題:當(dāng) Activity 被 finish 之后,不再持有該 Thread 的引用产园,也就是不能再控制該Thread汞斧。另一方面夜郁,沒有辦法在不同的 Activity 中對同一 Thread 進(jìn)行控制。
Service:Service 是android的一種機制(既不是線程也不是進(jìn)程)粘勒,當(dāng)它運行的時候如果是Local Service竞端,那么對應(yīng)的 Service 是運行在主進(jìn)程的 main 線程上的。如果是Remote Service庙睡,那么對應(yīng)的
Service 則是運行在獨立進(jìn)程的 main 線程上事富。使用Service來處理后臺任務(wù),Activity就可以放心地finish乘陪,完全不需要擔(dān)心無法對后臺任務(wù)進(jìn)行控制的情況统台。
4. ConcurrentHashMap
(http://www.importnew.com/22007.html )
5. Volatitle 與 synchronized(https://www.cnblogs.com/hapjin/p/5492880.html )
從圖中可以看出:
每個線程都有一個自己的本地內(nèi)存空間--線程棧空間???線程執(zhí)行時啡邑,先把變量從主內(nèi)存讀取到線程自己的本地內(nèi)存空間饺谬,然后再對該變量進(jìn)行操作
對該變量操作完后,在某個時間再把變量刷新回主內(nèi)存
當(dāng)多個線程之間需要根據(jù)某個條件確定哪個線程可以執(zhí)行時谣拣,要確保這個條件在 線程 之間是可見的募寨。因此,可以用volatile修飾森缠。
volatile關(guān)鍵字的非原子性(所謂原子性拔鹰,就是某系列的操作步驟要么全部執(zhí)行,要么都不執(zhí)行贵涵。)
volatile關(guān)鍵字修飾的變量不會被指令重排序優(yōu)化
volatile輕量級列肢,只能修飾變量。synchronized重量級宾茂,還可修飾方法
volatile只能保證數(shù)據(jù)的可見性瓷马,不能用來同步,因為多個線程并發(fā)訪問volatile修飾的變量不會阻塞跨晴。
synchronized不僅保證可見性欧聘,而且還保證原子性,因為端盆,只有獲得了鎖的線程才能進(jìn)入臨界區(qū)怀骤,從而保證臨界區(qū)中的所有語句都全部執(zhí)行。多個線程爭搶synchronized鎖對象時焕妙,會出現(xiàn)阻塞蒋伦。
6. 重載與重寫(http://blog.csdn.net/linzhaojie525/article/details/55213010 )
重寫方法的規(guī)則:
參數(shù)列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是重載焚鹊。
返回的類型必須一直與被重寫的方法的返回類型相同痕届,否則不能稱其為重寫而是重載。
訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)
重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常研叫。例如:父類的一個方法申明了一個檢查異常IOException锤窑,在重寫這個方法是就不能拋出Exception,只能拋出IOException的子類異常,可以拋出非檢查異常蓝撇。
而重載的規(guī)則:
必須具有不同的參數(shù)列表果复;
可以有不同的返回類型,只要參數(shù)列表不同就可以了渤昌;
可以有不同的訪問修飾符虽抄;
可以拋出不同的異常;
7. 降低Java垃圾回收開銷的方法(http://www.importnew.com/20656.html )
預(yù)測集合的容量
直接處理數(shù)據(jù)流
使用不可變對象
小心字符串的拼接
使用特定的原生類集合
8. Runnable 與 Callable(https://www.cnblogs.com/frinder6/p/5507082.html )
相同點:
兩者都是接口独柑;(廢話)
兩者都可用來編寫多線程程序迈窟;
兩者都需要調(diào)用Thread.start()啟動線程;
不同點:
兩者最大的不同點是:實現(xiàn)Callable接口的任務(wù)線程能返回執(zhí)行結(jié)果忌栅;而實現(xiàn)Runnable接口的任務(wù)線程不能返回結(jié)果车酣;
Callable接口的call()方法允許拋出異常;而Runnable接口的run()方法的異常只能在內(nèi)部消化索绪,不能繼續(xù)上拋湖员;
9. Java 內(nèi)存溢出(java.lang.OutOfMemoryError)(http://outofmemory.cn/c/java-outOfMemoryError )
導(dǎo)致OutOfMemoryError異常的常見原因有以下幾種:
內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù)瑞驱;
集合類中有對對象的引用娘摔,使用完后未清空,使得JVM不能回收唤反;
代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復(fù)的對象實體凳寺;
使用的第三方軟件中的BUG;
啟動參數(shù)內(nèi)存值設(shè)定的過型獭肠缨;
此錯誤常見的錯誤提示:
tomcat:java.lang.OutOfMemoryError:
PermGen space
tomcat:java.lang.OutOfMemoryError:
Java heap space
weblogic:Root
cause of ServletException java.lang.OutOfMemoryError
resin:java.lang.OutOfMemoryError
java:java.lang.OutOfMemoryError
10. find grep組合使用\ (http://blog.csdn.net/cupidove/article/details/8767450)
查找所有".h"文件
find/PATH -name "*.h"
查找所有".h"文件中的含有"helloworld"字符串的文件
find /PATH-name "*.h" -exec grep -in "helloworld" {} \;
find /PATH -name "*.h" | xargs grep -in "helloworld"
查找所有".h"和".c"文件中的含有"helloworld"字符串的文件
find /PATH/( -name "*.h" -or -name "*.c" /) -exec grep -in
"helloworld" {} \;
11. shell 中$0,$1,$2的含義(http://blog.csdn.net/qq_30137611/article/details/77092524)
簡單來說 $0 就是你寫的shell腳本本身的名字,$1 是你給你寫的shell腳本傳的第一個參數(shù)盏阶,$2 是你給你寫的shell腳本傳的第二個參數(shù)
12. HashMap 與HashTable的區(qū)別(http://www.androidchina.net/1802.html )
HashMap是非synchronized晒奕,可以接受key與value值為空,HashTable不行
HashMap是非synchronized般哼,HashTable是synchronized吴汪。HashTable是線程安全的,多個線程可以共享一個HashTable蒸眠。而如果沒有正確同步的話,多個線程是不能共享HashMap的杆融。
HashMap的迭代器(Iterator)是fail-fast迭代器楞卡,而Hashtable的enumrator迭代器不是fail-fast。當(dāng)線程改變了HashMap的結(jié)構(gòu)時會拋出ConcurrentModificationException。但是迭代器本身remove()函數(shù)移除元素時不會拋出 異常蒋腮。
HashTable是線程安全的也是synchronized淘捡,所以在單線程環(huán)境比HashMap要慢。如果池摧,不需要同步焦除,HashMap要好過HashTable。
HashMap不能保證隨時間推移map元素次序不變作彤。
13. AVL(平衡二叉樹)
定義:AVL樹是二叉樹膘魄,其各個節(jié)點的左右子樹的高度相差不超過1。
定義:數(shù)的高度可以看做是節(jié)點與最低的葉子節(jié)點的距離竭讳。跟節(jié)點的高度最大创葡,而葉子節(jié)點的高度為0,一個不存在的節(jié)點的高度定義為-1绢慢。
14. TCP/IP協(xié)議端口
端口號的范圍從0到65535灿渴,比如用于瀏覽網(wǎng)頁服務(wù)的80端口,用于FTP服務(wù)的21端口等胰舆。由于物理端口和邏輯端口數(shù)量較多骚露,為了對端口進(jìn)行區(qū)分,將每個端口進(jìn)行了編號缚窿,這就是端口號棘幸。
15. UDP分片
以太網(wǎng)的數(shù)據(jù)幀必須要在46-1500之間,所以1500字節(jié)被稱為最大傳輸單元MTU滨攻。當(dāng)UDP的數(shù)據(jù)報大于1500時發(fā)送方的IP就要分片够话,