Activity生命周期
1.activity的4種狀態(tài)
running/paused/stopped/killed
2.安卓進(jìn)程優(yōu)先級(jí)
前臺(tái)被饿、可見容达、服務(wù)衙猪、后臺(tái)、空
Fragment
1. Fragment為什么被稱為第五組件
- 有自己的生命周期哑芹,加載到activity里因惭。
- 更節(jié)省內(nèi)存,ui切換更自然绩衷。
2. Fragmnet 加載到Activity的方式
- 靜態(tài)加載:添加Fragment到Activity的布局文件中
- 動(dòng)態(tài)加載:動(dòng)態(tài)再activity中添加fragment
FragmentTransaction transaction = manager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
transaction.add(R.id.fragment_container, fragment1);
transaction.commit();
3. FragmentPagerAdapter與FramentStatePagerAdapter的區(qū)別
- FragmentPagerAdapter前者適合頁(yè)面較少,只是把ui分離激率,沒(méi)有回收資源
- FramentStatePagerAdapter后者適合頁(yè)面較多的情況咳燕。destroyItem()回收資源,回收內(nèi)存乒躺。
4. Fragment生命周期
5. Fragment的通信
1)在Fragment中調(diào)用Activity中的getActivity()
2)在Activity中調(diào)用Fragment中的方法招盲,接口回調(diào)
3)在Fragment中調(diào)用Fragment中的方法findFragmentById
6. Fragment的replace、add嘉冒、remove
- replace替換實(shí)例
- add添加實(shí)例
- remove移除實(shí)例
Service
1.Service是什么
Service是一個(gè)一種可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行曹货,無(wú)界面的應(yīng)用組件咆繁。
運(yùn)行在主線程,不能進(jìn)行耗時(shí)操作
2.Service和Thread的區(qū)別
定義
Thread是程序執(zhí)行的最小單位顶籽,Service是安卓的一種運(yùn)行機(jī)制玩般。
實(shí)際開發(fā)
Thread作耗時(shí)操作,Service運(yùn)行主線程
應(yīng)用場(chǎng)景
Service音樂(lè)礼饱,導(dǎo)航
3.Service啟動(dòng)方式
1. startService
1)定義一個(gè)類繼承Service
2)在Mainfest.xml文件中配置該Service
3)使用Context的startService(Intent)方法啟動(dòng)該Service
4)不再使用時(shí)坏为,調(diào)用stopService(Intent)方法停止該服務(wù)
2. bindService
1)創(chuàng)建BindService服務(wù)端,繼承自Service并在類中镊绪,創(chuàng)建一個(gè)實(shí)現(xiàn)IBinder接口的實(shí)例對(duì)象并提供公共方法給客戶端調(diào)用
2)從onBind()回調(diào)方法返回此Binder實(shí)例
3)在客戶端中匀伏,從onServiceConnected()回調(diào)方法中接受Binder,并使用提供的方法調(diào)用綁定服務(wù)蝴韭。
Broadcast receiver
1.廣播的定義
在安卓中够颠,Broadcast是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制,廣播內(nèi)容是一個(gè)Intent榄鉴,這個(gè)Intent中可以攜帶我們要傳送的數(shù)據(jù)履磨。
2.廣播的使用場(chǎng)景
- 同一個(gè)app具有多個(gè)進(jìn)程的不同組件之間的消息通信
- 不同app之間的組件之間消息通信
3.廣播的種類
1)Normal Broadcast:Context.sendBroadcast
2)System Broadcast:Context.sendOrderedBroadcast
3)Local Broadcast:只在自身app內(nèi)傳播
4.實(shí)現(xiàn)廣播-receiver
1)靜態(tài)注冊(cè):注冊(cè)完成就一直運(yùn)行
2)動(dòng)態(tài)注冊(cè):跟隨activity的生命周期(要回收,不然會(huì)內(nèi)存泄漏)
區(qū)別:前者mainfest添加牢硅,app殺死后依然運(yùn)行蹬耘,后者代碼添加,跟隨activity的生命周期减余。
5.內(nèi)部實(shí)現(xiàn)機(jī)制
1)自定義廣播接受BroadcastReceiver综苔,并復(fù)寫onRecvice()
2)通過(guò)Binder機(jī)制向AMS進(jìn)行注冊(cè)
3)廣播發(fā)送者通過(guò)Binder機(jī)制向AMS發(fā)送廣播
4)AMS查找符合相應(yīng)條件(intentFilter/Permission)的BroadcastReceiver,將廣播發(fā)送到BroadcastReceiver(一般情況下是activity)相應(yīng)的消息循環(huán)隊(duì)列中
5)消息循環(huán)執(zhí)行拿到此廣播位岔,回調(diào)BroadcastReceiver中的onReceive()方法
5.LocalBroadcastManager詳解
1)使用它發(fā)送的廣播只在自身app中傳播如筛,因此不必?fù)?dān)心泄漏隱私數(shù)據(jù)
2)其他App無(wú)法對(duì)你的App發(fā)送該廣播,因?yàn)槟愕腁pp根本不可能接受到非自身的廣播抒抬,因此不用擔(dān)心有安全漏洞
3)比系統(tǒng)的全局廣播更加高效
注冊(cè)
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
if(savedInstanceState!=null) {
if(mLocalBroadcastManager!=null && mBoradCast!=null) {
mLocalBroadcastManager.unregisterReceiver(mBoradCast);
mLocalBroadcastManager=null;
mBoradCast=null;
}
}
mLocalBroadcastManager=LocalBroadcastManager.getInstance(this);
mBoradCast = new MyBroadCast(); IntentFilter intentFilter = new IntentFilter();
//重點(diǎn)在這里杨刨,本地注冊(cè),本地接收擦剑。
mLocalBroadcastManager.registerReceiver(mBoradCast, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mLocalBroadcastManager!=null && mBoradCast!=null) {
mLocalBroadcastManager.unregisterReceiver(mBoradCast);
mLocalBroadcastManager=null;
mBoradCast=null;
}
}
*發(fā)送
LocalBroadcastManager lcm=LocalBroadcastManager.getInstance(mContext);
lcm.sendBroadcast(new Intent(ACTION_LOCATION));//發(fā)送
Binder詳解
1. 相關(guān)Linux的基礎(chǔ)知識(shí)
1.1 進(jìn)程隔離/虛擬地址空間
1.2 系統(tǒng)調(diào)用
1.3 binder驅(qū)動(dòng)
2. Binder通信機(jī)制
2.1 為什么要使用binder
- android使用的Linux內(nèi)核擁有非常多的跨進(jìn)程通信機(jī)制
- 性能
- 安全(雙方身份校驗(yàn))
2.2 binder通信機(jī)制
- 通信錄:ServiceManager
-
通信基站:binder驅(qū)動(dòng)
binder通信機(jī)制.png
2.3 到底什么是binder
- 通常意義下妖胀,Binder指的是一種通信機(jī)制
- 對(duì)于Server進(jìn)程來(lái)說(shuō),Binder指的是Binder本地對(duì)象
- 對(duì)于Client進(jìn)程來(lái)說(shuō)惠勒,Binder指的是Binder代理對(duì)象
- 對(duì)于傳輸過(guò)程而已赚抡,Binder是可以進(jìn)行跨進(jìn)程傳遞的對(duì)象
Handler詳解
什么是handler
- 安卓消息機(jī)制的上層接口,可以用來(lái)更新ui
- handler通過(guò)發(fā)送和處理Message和Runnable對(duì)象來(lái)關(guān)聯(lián)對(duì)應(yīng)線程的MessageQueue纠屋。
- 可以讓對(duì)應(yīng)的Message和Runnable在未來(lái)的某個(gè)時(shí)間點(diǎn)進(jìn)行相應(yīng)處理
- 讓自己想要處理的耗時(shí)操作放在子線程涂臣,讓更新ui的操作放在主線程
handler的使用方法
- post(runnable)
- sendMessage(message)
handler機(jī)制的原理
handler發(fā)送消息,處理Looper對(duì)象售担。
handler引起的內(nèi)存泄漏以及解決辦法
原因:非靜態(tài)內(nèi)部類持有外部類的匿名引用赁遗,導(dǎo)致外部activity無(wú)法釋放
解決辦法:handler內(nèi)部持有外部activity的弱引用署辉,并把handler改為靜態(tài)內(nèi)部類,mHandler.removeCallback()
AsynkTask詳解
什么是AsynkTask
本質(zhì)上是一個(gè)封裝了線程池和handler的異步框架岩四,只能做一些耗時(shí)比較短的操作哭尝。
AsynkTask的使用方法
3個(gè)參數(shù)
5個(gè)方法
onPreExecute():做一些準(zhǔn)備工作
doInBackground():做耗時(shí)操作
onProgressUpdate():顯示進(jìn)度條的變化
onPostExecute():返回結(jié)果
AsynkTask的機(jī)制原理
- AsynkTask的本質(zhì)是一個(gè)靜態(tài)的線程池,AsynkTask派生出的子類可以實(shí)現(xiàn)不同的異步任務(wù)炫乓,這些任務(wù)都是提交到靜態(tài)的線程池中執(zhí)行
- 線程池中的工作線程執(zhí)行doInBackground(mParams)方法執(zhí)行異步任務(wù)
- 當(dāng)任務(wù)狀態(tài)發(fā)生改變之后刚夺,工作線程會(huì)向ui線程發(fā)送消息,AsynkTask內(nèi)部的internalHandler響應(yīng)這些消息末捣,并調(diào)用相關(guān)的回調(diào)函數(shù)侠姑。
AsynkTask的注意事項(xiàng)
- 內(nèi)存泄漏:非靜態(tài)內(nèi)部類持有外部類的匿名引用,導(dǎo)致外部activity無(wú)法釋放箩做。
- 生命周期:onDestory()方法中調(diào)用AsynkTask.cancel()
- 結(jié)果丟失:屏幕旋轉(zhuǎn)莽红,activity重新創(chuàng)建等,AsynkTask會(huì)持有之前的activity的引用邦邦。
- 并行or串行:
HandlerThread的理解
HandlerThread的產(chǎn)生背景
- 開啟Thread子線程進(jìn)行耗時(shí)操作
- 多次創(chuàng)建和銷毀線程是很耗系統(tǒng)資源的
HandlerThread的是什么
handler+thread+looper
是一個(gè)thread內(nèi)部有l(wèi)ooper
HandlerThread的特點(diǎn)
- 本質(zhì)上是一個(gè)線程類安吁,他繼承了Thread
- HandlerThread有自己的內(nèi)部Looper對(duì)象,可以進(jìn)行l(wèi)ooper循環(huán)
- 通過(guò)獲取HandlerThread的looper對(duì)象傳遞給Handler對(duì)象燃辖,可以在handlerMessage方法中執(zhí)行異步任務(wù)
- 優(yōu)點(diǎn)是不會(huì)有堵塞鬼店,減少了對(duì)性能的消耗,缺點(diǎn)是不能同時(shí)進(jìn)行多任務(wù)的處理黔龟,需要等待進(jìn)行處理妇智,處理效率較低
- 與線程池注重并發(fā)不同,HandlerThread是一個(gè)串行隊(duì)列氏身,HandlerThread背后只有一個(gè)線程巍棱。
IntentService的理解
IntentService是什么
- 繼承了Service,優(yōu)先級(jí)比Service高蛋欣。
- 它內(nèi)部通過(guò)HandlerThread和Handler實(shí)現(xiàn)異步操作
- IntentService是繼承并處理異步請(qǐng)求的一個(gè)類航徙,在IntentService內(nèi)有一個(gè)工作線程來(lái)處理耗時(shí)操作,啟動(dòng)IntentService的方式和啟動(dòng)傳統(tǒng)的Service一樣陷虎,同時(shí)到踏,當(dāng)任務(wù)執(zhí)行完后,IntentService會(huì)自動(dòng)停止尚猿,而不需要我們手動(dòng)去控制或stopSelf()窝稿。另外,可以啟動(dòng)IntentService多次谊路,而每一個(gè)耗時(shí)操作會(huì)以工作隊(duì)列的方式在IntentService的onHandlerIntent回調(diào)方法中執(zhí)行,并且菩彬,每次只執(zhí)行一個(gè)工作線程缠劝,執(zhí)行完一個(gè)再執(zhí)行第二個(gè)潮梯。