Android
1、10個(gè)基本簡(jiǎn)單的linux
mkdir 創(chuàng)建文件夾
rmdir 刪除文件夾
rm 刪除文件
touch 創(chuàng)建文件
cat 查看文件
find查找目錄
mv 移動(dòng)(修改)文件
cp 拷貝文件
cd 切換當(dāng)前目錄
tail 查看文件尾部
ls 列出文件清單
reboot重啟
ps 查看系統(tǒng)進(jìn)程
2旗吁、adb命令
adb device 查看連接計(jì)算機(jī)的設(shè)備
adb reboot 重啟設(shè)備
adb reboot bootloader 刷機(jī)模式
adb logcat 查看log
adb kill-server 終止進(jìn)程服務(wù)
adb start-server 重啟進(jìn)程服務(wù)
adb install xxx.apk安裝apk
adb unstall xxx.apk 卸載apk
adb connect ip地址 連接設(shè)備
adb shell kill [pid] 殺死進(jìn)程
adb shell ps 查看進(jìn)程
adb shell ls 列出目錄下的文件夾
adb logcat -c 清除log緩存
3痊臭、ANR(Application not Responding) 如何避免哮肚?
將耗時(shí)的操作,比如:訪問(wèn)網(wǎng)絡(luò)广匙、Socker通信允趟、大量查詢SQL語(yǔ)句都放到子線程中去,通過(guò)handle.sendMessage鸦致、runonUITread拼窥、AsyncTask等方式更新UI。
4蹋凝、一條最長(zhǎng)的短信息約占多少個(gè)byte?
國(guó)內(nèi)三大運(yùn)營(yíng)商通常情況下中文70总棵、英文160個(gè)鳍寂。包括標(biāo)點(diǎn)
5、如何判斷是否有SD卡:Environment.getExternalStorageState().equals(MEDIA_MOUNTED)
6情龄、Android程序與Java程序的區(qū)別:Android程序用android sdk開發(fā)迄汛,java程序用 java sdk開發(fā)。Android程序引用了大部分的Java SDK.
7骤视、啟動(dòng)應(yīng)用后鞍爱,改變系統(tǒng)語(yǔ)言,應(yīng)用的語(yǔ)言會(huì)改變么
一般是不會(huì)的专酗,只有重啟應(yīng)用才能改變應(yīng)用語(yǔ)言睹逃,除非應(yīng)用做了國(guó)際化處理。
8、介紹下adb沉填、ddms疗隶、aapt的作用:
adb:(Android debug bridge)Android調(diào)試橋
ddms:(Dalvik DeBug Monitor Service)程序執(zhí)行查看器(dalvik調(diào)試監(jiān)視服務(wù))
aapt:Android sdk中提供的一個(gè)小工具:可以查看、創(chuàng)建翼闹、更新ZIP格式的文檔附件
9斑鼻、ddms和traceview的區(qū)別:ddms是一個(gè)程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息猎荠,traceview是程序性能分析器坚弱。
PS:traceview是Android平臺(tái)特有的數(shù)據(jù)采集和分析工具。
10关摇、Activity:四大組件之一荒叶,是Context的子類,通常一個(gè)用戶交互界面對(duì)應(yīng)一個(gè)activity拒垃。
Activity的生命周期:
onCreate():表示Activity正在被創(chuàng)建停撞,Activity不可見,可做一些初始化工作
onStart():Activity正在被啟動(dòng)悼瓮,Activity可見戈毒,但還處于后臺(tái),無(wú)法與用戶交流横堡,
onResume():Activity可見埋市,在前臺(tái)并開始活動(dòng),可初始化一些資源命贴,比如打開相機(jī)或開啟動(dòng)畫
onPause():Activity正在停止道宅,Activity還可見,可做一些保存數(shù)據(jù)胸蛛、停止動(dòng)畫及資源回收操作污茵。
onStop():Activity即將停止,Activity不可見狀態(tài)葬项,在后臺(tái)運(yùn)行泞当,可做一些輕量級(jí)的回收操作。
onDestroy():Activty即將銷毀民珍,Activity不可見狀態(tài)襟士,做最終的回收工作和最終資源的釋放
onRestart():可見狀態(tài),表示Activity正在被啟動(dòng)嚷量,一般發(fā)生在用戶打開一個(gè)新的Activity陋桂,原本Activity執(zhí)行onPause()、onStop()方法蝶溶,當(dāng)重新回到這個(gè)Activity時(shí)候調(diào)用
https://blog.csdn.net/csdn_aiyang/article/details/72866032
保存Activity的狀態(tài):
重寫onSaveInstanceState()方法嗜历,接受一個(gè)Bundle類型的參數(shù),可以將狀態(tài)存儲(chǔ)到Bundle對(duì)象中,當(dāng)重啟activity調(diào)用它onCreate()方法時(shí)秸脱,Bundle將作為實(shí)參傳遞給onCreate()
橫豎屏切換時(shí)Activity的生命周期:
不設(shè)置Activity的android:configChanges時(shí)落包,切屏?xí)匦抡{(diào)用各個(gè)生命周期。切橫屏?xí)?zhí)行一次摊唇,豎屏兩次
設(shè)置android:configChanges=“orientation”時(shí)咐蝇,切屏也還會(huì)調(diào)用各個(gè)生命周期,切橫巷查、豎屏?xí)r只會(huì)執(zhí)行一次
設(shè)置android:configChanges=“orientation|keyboardHidden”時(shí)有序,不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
將Activity設(shè)置成窗口的樣式:
在Manifest中將主題設(shè)置成Dialog樣式
如何退出Activity岛请?如何安全退出已調(diào)用多個(gè)Activity的Application旭寿?
(1) 一般情況下,用戶按back鍵就可以退出Activity崇败,直接調(diào)用finish().
(2) 記錄打開的activity盅称,每打開一個(gè)就記錄下來(lái),在需要退出的時(shí)候后室,關(guān)閉每一個(gè)activity即可
(3) 發(fā)送特定廣播缩膝,在需要退出的時(shí)候,發(fā)送一個(gè)特定的廣播岸霹,每個(gè)Activity收到廣播的時(shí)候疾层,關(guān)閉即可。
(4)在打開新的Activity時(shí)候贡避,使用startActivityforresult痛黎,在onActivityResult中處理,遞歸關(guān)閉刮吧。
Activity的四種啟動(dòng)模式:
standard:每啟動(dòng)一次都要?jiǎng)?chuàng)建新的實(shí)例湖饱,不管實(shí)例有沒有存在。
singleTop:棧頂復(fù)用杀捻,若在棧頂就不生成新的實(shí)例琉历,如果在棧頂就調(diào)用onNewIntent復(fù)用。應(yīng)用在在當(dāng)前的Activity中啟動(dòng)同類型的Activity
singleTask:棧內(nèi)復(fù)用水醋,只要存在棧內(nèi)就不創(chuàng)建新的實(shí)例,其余實(shí)例出棧彪置,應(yīng)用在主頁(yè)
singleInstance:單例模式拄踪,系統(tǒng)會(huì)給該Activity單獨(dú)創(chuàng)建一個(gè)棧
11、Service:四大組件之一拳魁,主要執(zhí)行一些不需要與用戶交互且要求長(zhǎng)期運(yùn)行的任務(wù)惶桐,后臺(tái)任務(wù)的處理
Service是否在main thread中執(zhí)行,service里是否能執(zhí)行耗時(shí)操作?
默認(rèn)情況下姚糊,service和activity是運(yùn)行在當(dāng)前app所在進(jìn)程的main thread里面贿衍,所以service里面不能執(zhí)行耗時(shí)的操作。特殊情況下救恨,可以在清單文件配置service執(zhí)行所在的進(jìn)程贸辈,讓service在另外進(jìn)程中執(zhí)行。
Activity如何綁定service肠槽,如何在Activity中啟動(dòng)自己對(duì)應(yīng)的Service擎淤?
Activity通過(guò)bindService(Intent service,ServiceConnection conn,int flags)跟service綁定,秸仙,當(dāng)綁定成功后service會(huì)將代理對(duì)象通過(guò)回調(diào)的形式傳給conn嘴拢,就能拿到Service提供的服務(wù)代理對(duì)象。
在Activity中通過(guò)startService()和bindService()來(lái)啟動(dòng)服務(wù)寂纪,想要獲取Service服務(wù)對(duì)象就通過(guò)bindService席吴,若僅僅想要開啟一個(gè)后臺(tái)服務(wù),就是要startService()
StartService啟動(dòng)服務(wù)捞蛋,調(diào)用者和服務(wù)之間沒有關(guān)聯(lián)孝冒,如果是調(diào)用者直接退出沒有調(diào)用stopService的話,Service一直在后臺(tái)運(yùn)行襟交,用BindService啟動(dòng)服務(wù)迈倍,調(diào)用者和服務(wù)綁定了,調(diào)用者一旦退出捣域,Service也就終止啼染。
Service生命周期:
非綁定模式:onCreate()、onStartCommand()焕梅、onDestroy()
綁定模式:onCreate()迹鹅、onBind()、onUnbind()贞言、onDestroy()
什么是IntentService斜棚,有何有點(diǎn)?
IntentService是Service的子類该窗,可以根據(jù)需要處理異步請(qǐng)求(表示為Intent)弟蚀。
重復(fù)調(diào)用StartService()或bindService()會(huì)怎么樣?
第一次調(diào)用服務(wù)時(shí)候酗失,會(huì)先調(diào)用onCreate()再調(diào)用onStartCommand()义钉。若在這個(gè)生命周期內(nèi),再次啟動(dòng)服務(wù)规肴,則直接調(diào)用onStartCommand()捶闸,onBind()也只執(zhí)行一次
Actiivty夜畴、Service、Intent的關(guān)系:
Activity和Service都是四大組件删壮,都是Context的子類ContextWrapper的子類贪绘,Activity負(fù)責(zé)用戶界面的交互和顯示,Service負(fù)責(zé)后臺(tái)任務(wù)的處理央碟,Activity和Service通過(guò)Intent傳遞數(shù)據(jù)税灌,Intent可看成是通信使者。
Service和線程都是開啟后臺(tái)服務(wù)硬耍,什么時(shí)候使用Service和線程:
1垄琐、Service默認(rèn)運(yùn)行在主線程中,執(zhí)行耗時(shí)操作時(shí)在線程中開啟经柴。
2狸窘、Service優(yōu)先級(jí)高于后臺(tái)掛起的Activity或者Thread,所以當(dāng)系統(tǒng)資源不夠時(shí)候優(yōu)先殺死Activity和Thread坯认。
3翻擒、Thread運(yùn)行獨(dú)立于Activity,也就是當(dāng)Activity被finish之后牛哺,如果沒有主動(dòng)停止Thread或者Thrad里面的run方法未執(zhí)行完陋气,Thread也會(huì)一直執(zhí)行,這時(shí)候引润,當(dāng)Activity被finish之后不再持有該線程巩趁,無(wú)法控制之前創(chuàng)建的線程,而Service可以淳附。
12议慰、BroadCastReceiver :四大組件之一,主要用于接收系統(tǒng)或app發(fā)送的廣播事件奴曙”鸢迹可以進(jìn)行進(jìn)程間通信
分為有序廣播和無(wú)序廣播:
無(wú)序廣播:完全異步,可以被所有廣播接收者收到洽糟,效率高炉菲,但是無(wú)法將處理結(jié)果傳給下個(gè)接收者,沒有順序坤溃,無(wú)法被截?cái)唷?/code>
有序廣播:同步執(zhí)行的廣播拍霜,廣播發(fā)出后同一時(shí)間只能有一個(gè)廣播接收器接收到廣播,當(dāng)優(yōu)先級(jí)高的廣播接收器的onReceiver方式運(yùn)行結(jié)束后薪介,廣播才會(huì)繼續(xù)沉御,當(dāng)前廣播也可以截?cái)鄰V播,不繼續(xù)向下傳遞昭灵。
引用廣播的用意:
(1)程序間的互通消息
(2)Android的四大組件本質(zhì)上也就是為了實(shí)現(xiàn)移動(dòng)設(shè)備上的MVC架構(gòu)吠裆,可以方便幾大組件的信息和數(shù)據(jù)交互
注冊(cè)廣播的兩種方式:
靜態(tài)注冊(cè):在清單文件中為BroadcastReceiver注冊(cè),使用<receiver>標(biāo)簽聲明烂完,并在標(biāo)簽內(nèi)<Intent-filter>標(biāo)簽設(shè)置過(guò)濾器试疙。生命周期伴隨整個(gè)應(yīng)用。=>常駐型廣播抠蚣,應(yīng)用程序關(guān)閉后還是會(huì)收到廣播
動(dòng)態(tài)注冊(cè):在代碼中定義并設(shè)置好IntentFilter對(duì)象祝旷,然后在需要注冊(cè)的地方調(diào)用Context.registerReceiver()方法,調(diào)用Context.unregisterReceiver()方法取消注冊(cè)嘶窄。=>非常駐型廣播怀跛,跟隨Activity生命周期,當(dāng)程序關(guān)閉時(shí)柄冲,該接收器會(huì)被銷毀
PS:
BroadcastReceiver生命周期很短吻谋,從接收廣播創(chuàng)建到onRecrive()方法結(jié)束后銷毀。
廣播接收者中不要做一些耗時(shí)操作现横,會(huì)彈出ANR
耗時(shí)較長(zhǎng)的工作最好在服務(wù)中完成
動(dòng)態(tài)廣播注冊(cè)在onResume和onPause中注冊(cè)或銷毀漓拾,因?yàn)閛npause在App殺死前一定會(huì)被執(zhí)行,從而保證廣播在App在死亡前進(jìn)行銷毀戒祠,防止內(nèi)存泄漏骇两,再者,當(dāng)系統(tǒng)內(nèi)存不足時(shí)姜盈,在回收Activity占用的資源時(shí)低千,activity在執(zhí)行完onPause后就會(huì)被銷毀。
13馏颂、ContentProvider:四大組件之一示血,應(yīng)用程序之間共享數(shù)據(jù)的接口
使用方法:自定義一個(gè)類繼承ContentProvider,然后覆寫query、insert饱亮、update矾芙、delete等方法,第三方可以通過(guò)ContentResovler來(lái)訪問(wèn)該P(yáng)rovider近上。
Android的數(shù)據(jù)存儲(chǔ)方式:File存儲(chǔ)剔宪、ContentProvident存儲(chǔ)、SharedPreference存儲(chǔ)壹无、SQLiteDateBase存儲(chǔ)葱绒、網(wǎng)絡(luò)存儲(chǔ)
ContentProvider和sql的區(qū)別:ContentProvider屏蔽了數(shù)據(jù)存儲(chǔ)的細(xì)節(jié),只需要關(guān)心操作數(shù)據(jù)的uri就可以了斗锭,它可以實(shí)現(xiàn)不同app之間的共享地淀,sql只能查詢本應(yīng)用下的數(shù)據(jù)庫(kù)
說(shuō)說(shuō)ContentProvider、ContentResolver岖是、ContentObserver之間的關(guān)系:
ContentProvider 內(nèi)容提供者帮毁,用于對(duì)外提供數(shù)據(jù)
ContentProvider.notifyChange(uri)發(fā)出消息
ContentResolver:內(nèi)容解析者实苞,用于獲取內(nèi)容提供者提供的數(shù)據(jù)
ContentObserver:內(nèi)容監(jiān)聽器,可以監(jiān)聽數(shù)據(jù)的改變狀態(tài)烈疚。
ContentResolved.registerContentObserver()監(jiān)聽消息
14黔牵、Android中的幾種布局文件
線性布局(LinearLayout):水平/垂直
相對(duì)布局(RelativeLayout):根據(jù)參照物的位置來(lái)定位控件的位置
框架布局(FrameLayout):放入的控件都被放到左上的區(qū)域。
表格布局(TableLayout):通過(guò)表格方式布局(行/列)來(lái)布局控件的位置
絕對(duì)布局(AbsoluteLayout):采用坐標(biāo)軸的方式定位控件
約束布局(ConstraintLyout):控件之間存在相應(yīng)的位置關(guān)系爷肝。優(yōu)點(diǎn):減少布局層級(jí)使用(復(fù)雜布局)以及速度快猾浦,性能高
Padding和Margin區(qū)別:
padding站在父view的角度描述問(wèn)題,規(guī)定它里面的內(nèi)容與這個(gè)父view邊界的距離灯抛,margin是站在自己的角度描述問(wèn)題金赦,規(guī)定自己上下左右的距離。
对嚼?
padding是內(nèi)邊距夹抗,margin是外邊距
15、ListView
ListView如何提高效率
(1)復(fù)用ConvertView(優(yōu)化加載布局問(wèn)題):減少findviewById的使用次數(shù)猪半,每個(gè)item都會(huì)創(chuàng)建一個(gè)view對(duì)象兔朦,這非常耗內(nèi)存,為了節(jié)約內(nèi)存可在converView不為null的時(shí)候復(fù)用磨确。
(2)自定義靜態(tài)類ViewHolder(優(yōu)化加載控件):緩存item條目(優(yōu)化getView()中每次調(diào)用findviewById方法來(lái)獲取一次控件的代碼)
(3)使用分頁(yè)加載:優(yōu)化查詢數(shù)據(jù)沽甥,優(yōu)化內(nèi)存
(4)使用分段加載:優(yōu)化用戶體驗(yàn),比如10000條數(shù)據(jù)乏奥,要全部加載完才顯示摆舟,會(huì)影響用戶體驗(yàn)
ListView數(shù)據(jù)集發(fā)生改變后,如何更新ListView邓了?
調(diào)用adapter的notifyDataSetChanged方法
如何定位到指定位置:listview.Selection(2)
16恨诱、Java中引用類型都有哪些?作用是什么骗炉?
幾種引用類型:強(qiáng)引用照宝、軟引用、弱引用句葵、虛引用
引用類型的作用:使得程序可以更好的控制對(duì)象生命周期厕鹃,幫助緩解和處理內(nèi)存泄漏的問(wèn)題。
強(qiáng)引用:必不可少的乍丈,Object object=new Object()剂碴;這是一個(gè)強(qiáng)引用,若一個(gè)對(duì)象具有強(qiáng)引用轻专,垃圾回收器絕不會(huì)回收它忆矛,哪怕內(nèi)存控件不足時(shí),java虛擬器寧愿拋出OutOfMemoryError錯(cuò)誤请垛,使程序異常終止也不會(huì)回收催训。
軟引用:可有可無(wú)洽议,當(dāng)內(nèi)存空間足夠了就不會(huì)回收门坷,當(dāng)內(nèi)存空間不足時(shí)淳地,就會(huì)回收這些對(duì)象的內(nèi)存窄绒。軟引用用來(lái)實(shí)現(xiàn)內(nèi)存敏感的高速緩存
弱引用:可有可無(wú)书在,不管內(nèi)存足夠與否,都會(huì)回收它的內(nèi)存当叭,它與軟引用的區(qū)別在于弱引用的對(duì)象具有更短暫的生命周期
虛引用:虛引用并不會(huì)決定對(duì)象的生命周期,任何時(shí)候都可能被垃圾回收。主要用來(lái)跟蹤垃圾回收的活動(dòng)挑宠。
17、JNI(Java Native Interface)和NDK(Native Development Kit)
JNI作用:使得Java與本地其他語(yǔ)言類(C/C++)交互,它是屬于Java的颓影,與Android沒有關(guān)系各淀。
NDK:Android的一個(gè)工具開發(fā)包,快速開發(fā)C诡挂、C++的動(dòng)態(tài)庫(kù) 碎浇。
18、Intent傳遞:
可以傳遞哪些數(shù)據(jù)類型:java的基本數(shù)據(jù)類型和String以及他們的數(shù)組格式璃俗,還傳遞Serializable和Parcelabele接口的對(duì)象
19奴璃、Serializable和Parcelable的區(qū)別:
1.在使用內(nèi)存的時(shí)候,Parcelable(直接在內(nèi)存中讀寫)比Serializable(使用IO讀寫存儲(chǔ)在硬盤上)性能高城豁,所以推薦使用Pacelable.
2.Serializable在序列化的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)變量苟穆,從而引起頻繁的GC(垃圾回收機(jī)制)
3.Parcelable不能使用在要將數(shù)據(jù)存在磁盤上的情況
4.Parcelable是android的,Serializable是java的
20唱星、Intent和IntentFilter的區(qū)別
Intent代表了Android應(yīng)用的啟動(dòng)意圖雳旅,Android應(yīng)用根據(jù)這個(gè)Intent來(lái)啟動(dòng)指定組件。IntentFilter相當(dāng)于Intent的過(guò)濾器间聊,應(yīng)用開發(fā)完后攒盈,需要用IntentFilter告訴Android系統(tǒng)能處理哪些隱式的Intent請(qǐng)求,主要通過(guò)data哎榴、category型豁、action三方面
21、Fragement
Fragment和Activity間的傳值:
Fragment和Activity綁定后叹话,在Fragment中可直接通過(guò)getActivity()方法獲取到其綁定的Activity對(duì)象偷遗,這樣就能調(diào)用到Acitivity的方法了,在Activity中通過(guò)如下方式獲取到Fragment:FragmentManager manager=getFragmenManager()驼壶; Fragment fragment=manager.findFragmentById(id);或者fagment=manager.findFragmentByTag(tag)氏豌;獲取到fragment后就可以調(diào)用Fragment的方法。
Fragment生命周期:
創(chuàng)建時(shí)會(huì)執(zhí)行的方法:
onAttach():fragment關(guān)聯(lián)activity热凹,在此可與activity通信泵喘。
onCreate():系統(tǒng)創(chuàng)建fragment時(shí)使用泪电,實(shí)例化一些變量,主要是暫停纪铺、停止時(shí)想保存的數(shù)據(jù)相速。
onActivityCreate():在onCreate()執(zhí)行之后調(diào)用,
onCreateView():加載fragment布局
變得可見時(shí)會(huì)執(zhí)行:
onStart():Fragment啟動(dòng)時(shí)回調(diào)鲜锚,此時(shí)Fragment可見
onResume():Fragment進(jìn)入前臺(tái)突诬,可再此做一些onpause()或onStop()方法中釋放的資源。
進(jìn)入后臺(tái)會(huì)執(zhí)行的方法:
onPause():一般指用戶離開這個(gè)fragment(非銷毀)芜繁,在此可做一些數(shù)據(jù)存儲(chǔ)旺隙、動(dòng)畫停止等操作。
onStop():Fragment不可見骏令,可做一些資源釋放操作
最后銷毀:
onDestroyView():移除布局蔬捷,銷毀相關(guān)聯(lián)的布局,清除與視圖相關(guān)的資源榔袋。
onDestroy():銷毀Fragment周拐,回收工作和最終資源釋放。
onDetach():activity與fragmnet解除關(guān)聯(lián)
22凰兑、如何對(duì)Android應(yīng)用進(jìn)行內(nèi)存性能分析:
出現(xiàn)卡頓等原因:
在UI線程中做輕微耗時(shí)操作導(dǎo)致
布局Layout過(guò)于復(fù)雜妥粟,無(wú)法再16ms內(nèi)完成渲染
同一時(shí)間動(dòng)畫執(zhí)行的次數(shù)過(guò)多,導(dǎo)致CPU或GPU負(fù)載過(guò)多
view過(guò)度繪制
View頻繁的觸發(fā)measure聪黎、layout
內(nèi)存頻繁觸發(fā)GC過(guò)多
冗余的資源及邏輯導(dǎo)致加載和執(zhí)行緩慢
ANR
如何進(jìn)行性能分析:ddms(程序執(zhí)行查看器)的traceview罕容、heap、allocation tracker等工具
traceview:程序性能分析器
heap:檢查代碼中可能有內(nèi)存泄漏的地方
allocation tracker:
什么情況下會(huì)導(dǎo)致內(nèi)存泄漏:
資源釋放問(wèn)題:Context稿饰、Cursor锦秒、IO流的引用,資源得不到釋放
對(duì)象內(nèi)存過(guò)大問(wèn)題:保存了多個(gè)耗用內(nèi)存過(guò)大的對(duì)象喉镰,例如Bitmap旅择、xml文件,造成內(nèi)存超出限制
static引用資源耗費(fèi)過(guò)多的實(shí)例侣姆,例如:static Context
線程導(dǎo)致內(nèi)存泄漏
23生真、避免OOM(Out Of Memory:內(nèi)存溢出)異常:分為內(nèi)存泄漏(申請(qǐng)使用完的內(nèi)存沒有釋放)和內(nèi)存溢出(申請(qǐng)的內(nèi)存超過(guò)了JVM能提供的大小)
圖片過(guò)大導(dǎo)致OOM時(shí):等比例縮小圖片或者是采用軟引用及時(shí)進(jìn)行recyle()操作
界面切換導(dǎo)致的OOM:若布局中有背景圖之類的捺宗,放到onCreate()中去處理柱蟀,在activity中的onDestroy中drawable.setCallback(null)
查詢數(shù)據(jù)庫(kù)記得關(guān)閉游標(biāo)
Bitmap對(duì)象不再使用時(shí)調(diào)用recycle()釋放內(nèi)存
24、Android如何捕獲未捕獲的異常
自定義一個(gè)Application蚜厉,繼承Application實(shí)現(xiàn)UncaughtExceptionHandler,重寫onCreate()和uncaughtException()方法长已,然后在Manifest中配置該Application
25、Android屏幕適配
dp:dip的縮寫,指密度無(wú)關(guān)的像素(px)
dp適配:
dimens適配:
layout適配
java代碼適配
xml布局中weight權(quán)重適配
屏幕適配的技巧:
手機(jī)自適應(yīng)情況主要分為:橫豎屏的切換(Manifest中配置configChange术瓮,然后在activity中重寫onConfigChanged方法)康聂、分辨率大小的不同(可設(shè)置weight權(quán)重設(shè)置)
25、AIDL(android interface definition language):
步驟:
服務(wù)端:
1.首先創(chuàng)建aidl文件胞四,定義提供的接口
2.創(chuàng)建一個(gè)自定義Service繼承Service恬汁,在里面創(chuàng)建一個(gè)類繼承剛創(chuàng)建AIDL的Stub類并實(shí)現(xiàn)aidl中定義的方法,在onBind返回內(nèi)部類的方法辜伟。
客戶端:
3.綁定服務(wù)端的Service氓侧,使用asInterface()將服務(wù)端的Binder對(duì)象轉(zhuǎn)換成AIDL接口所屬類型。然后調(diào)用AIDL中的方法
PS:通過(guò)bindService(Intent,ServiceConnect,int)綁定遠(yuǎn)程服務(wù)导狡,bindService中有一個(gè)ServiceConnect接口甘苍,我們需要覆寫onServiceConnected(ConponentName,IBinder)方法烘豌,IBinder就是在AIDL中定義的接口。
26看彼、自定義控件
自定義組合控件:自定義組合控件就是把多個(gè)控件作為一個(gè)整體看待廊佩、處理。
自定義view步驟:
1.自定義View的屬性:在res/values/下建立一個(gè)attrs.xml靖榕,在里面定義屬性和聲明整個(gè)樣式标锄,然后在布局文件中聲明自定義的view,在自定義View的構(gòu)造方法中獲取自定義的樣式
2.重寫onMeasure()測(cè)量view(寬高)和它的內(nèi)容茁计,每一個(gè)measureSpec由一個(gè)尺寸(size)和模式(model)
3.重寫onDraw()方法料皇,使用Canvas繪制圖形
27、Android中的事件處理
Handle機(jī)制:Android中的主線程(UI線程)用來(lái)創(chuàng)建星压、更新UI践剂,耗時(shí)操作需要在子線程中處理,處理完后為了防止UI處理邏輯混亂娜膘,Android只允許主線程修改UI逊脯,Handle充當(dāng)橋梁。
使用步驟:將Handle聲明在Activity中竣贪,覆寫Handle的handleMessage()方法军洼,當(dāng)子線程調(diào)用handle.sendMessage()方法后,handleMessage方法就會(huì)在主線程中執(zhí)行演怎。
PS:
MassageQueue:消息隊(duì)列匕争,它的內(nèi)部存儲(chǔ)了信息,Looper對(duì)象對(duì)該線程的MessageQueue進(jìn)行管理爷耀。
Looper:無(wú)限循環(huán)的方式去查詢消息隊(duì)列中是否有消息甘桑。每個(gè)線程都有自己的Looper對(duì)象,通過(guò)ThreadLocal獲取當(dāng)前線程的looper,主線程自動(dòng)創(chuàng)建Looper對(duì)象扇住,而其他線程在使用的時(shí)候需要自行創(chuàng)建春缕。通過(guò)Looper.prepare()為當(dāng)前線程創(chuàng)建一個(gè)Looper,通過(guò)Looper.looper()來(lái)開啟消息循環(huán)艘蹋。退出looper可通過(guò)quit(直接退出looper)和quitSafely(處理消息完后才退出)
Message:MessageQueue中存儲(chǔ)的對(duì)象锄贼。
ThreadLocal是一個(gè)線程內(nèi)部的數(shù)據(jù)存儲(chǔ)類,通過(guò)它可以在指定的線程中存儲(chǔ)數(shù)據(jù)女阀,存儲(chǔ)后也只能在指定的線程中獲取到數(shù)據(jù)宅荤。通過(guò)ThreadLocal來(lái)獲取到當(dāng)前線程的Looper
28、事件分發(fā)機(jī)制
事件分發(fā)中的onTouch和onTouchEvent區(qū)別浸策,如何使用冯键?
onTouch優(yōu)先于onTouchEvent執(zhí)行,若在onTouch中通過(guò)返回true將事件消費(fèi)掉庸汗,onTouchEvent將不會(huì)再執(zhí)行惫确。onTouch得到執(zhí)行需要兩個(gè)執(zhí)行條件,一個(gè)是onTouchListener的值不能為空蚯舱,第二是當(dāng)前點(diǎn)擊的控件必須是enable的改化。
描述一下事件的分發(fā)流程:事件收集之后最先傳遞給Activity,然后依次向下傳遞枉昏,Activity->PhoneWindow->DecorView->ViewGroup->View
如果事件被消費(fèi)陈肛,意味著事件信息傳遞終止
如果事件沒有被消費(fèi),事件會(huì)回傳給Activity兄裂,如果Activity也不需要就被拋棄
判斷事件是否被消費(fèi)是根據(jù)返回值句旱,而不是根據(jù)你是否使用了事件
viewGroup的事件為三個(gè):dispatchTouchEvent(事件分發(fā))、onInterceptTouchEvent(攔截事件晰奖,事件返回true表示被消費(fèi))谈撒、onTuchEvent(處理事件)。 View的事件只有:dispatchTouchEvent()匾南、onTouchEvent()
首先是Activity的事件分發(fā):調(diào)用Activity的dispatchTouchEvent()->getWindow().superDispatchTouchEvent()->Decor.superDispatchTouchEvent()->若返回true港华,當(dāng)前事件被消費(fèi),則事件分發(fā)結(jié)束午衰。若返回false立宜,繼續(xù)向下分發(fā)。調(diào)用ViewGroup的臊岸。
29橙数、Android數(shù)字簽名
在Android系統(tǒng)中,所有安裝到系統(tǒng)中的應(yīng)用程序都必有一個(gè)數(shù)字簽名帅戒,數(shù)字證書的私鑰保存在程序開發(fā)者手中灯帮。用來(lái)標(biāo)識(shí)應(yīng)用程序作者和應(yīng)用程序之間建立信任關(guān)系崖技。
30、Android中的動(dòng)畫
系統(tǒng)動(dòng)畫:
Tween(補(bǔ)間)動(dòng)畫:這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng)钟哥、放大迎献、縮小以及產(chǎn)生透明度的變化
Frame(逐幀)動(dòng)畫:傳統(tǒng)動(dòng)畫,類似電影
補(bǔ)間動(dòng)畫缺點(diǎn):
作用對(duì)象局限腻贰,只能作用在視圖View上
沒有改變View的屬性吁恍,只改變視覺效果
動(dòng)畫效果單一
Android 3.0之后加入了屬性動(dòng)畫:可以對(duì)任意對(duì)象的屬性進(jìn)行動(dòng)畫而不僅僅是View。通過(guò)AnimatorSet類和xml文件的set標(biāo)簽都可以改變對(duì)象的多個(gè)屬性播演,實(shí)現(xiàn)動(dòng)畫效果冀瓦。=>AnimatorSet通過(guò)before、with写烤、after三個(gè)方法組合多個(gè)屬性動(dòng)畫翼闽,with表示與給定動(dòng)畫同時(shí)執(zhí)行,before在給定動(dòng)畫執(zhí)行前執(zhí)行洲炊,after在給定動(dòng)畫執(zhí)行之后執(zhí)行
ObjectAnimator
ValueAnimator:ObjectAnimator的父類感局,
ObjectAnimator和ValueAnimator傳入的都有一個(gè)TypeEvaluator類型的參數(shù),只是一個(gè)接口暂衡,里面也只有一個(gè)
31蓝厌、如何修改Activity進(jìn)入和退出的動(dòng)畫。
1.定義Activity的主題古徒,在Manifest中給指定的Activity指定theme。
2.覆寫overridePendingTransition方法
32读恃、多線程和異步加載
多線程三種方式:
1.new Thread(new Runnable)隧膘,把run()方法寫在線程里
2.讓Activity實(shí)現(xiàn)Runnable接口,把run方法單獨(dú)提出來(lái)
3.利用線程池ExecutorService接口創(chuàng)建多線程
異步任務(wù)三種方式:
1.AsyncTask:doInBackgound()是繼承AsyncTask必須要實(shí)現(xiàn)的寺惫,運(yùn)行后臺(tái)疹吃,做耗時(shí)操作。onPostExecute()在主線程中運(yùn)行西雀,寫開始提示代碼萨驶。publishProgress()更新進(jìn)度,給onProgressUpdate()傳遞參數(shù)艇肴。onProgressUpdate()在publishProgress()調(diào)用完被調(diào)用腔呜,更新進(jìn)度
2.Thread的兩種方式:(1)public class MyThread extends Thread{},然后調(diào)用的時(shí)候MyThread.start()再悼。 (2)public class MyRunnable implement Runnable{}核畴, 使用的時(shí)候調(diào)用new Thread(new MyRunnable()).start()
3.IntentService:具有Service一樣的生命周期,提供了后臺(tái)線程中的異步處理機(jī)制冲九,使用public class MyIntentService extends IntentService{}谤草。啟動(dòng)Intent in=new Intent(ServiceActivity.this,MyIntentService.class);startService(in)
33、都使用過(guò)哪些框架、平臺(tái)
EventBus丑孩、mob(短信驗(yàn)證)冀宴、Retrofit、butterknife温学、picassio略贮、photoview
34、EventBus:
自定義一個(gè)事件類:例如UserBean
要接收消息的頁(yè)面:
注冊(cè):EventBus.getDefault().register(this)
接收消息的方法:onEvent(UserBean bean)
取消注冊(cè):EventBus.getDefault().unregister(this)
發(fā)送消息的頁(yè)面:
EventBus.getDefault().post(new UserBean(xxxxx))
35枫浙、Context
從Android系統(tǒng)的角度來(lái)理解:Context是一個(gè)場(chǎng)景刨肃,描述的是一個(gè)應(yīng)用程序環(huán)境的信息,即上下文箩帚,代表與操作系統(tǒng)的交互的一種過(guò)程真友。
從程序的角度上來(lái)理解:Context是個(gè)抽象類,而Activity紧帕、Service盔然、Application等都是該類的一個(gè)實(shí)現(xiàn),也就是說(shuō)是它子類
36是嗜、RecycleView對(duì)于ListView的差異:
LayoutManager管理各種類型的布局
加入Holder來(lái)管理布局和布局復(fù)用愈案,不同Type的View都要?jiǎng)?chuàng)建各自的Holder
沒有現(xiàn)成的ItemClick回調(diào)
豐富的數(shù)據(jù)刷新方法
可自定義分割線
37、如何從網(wǎng)絡(luò)上加載一張圖片顯示到界面上
原生方法:使用BitmapFactory.decodeStream(inputString)方法將圖片轉(zhuǎn)換成bitmap鹅搪,然后通過(guò)imageview.setImageBitmap()將圖片設(shè)置到Imageview中
使用第三方框架:Picasso站绪、ImageLoader等
38、Activity之間的通信方式
startActivityforesult()啟動(dòng)
通過(guò)廣播形式
Intent跳轉(zhuǎn)時(shí)攜帶數(shù)據(jù)
數(shù)據(jù)存儲(chǔ)方式:Sharedpreference等
39丽柿、Android虛擬機(jī)DVM 和java虛擬機(jī)JVM的區(qū)別
Dalvik基于寄存器恢准,而JVM基于棧,基于寄存器的虛擬機(jī)編譯時(shí)花費(fèi)時(shí)間更短
DVM執(zhí)行.dex格式的字節(jié)碼甫题,JVM執(zhí)行.dass格式的字節(jié)碼
40馁筐、MVC MVP MVVP
MVC:
M:模型層,負(fù)責(zé)處理數(shù)據(jù)的加載或者存儲(chǔ)
V:視圖層坠非,負(fù)責(zé)界面數(shù)據(jù)的展示敏沉,與用戶進(jìn)行交互
C:控制器層,負(fù)責(zé)邏輯業(yè)務(wù)的處理
基本流程:首先視圖接收用戶的輸入請(qǐng)求炎码,然后將請(qǐng)求傳遞給控制器盟迟,控制器再調(diào)用模型來(lái)處理用戶請(qǐng)求。在控制器的控制下潦闲,將處理后的結(jié)果交給視圖進(jìn)行格式化輸出給用戶队萤。
MVP:
M:數(shù)據(jù)層,負(fù)責(zé)數(shù)據(jù)的加載或存儲(chǔ)
V:視圖層矫钓,負(fù)責(zé)界面數(shù)據(jù)的展示要尔,負(fù)責(zé)與用戶交互
P:中間者舍杜,綁定Model層和View層,是Model和View之間的橋梁
MVC和MVP的區(qū)別:MVP中的View并不直接使用Model赵辕,它們之間的通信是通過(guò)Present來(lái)進(jìn)行的既绩,而MVC中View直接從Model中讀數(shù)據(jù)而不是Controller
41、https和http的區(qū)別
超文本傳輸協(xié)議Http被用在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息还惠,以明文方式發(fā)送內(nèi)容饲握,不提供任何方式的數(shù)據(jù)加密。安全套接字層超文本傳輸協(xié)議HTTPS蚕键,在HTTP基礎(chǔ)上接了SSL協(xié)議救欧,為瀏覽器和服務(wù)器之間的通信加密
42、UDP(用戶數(shù)據(jù)報(bào)協(xié)議)和TCP(傳輸控制協(xié)議)基本區(qū)別
TCP面向連接锣光、傳輸可靠笆怠,用于傳輸大量數(shù)據(jù),速度慢誊爹,建立連接需要開銷較多
UDP面向非連接蹬刷,傳輸不可靠,用于傳輸少量數(shù)據(jù)频丘,速度快
TCP如何保證可靠數(shù)據(jù)傳播:(1)將數(shù)據(jù)截取為TCP認(rèn)為合理的長(zhǎng)度办成。(2)當(dāng)TCP發(fā)出一個(gè)段后它會(huì)開啟一個(gè)定時(shí)器,當(dāng)不能及時(shí)收到時(shí)候搂漠,進(jìn)行重新發(fā)送(超時(shí)重發(fā))迂卢。(3)對(duì)于收到的請(qǐng)求,進(jìn)行回應(yīng))(4)對(duì)于失序的數(shù)據(jù)進(jìn)行重排序桐汤。(5)丟棄重復(fù)數(shù)據(jù)
43而克、Socket基本實(shí)現(xiàn)原理
基于TCP協(xié)議的Socket:
服務(wù)端:
1、服務(wù)端聲明一個(gè)ServiceSoket惊科,并指定端口號(hào):ServiceSockt mserviceSoket=new ServiceSocket(8080)
2、調(diào)用accept()方法接收數(shù)據(jù):Socket socket=mserviceSoket.accept()
3亮钦、接收到數(shù)據(jù)后馆截,通過(guò)inputStream讀取數(shù)據(jù):InputStream inputStream=socket.getInputStream()
4、關(guān)閉ServiceSoket:mServiceSocket.close()
客戶端:
1蜂莉、創(chuàng)建一個(gè)Socket對(duì)象蜡娶,指定服務(wù)器的地址和端口號(hào):Socket socket=new Socket("172.168.10.2",8080)
2、創(chuàng)建一個(gè)inputStream讀取要發(fā)送的文件:InputStream inputStream=new FileInputStream("e://a.txt")
3映穗、獲取Socket的OutputStream對(duì)象用于發(fā)送數(shù)據(jù):OutputStream outputStream=socket.getOutputStream()
4窖张、把數(shù)據(jù)寫入到OutputStream對(duì)象中:outputStream.write();
5、發(fā)送讀取的數(shù)據(jù)到服務(wù)端:outputSteam.flush()
基于UDP協(xié)議的數(shù)據(jù)傳輸
服務(wù)端接收客戶端實(shí)現(xiàn):
//端口號(hào)可以在一個(gè)范圍內(nèi)自己定義蚁滋,表示這個(gè) DatagramSocket 在此端口上監(jiān)聽數(shù)據(jù)
1宿接、創(chuàng)建一個(gè)DatagramSocket對(duì)象赘淮,并且指定端口號(hào):DatagramSocket socket=new DatagramSocket(8080)
2、創(chuàng)建一個(gè)DatagramPacket對(duì)象睦霎,并指定DatagramPacket對(duì)象的大猩倚丁:DatagramPacket packet=new DatagramPacket(data,data.length)
3副女、使用DatagramSocket的對(duì)象的receive接收數(shù)據(jù):socket.recrive(packet)
4蛤高、將客戶端發(fā)送的數(shù)據(jù)轉(zhuǎn)換成字符串
服務(wù)端發(fā)送數(shù)據(jù)實(shí)現(xiàn):
1、創(chuàng)建DatagramSocket碑幅,指定端口號(hào):DatagramSocket socket=new DatagramSocket(8080)
2戴陡、定義客戶端地址:InetAddress address=packet.getAddress()//packet是上面服務(wù)端接收客戶端實(shí)現(xiàn)步驟2的packet
3、定義客戶端端口號(hào):int port=packet.getPort();//packet是上面服務(wù)端接收客戶端實(shí)現(xiàn)步驟2的packet
創(chuàng)建DatagramPacket沟涨,指定響應(yīng)數(shù)據(jù)恤批、數(shù)據(jù)的長(zhǎng)度、客戶端地址和客戶端端口號(hào):DatagramPacket packet2=new DatagramPacket(data2,data2.length,address,port)
4.通過(guò)DatagramSocket.send()方法發(fā)送數(shù)據(jù):socket.send(packet2)
5.關(guān)閉資源:socket.close()
客戶端發(fā)送數(shù)據(jù)實(shí)現(xiàn):
1拷窜、創(chuàng)建一個(gè)DatagramSocket對(duì)象开皿,指定監(jiān)聽的端口號(hào):DatagramSocket socket=new DatagramSocket(8088)
2、使用InetAddress.getByName把IP地址轉(zhuǎn)換成網(wǎng)絡(luò)地址:InetAddress serviceAddress=InetAddress.getByName(10.0.0.12)
3篮昧、創(chuàng)建一個(gè)DatagramPacket對(duì)象赋荆,用于發(fā)送數(shù)據(jù): DatagramePacket packet=new DatagramPacket(data(要發(fā)送的數(shù)據(jù)),data.length(數(shù)據(jù)長(zhǎng)度)懊昨,serviceAddress(服務(wù)端的網(wǎng)絡(luò)地址)窄潭,8080(服務(wù)端端口號(hào)))
4、使用DatagramSocket.send發(fā)送數(shù)據(jù)到服務(wù)端:socket.send(packet)
客戶端接收服務(wù)器返回的數(shù)據(jù):
1酵颁、創(chuàng)建一個(gè)DatagramSocket嫉你,指定端口號(hào),要和發(fā)送時(shí)的socket一致:DatagramSocket socket=new DatagramSocket(8088)
2躏惋、創(chuàng)建一個(gè)DatagramPacket packet=new DatagramSocket(data幽污,data.length)
3、使用DatagramSocket.receive接收數(shù)據(jù):socket.receive()
4簿姨、關(guān)閉DatagramSocket:socket.close()
44距误、Andorid系統(tǒng)架構(gòu)(從上到下)
應(yīng)用程序?qū)樱河肑ava語(yǔ)言來(lái)編寫
應(yīng)用程序框架層:從事Android開發(fā)的基礎(chǔ),開發(fā)人員可直接使用其提供的組件來(lái)進(jìn)行快速的應(yīng)用程序開發(fā)扁位。
系統(tǒng)運(yùn)行庫(kù)層:C++/C庫(kù)以及Android運(yùn)行庫(kù)
Linux內(nèi)核層:
45准潭、Binder機(jī)制原理
從機(jī)制、模型角度來(lái)說(shuō):跨進(jìn)程通信方式域仇,實(shí)現(xiàn)了IBinder接口
從模型結(jié)構(gòu)刑然、組成來(lái)說(shuō):Binder驅(qū)動(dòng):連接Service進(jìn)程、Client進(jìn)程和ServiceManager的橋梁
從Andorid代碼的實(shí)現(xiàn)角度來(lái)說(shuō):Binder機(jī)制具體實(shí)現(xiàn)原理:注冊(cè)服務(wù)->獲取服務(wù)->使用服務(wù)
46暇务、Android如何加載大圖片泼掠?對(duì)圖片進(jìn)行壓縮
針對(duì)圖片的寬高進(jìn)行壓縮:首先獲取加載圖片的屬性(BitmapFactory.Options怔软、BitmapFactory.decodeResource),然后再縮小圖片的長(zhǎng)寬來(lái)壓縮圖片
針對(duì)圖片像素進(jìn)行壓縮武鲁,導(dǎo)致圖片質(zhì)量下降
使用Fresco(Fresco是facebook推出的開源項(xiàng)目爽雄,該項(xiàng)目主要用來(lái)解決Android圖片加載的)SimpleDraweeView或ZoomableView
47、LinearLayout(縱只能橫用沐鼠,橫只能縱用)的gravity,layout_gravity和weight:
gravity:view本身內(nèi)容的位置
layout_gravity:控制自己在父元素的位置
weight:置該屬性的控件的layout_width="warp_content"挚瘟,很正確.置該屬性的控件的layout_width="match_parent",不正確.使用weight權(quán)重時(shí)饲梭,建議將width或height設(shè)置為0dp
48乘盖、Activity A 跳轉(zhuǎn)到Activity B,生命周期的執(zhí)行過(guò)程
先是ActivityA的onpause()->ActivityB的onCreate()->ActivityB的onStart()->ActivityB的onResume()->ActivityA的onStop()
49憔涉、Android中Handler聲明非靜態(tài)對(duì)象會(huì)發(fā)出警告订框,為什么,非得是靜態(tài)的兜叨?
如果不使用static生命穿扳,則會(huì)導(dǎo)致內(nèi)存泄漏。Handler被聲明為一個(gè)非靜態(tài)內(nèi)部類或者匿名類可能會(huì)阻止外部類的垃圾回收
50国旷、廣播注冊(cè)后不解除注冊(cè)會(huì)有什么問(wèn)題矛物? 會(huì)出現(xiàn)內(nèi)存泄漏
51、Dagger通過(guò)編譯時(shí)注解方式跪但,幫我們自動(dòng)生成創(chuàng)建對(duì)象的工廠類履羞。
52、在實(shí)際Android項(xiàng)目中用到的設(shè)計(jì)模式
適配器模式:RecycleView與Adapter
工廠模式:BitmapFactory
觀察者模式:EventBus屡久、各種監(jiān)聽器忆首、
單例模式:ActivityManager、FragmentManager
53被环、單線程中Message糙及、MessageQueue、Looper筛欢、Handler之間的關(guān)系浸锨。
通過(guò)Handler獲取當(dāng)前線程中的looper對(duì)象,發(fā)送消息
Message:線程間交流的信息
MessageQueue:用來(lái)存放Handler發(fā)布的Message
Looper:執(zhí)行Message循環(huán)
54悴能、Android性能優(yōu)化
布局優(yōu)化:減少布局的層級(jí)數(shù)揣钦,刪除無(wú)用的控件和層級(jí)雳灾、采用<include>標(biāo)簽漠酿、<merge>標(biāo)簽和ViewStub
繪制優(yōu)化:在view的onDraw中避免大量的操作,比如創(chuàng)建新的局部變量谎亩、做耗時(shí)操作
內(nèi)存泄漏優(yōu)化:(1)靜態(tài)變量導(dǎo)致的內(nèi)存泄漏:釋放內(nèi)存炒嘲。(2)屬性動(dòng)畫導(dǎo)致的內(nèi)存泄漏:在onDestroy中調(diào)用animator.cancel()來(lái)停止動(dòng)畫宇姚。
響應(yīng)速度優(yōu)化:避免在主線程中做耗時(shí)操作,通過(guò)分析data/anr目錄下的traces.txt文件定位出ANR原因(ANR日志分析)
ListView和Bitmap優(yōu)化:(1)listview采用ViewHolder并避免在getView中執(zhí)行耗時(shí)操作夫凸,通過(guò)列表的滑動(dòng)狀態(tài)來(lái)控制任務(wù)的執(zhí)行頻率浑劳。(2)Bitmap主要通過(guò)BitmapFactory.Options來(lái)根據(jù)需要對(duì)圖片進(jìn)行采樣
線程優(yōu)化:采用線程池,避免程序中存在大量的Thread
53夭拌、Rxjava
作用:實(shí)現(xiàn)異步調(diào)用
數(shù)據(jù)結(jié)構(gòu)
1魔熏、鏈表:線性數(shù)據(jù)集合,用于表示順序的數(shù)據(jù)結(jié)構(gòu)
分為單鏈表鸽扁、雙鏈表蒜绽、循環(huán)鏈表
單鏈表:每一個(gè)節(jié)點(diǎn)只指向下一個(gè)節(jié)點(diǎn),最后一個(gè)指向空
雙鏈表:每個(gè)節(jié)點(diǎn)有兩個(gè)指針桶现,一個(gè)指向前一個(gè)節(jié)點(diǎn)躲雅,另一個(gè)指向后一個(gè)節(jié)點(diǎn),最后一個(gè)指向null
循環(huán)鏈表:每個(gè)節(jié)點(diǎn)指向下一個(gè)節(jié)點(diǎn)骡和,最后一個(gè)節(jié)點(diǎn)指向第一個(gè)節(jié)點(diǎn)
2相赁、棧:元素集合,支持兩個(gè)基本操作:push用于將元素壓入棧慰于,pop用于刪除棧頂元素
后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)钮科,索引和查找的時(shí)間復(fù)雜度是O(n),插入和刪除的時(shí)間復(fù)雜度是O(1)
3东囚、隊(duì)列:元素集合跺嗽,支持兩個(gè)基本操作:enqueue用于添加一個(gè)元素到隊(duì)列,dequeue用于刪除隊(duì)列的一個(gè)元素
先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)页藻,時(shí)間復(fù)雜度是索引和查找是O(n)桨嫁,插入和刪除是O(1)
4、二叉樹:樹形數(shù)據(jù)結(jié)構(gòu)份帐,每個(gè)節(jié)點(diǎn)最多可以有左右兩個(gè)子節(jié)點(diǎn)
滿二叉樹:二叉樹中的每個(gè)節(jié)點(diǎn)有0或2個(gè)子節(jié)點(diǎn)
完美二叉樹:二叉樹中的每個(gè)節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn)璃吧,且所有的葉子結(jié)點(diǎn)的深度都一樣
完全二叉樹:二叉樹除了最后一層外其他各層的節(jié)點(diǎn)數(shù)均達(dá)到最大值,最后一層的節(jié)點(diǎn)都連續(xù)集中在最左邊
二叉查找數(shù):任何節(jié)點(diǎn)的值都大于等于左子樹的值废境,小于等于右子數(shù)的值
5畜挨、堆:基于樹的滿足某些特性的數(shù)據(jù)結(jié)構(gòu),分為最大堆和最小堆噩凹。在最大堆中巴元,父節(jié)點(diǎn)的鍵值永遠(yuǎn)大于等于所有子節(jié)點(diǎn)的鍵值,根節(jié)點(diǎn)的鍵值最大驮宴。在最小堆中逮刨,父節(jié)點(diǎn)的鍵值永遠(yuǎn)小于等于所有子節(jié)點(diǎn)的鍵值,根節(jié)點(diǎn)的鍵值是最小的堵泽。
6修己、哈希:用于將任意長(zhǎng)度的數(shù)據(jù)映射到固定長(zhǎng)度的數(shù)據(jù)恢总。
算法
1、冒泡排序:通過(guò)與相鄰元素的比較和交換來(lái)把小的數(shù)交換到最前面睬愤。時(shí)間復(fù)雜度為O(n^2)
public status void BuddleSort(int array[],int length){
int temp;
for(int i;i<length-1;i++){
for(int j=length-1;j>i;j--){
if(array[j]<array[j-1]){
temp=array[j];
array[j]=array[j-1];
array[j-1]=temp;
}
}
}
}
2片仿、選擇排序:在長(zhǎng)度為N的無(wú)序數(shù)組中,第一次遍歷n-1個(gè)數(shù)尤辱,找到最小的數(shù)值與第一個(gè)元素交換砂豌。
public status void SelectSort(int array[],int length){
int temp;
for(int i=0;i<length-1;i++)
int minIndex=i;
for(int j=i+1;j<length;j++){
if(array[j]<array[minIndex]){
minIndex=j;
}
if(minIndex!=i){
temp=array[i];
array[i]=array[minIndexminIndex];
array[minIndex]=temp;
}
}
}
3、插入排序:在要排序的一組數(shù)中光督,假定前N-1個(gè)數(shù)已經(jīng)排好了奸鸯,現(xiàn)在將第N個(gè)數(shù)插入到前面的有序數(shù)列中,使得這N個(gè)數(shù)也是排好順序的可帽。
public status void InsertSort(int array[],int length){
int temp;
for(int i=0;i<length;i++){
for(int j=i+1;j>0;j--){
if(array[j]<array[j-1]){
temp=array[i];
array[i]=array[i-1];
array[i-1]=temp;
}
else{
break;
}
}
}
}