android系列

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容