Android基礎(chǔ)
GC原理時(shí)機(jī)以及GC對象;
可以通過一些技巧和方式讓GC運(yùn)行更加合理、高效
當(dāng)程序員創(chuàng)建對象時(shí),GC就開始監(jiān)控這個(gè)對象地址、大小以及使用情況。通常GC采用有向圖的方式記錄并管理堆中的所有對象,通過這種方式確定哪些對象是“可達(dá)”的,哪些對象是“不可達(dá)”的。當(dāng)GC確定一些對象為“不可達(dá)時(shí)”GC就有責(zé)任回收這些內(nèi)存空間
四大組件及生命周期;ContentProvider的權(quán)限管理(讀寫分離,權(quán)限控制-精確到表級,URL控制);Activity的四種啟動(dòng)模式對比;Activity狀態(tài)保存于恢復(fù)
Fragment生命周期;Fragment狀態(tài)保存
startActivityForResult是哪個(gè)類的方法,在什么情況下使用,如果在Adapter中使用應(yīng)該如何解耦
AsyncTask原理及不足;
1.AsyncTask可能存在新開大量線程消耗系統(tǒng)資源和導(dǎo)致應(yīng)用FC的風(fēng)險(xiǎn)
2.AsyncTask一旦執(zhí)行了doInBackground,就算調(diào)用取消方法,也會(huì)將doInBackground里面的代碼執(zhí)行完畢,才會(huì)停止。
3.線程池不經(jīng)維護(hù),當(dāng)大量異步發(fā)生時(shí),導(dǎo)致線程池滿了,會(huì)出異常。
IntentService原理
IntentService是繼承于Service并處理異步請求的一個(gè)類,在IntentService內(nèi)有一個(gè)工作線程來處理耗時(shí)操作,啟動(dòng)IntentService的方式和啟動(dòng)傳統(tǒng)Service一樣,同時(shí),當(dāng)任務(wù)執(zhí)行完后,IntentService會(huì)自動(dòng)停止,而不需要我們?nèi)ナ謩?dòng)控制。另外,可以啟動(dòng)IntentService多次,而每一個(gè)耗時(shí)操作會(huì)以工作隊(duì)列的方式在IntentService的onHandleIntent回調(diào)方法中執(zhí)行,并且,每次只會(huì)執(zhí)行一個(gè)工作線程,執(zhí)行完第一個(gè)再執(zhí)行第二個(gè),以此類推。
AstncTask+HttpClient與AsyncHttpClient有什么區(qū)別
如何保證一個(gè)后臺(tái)服務(wù)不被殺死;比較省電的方式是什么
1.把service寫成系統(tǒng)服務(wù),將不會(huì)被回收(未實(shí)踐):
在Manifest.xml文件中設(shè)置persistent屬性為true,則可使該服務(wù)免受out-of-memory?killer的影響。但是這種做法一定要謹(jǐn)慎,系統(tǒng)服務(wù)太多將嚴(yán)重影響系統(tǒng)的整體運(yùn)行效率。
2.提高service的優(yōu)先級(未實(shí)踐):
設(shè)置android:priority="1000"
Xml代碼??收藏代碼
3.將服務(wù)寫成前臺(tái)服務(wù)foreground?service(已實(shí)踐,很大程度上能解決問題,但不能保證一定不會(huì)被殺):
重寫onStartCommand方法,使用StartForeground(int,Notification)方法來啟動(dòng)service。
注:前臺(tái)服務(wù)會(huì)在狀態(tài)欄顯示一個(gè)通知,最典型的應(yīng)用就是音樂播放器,只要在播放狀態(tài)下,就算休眠也不會(huì)被殺,如果不想顯示通知,只要把參數(shù)里的int設(shè)為0即可。
Java代碼??收藏代碼
Notification?notification?=?new?Notification(R.drawable.logo,
"wf?update?service?is?running",
System.currentTimeMillis());
pintent=PendingIntent.getService(this,?0,?intent,?0);
notification.setLatestEventInfo(this,?"WF?Update?Service",
"wf?update?service?is?running!",?pintent);
//讓該service前臺(tái)運(yùn)行,避免手機(jī)休眠時(shí)系統(tǒng)自動(dòng)殺掉該服務(wù)
//如果?id?為?0?,那么狀態(tài)欄的?notification?將不會(huì)顯示。
startForeground(startId,?notification);
同時(shí),對于通過startForeground啟動(dòng)的service,onDestory方法中需要通過stopForeground(true)來取消前臺(tái)運(yùn)行狀態(tài)。
ps:如果service被殺后下次重啟出錯(cuò),可能是此時(shí)重發(fā)的Intent為null的緣故,可以通過修改onStartCommand方法的返回值來解決:
START_STICKY:如果service進(jìn)程被kill掉,保留service的狀態(tài)為開始狀態(tài),但不保留遞送的intent對象。隨后系統(tǒng)會(huì)嘗試重新創(chuàng)建service,由于服務(wù)狀態(tài)為開始狀態(tài),所以創(chuàng)建服務(wù)后一定會(huì)調(diào)用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動(dòng)命令被傳遞到service,那么參數(shù)Intent將為null。
START_NOT_STICKY:“非粘性的”。使用這個(gè)返回值時(shí),如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉,系統(tǒng)不會(huì)自動(dòng)重啟該服務(wù)。
START_REDELIVER_INTENT:重傳Intent。使用這個(gè)返回值時(shí),如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù),并將Intent的值傳入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保證服務(wù)被kill后一定能重啟。
Java代碼??收藏代碼
//if?this?service's?process?is?killed,?then?it?will?be?scheduled?for?a?restart?and?the?last?delivered?Intent?re-delivered?to?it?again
return?Service.START_REDELIVER_INTENT;
4.利用ANDROID的系統(tǒng)廣播檢查Service的運(yùn)行狀態(tài),如果被殺掉,就再起來(未實(shí)踐):
利用的系統(tǒng)廣播是Intent.ACTION_TIME_TICK,這個(gè)廣播每分鐘發(fā)送一次,我們可以每分鐘檢查一次Service的運(yùn)行狀態(tài),如果已經(jīng)被結(jié)束了,就重新啟動(dòng)Service。
具體的實(shí)現(xiàn),可以參考這個(gè)鏈接:http://mobile.51cto.com/abased-374969.htm
補(bǔ)充:以上是解決service容易被回收的方法,但是再進(jìn)一步深究,為什么service會(huì)被系統(tǒng)殺掉呢?通過分析手機(jī)的logcat日志發(fā)現(xiàn)這么一段話:
引用
06-19?08:01:32.755?W/ActivityManager(?2081):?Killing?ProcessRecord{43a96570?6437:com.example.helloandroid/u0a187}:?background?ANR
06-19?08:01:32.910?I/ActivityManager(?2081):?Process?com.example.helloandroid?(pid?6437)?(adj?0)?has?died.
看來這個(gè)ANR(Application?Not?Responding)是關(guān)鍵。上網(wǎng)查到的解釋是:
在如下情況下,Android會(huì)報(bào)出ANR錯(cuò)誤:
–?主線程?(“事件處理線程”?/?“UI線程”)?在5秒內(nèi)沒有響應(yīng)輸入事件
–?BroadcastReceiver?沒有在10秒內(nèi)完成返回
如何通過廣播攔截和abort一條短信;
廣播是否可以請求網(wǎng)絡(luò);
不可以
廣播引起anr的時(shí)間限制
10 s
進(jìn)程間通信,AIDL
Handler機(jī)制及底層實(shí)現(xiàn)
Binder機(jī)制及底層實(shí)現(xiàn)
ApplicationContext和ActivityContext的區(qū)別
一張Bitmap所占內(nèi)存以及內(nèi)存占用的計(jì)算
對于應(yīng)用更新這塊是如何做的?(灰度,強(qiáng)制更新,分區(qū)域更新)
混合開發(fā),RN,weex,H5,小程序(做Android的了解一些前端js等還是很有好處的)
說一款你認(rèn)為當(dāng)前比較火的應(yīng)用并設(shè)計(jì)(直播APP)
常見編碼方式;utf-8編碼中的中文占幾個(gè)字節(jié);int型幾個(gè)字節(jié)
實(shí)現(xiàn)一個(gè)Json解析器(可以通過正則提高速度)
MVC MVP MVVM; 常見的設(shè)計(jì)模式;寫出觀察者模式的代碼
TCP的3次握手和四次揮手;TCP與UDP的區(qū)別
HTTP協(xié)議;HTTP1.0與2.0的區(qū)別;HTTP報(bào)文結(jié)構(gòu)
HTTP與HTTPS的區(qū)別以及如何實(shí)現(xiàn)安全性
原地址:
http://mp.weixin.qq.com/s?__biz=MzI2OTQxMTM4OQ==&mid=2247484286&idx=1&sn=e5843fb79d8a36ab063699b5fb9a0711&chksm=eae1f62cdd967f3a576396f8402581326b835b8327ed5f20f23896fcd22c2115e77863b4115b#rd