(一)Android面試題(一)Activity、Intent
Android四大組件分別是哪些?各自有什么作用和特點?
答:
活動(Activity):Activity是Android程序與用戶交互的窗口顽聂,是Android構造中最基本的一種,它需要為保持各界面的狀態(tài)盯仪,做很多持久化的事情紊搪,妥善管理生命周期以及一些跳轉(zhuǎn)邏輯。
服務(Service):后臺服務于Activity全景,封裝有一個完整的功能邏輯實現(xiàn)耀石,接受上層指令,完成相關的事務爸黄,定義好需要接受的Intent提供同步和異步接口娶牌。
內(nèi)容提供者(Content Provider):是Android提供的第三方應用數(shù)據(jù)的訪問方案,可以派生Content Provider類馆纳,對外提供數(shù)據(jù)诗良,可以像數(shù)據(jù)庫一樣進行選擇排序,屏蔽內(nèi)部數(shù)據(jù)的存儲細節(jié)鲁驶,向外提供統(tǒng)一的接口模型鉴裹,大大簡化上層應用,對數(shù)據(jù)的整合提供了更方便的途徑钥弯。
廣播接收器(BroadCast Receiver):接受一種或者多種Intent作觸發(fā)時間径荔,接受相關消息,做一些簡單處理脆霎,轉(zhuǎn)換成一條Notification总处,統(tǒng)一了Android的事件廣播模型。(如接受系統(tǒng)通知睛蛛,向通知欄發(fā)送消息)Activity的生命周期函數(shù)有哪些鹦马?點擊HOME鍵、BACK鍵等操作時忆肾,生命周期函數(shù)如何遷移荸频?
答:
onCreate // 創(chuàng)建Act實例時調(diào)用。通常進行一些數(shù)據(jù)的初始化客冈,比如獲取控件旭从、申請數(shù)組或集合的內(nèi)存、變量賦值
onRestart // Act停留在onStop但是沒有onDestory
onStart // 該方法在onCreate或者onRestart之后調(diào)用,調(diào)用之后和悦,Act進入可視生命周期
onResume // onStart之后調(diào)用退疫,調(diào)用該方法后Act進入活動(運行、前臺)狀態(tài)鸽素,可以和用戶進行交互蹄咖,比如響應用戶的輸入、點擊付鹿、觸摸等操作
onPause // 在onResume之后澜汤,調(diào)用該方法,此Act就不能繼續(xù)和用戶交互舵匾,用戶自定義的一些數(shù)據(jù)可以在此方法中進行保存
onStop // onPause之后進行調(diào)用俊抵,一旦調(diào)用onStop,Act就退出了可視狀態(tài)坐梯,但是Act實例并沒有銷毀
onDestroy // 此方法是在銷毀Act的時候調(diào)用徽诲,一旦調(diào)用表明該Act實例的生命周期就結束了,通常會在此方法做一些釋放資源的操作吵血,比如將引用變量值置為nullActivity的四種加載(啟動)模式分別是谎替?各自有什么特點?
答:
standard:特點是每一次啟動該Act時蹋辅,會重建一個新的該Act實例
singleTop:特點是每一次該Act時钱贯,檢查棧頂是否存在該Act的實例
存在:則直接重用該Act實例
不存在:則需要新建一個該Act的實例
singleTask:特點是每一次啟動該Act時,需要在棧中去檢查棧中是否存在該Act的實例
存在:
在棧頂:直接復用該Act的實例
不在棧頂:首先要把其上的Act實例移除掉侦另,使該Act的實例回到棧頂去秩命,然后再復用該Act的實例
不存在:新建一個該Act的實例
singleInstance:看進程中是否有該Act實例
存在:直接從該獨享棧中取出該Act的實例復用
不存在:新建一個棧,然后新建一個該Act的實例褒傅,放入該棧中
注意:如果把程序入口MainAct的Act設置為singleInstance時弃锐,通過該Act啟動了別的Act(SecondAct),再由其他 (SecondAct)啟動ThirdAct殿托,在ThirdAct中啟動MainAct霹菊,由MainAct再去啟動SecondAct時,不會產(chǎn)生第四個實例只是把MainAct所在的棧切換到SecondAct所在的棧支竹,把棧頂?shù)腁ct實例展示出來Activity意外退出時旋廷,如何進行數(shù)據(jù)保存和恢復?
答:
開發(fā)者提前可以復寫onSaveInstanceState方法唾戚,創(chuàng)建一個Bundle類型的參數(shù)柳洋,把數(shù)據(jù)存儲在這個Bundle對象中待诅,這樣即使Activity意外退出叹坦,Activity被系統(tǒng)摧毀,當重新啟動這個Activity而調(diào)用onCreate方法時卑雁,上述Bundle對象會作為參數(shù)傳遞給onCreate方法募书,開發(fā)者可以從Bundle對象中取出保存的數(shù)據(jù)绪囱,利用這些數(shù)據(jù)將Activity恢復到被摧毀之前的狀態(tài)。Intent是什么莹捡?有什么用處鬼吵?
答:
Intent(意圖):作用是調(diào)用某個組件去做一個事情,它既能充當橋梁的角色篮赢,也能傳遞數(shù)據(jù)齿椅。Intent如何傳值?Bundle是什么启泣,有什么用涣脚?
答:Intent的傳值:通過Intent類提供的setData和putExtra方法傳遞。
Bundle(捆):
兩個Activity之間的通訊可以通過bundle類來實現(xiàn)寥茫,把要傳遞的數(shù)據(jù)通過key-value的形式加入數(shù)據(jù)遣蚀,另外一個Activity里面取出數(shù)據(jù)時,用key找出對應的valueonCreate(Bundle savedInstanceState)中savedInstanceState有什么用纱耻,什么情況下為null?
答:
savedInstanceState:是用來保存實例狀態(tài)的芭梯。在Activity中有一個onSaveInstanceStata方法,可以用來存放數(shù)據(jù)弄喘,避免Activity意外退出時保存需要的數(shù)據(jù)玖喘,通過onCreate中savedInstanceState取出保存的數(shù)據(jù),默認不重寫時為null如何實現(xiàn)使用Intent來傳遞自定義對象?
答:
序列化要傳遞的自定義的對象蘑志,再通過Bundle來傳值芒涡。
(序列化:將對象的狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程)
與序列化相對的是反序列化,它將流轉(zhuǎn)換為對象卖漫。
通過序列化和反序列化就可以實現(xiàn)存儲和傳輸數(shù)據(jù)费尽。
(二)Android面試題(二)OOM、ANR
什么是OOM羊始?如何避免OOM旱幼?
OOM概念:內(nèi)存溢出(OutOfMemor),內(nèi)存占有量超過了JVM分配的最大內(nèi)存突委。
避免OOM:
<1.避免對activity的超過生命周期的引用(盡量使用application代替activity)柏卤。
因為程序一般是由很多個Activity構成的,從一個Activity跳轉(zhuǎn)了以后匀油,
系統(tǒng)就有可能回收這個Activity的各種內(nèi)存占用缘缚。可是此時如果你的一些不可回收變量(比如靜態(tài)變量)保持了對此Activity對象的引用敌蚜,
那么GC就不會對此Activity進行回收桥滨,無故占用了大量的內(nèi)存。這種情況最好的辦法就是用application代替activity。
用Context.getApplicationContext() 或者 Activity.getApplication()可以很方便的得到application對象齐媒。
<2.在展示高分辨率圖片時蒲每,先將圖片進行壓縮到與空間大小相近。
<3.及時釋放不使用的Bitmap,動態(tài)回收內(nèi)存喻括,方法:bitmap.recycle()邀杏。
<4.對適配器視圖進行優(yōu)化處理,避免過多加載數(shù)據(jù)和對象的生成唬血。什么是ANR望蜡?產(chǎn)生ANR的原因是什么?如何避免ANR的發(fā)生拷恨?
ANR概念:
應用程序無響應(application not response)泣特。
原因:
主線程中做了非常耗時的操作。
解決辦法:
<1.運行在主線程里的任何方法都盡可能少做事情,盡量用Handler來處理UIthread和別的thread之間的交互;
<2.應用程序應該避免在BroadcastReceiver里做耗時的操作或計算;
<3.避免在Intent Receiver里啟動一個Activity挑随,因為它會創(chuàng)建一個新的畫面状您,并從當前用戶正在運行的程序上搶奪焦點;
<4.在主線程中更新UI。
(三)Android面試題(三)四大組件
什么是Service?Service和Activity有什么區(qū)別兜挨?
答:Service是提供服務的代碼膏孟,這些代碼最終體現(xiàn)為一個個的接口函數(shù),所以拌汇,Service就是實現(xiàn)一組函數(shù)的對象柒桑,通常也稱為組件。
區(qū)別:
①從設計的角度來講:
Android的Activity的設計與Web頁面非常類似噪舀,從頁面的跳轉(zhuǎn)通過連接魁淳,以及從頁面的定位通過URL,從每個頁面的獨立封裝等方面都可以看出來与倡,它主要負責與用戶進行交互界逛。
Service則是在后臺運行,默默地為用戶提供功能纺座,進行調(diào)度和統(tǒng)籌息拜,如果一棵樹的地上部分是Activity的話,它龐大的根須就是Service净响。Android的服務組件沒有運行在獨立的進程或線程中少欺,它和其他的組件一樣也在應用的主線程中運行,如果服務組件執(zhí)行比較耗時的操作就會導致主線程阻塞或者假死馋贤,從而無法響應用戶的操作赞别。
②從使用的角度來講:
Service不僅可以給Activity建立雙向連接,為Activity提供數(shù)據(jù)和功能支持配乓,也可以單向接受Intent的請求仿滔,進行數(shù)據(jù)的分析處理和功能調(diào)度惠毁。
③從扮演的角色來講:
Activity的功能比較單一,主要就是顯示應用所具有的一些功能堤撵,幫助用戶與應用進行交互仁讨,像一個人的臉羽莺。而Service可能扮演功能調(diào)度者也能扮演功能提供者实昨,從觸發(fā)器收集信息進行分析和處理,然后更新界面盐固,修改數(shù)據(jù)或進行其他操作時是一個功能調(diào)度者荒给,從輸入法的選擇考慮Service扮演的就是一個功能提供者。View組件是Android中用戶能夠?qū)崒嵲谠诳吹降牟糠值蟛罚绨粹o志电,輸入框等就是繼承自這個類,View只有裝入Activity這樣的容器中才有意義蛔趴,而反過來
Activity裝入了這些View后才能夠成功完成與用戶交互的任務挑辆,但是Service不需要這些花哨的東西,只需要默默地等待事件發(fā)生或者聽候差遣孝情。Service的兩種使用方式分別是什么鱼蝉?它們的生命周期分別怎樣遷移?
答:
方式1:通過startService箫荡,Service會經(jīng)歷onCreate->onStart魁亦,stopService的時候直接onDestroy
方式二:通過bindService,Service只會運行onCreate羔挡,這個時候TestServiceHolder和TestService綁定在一起洁奈,TestServiceHolder退出了,Srevice就會調(diào)用onUnbind->onDestroyed什么是AIDL绞灼?AIDL的作用是什么利术?它的基本使用流程是怎么樣的?
答:AIDL是一種android內(nèi)部進程通信接口的描述語言低矮,通過它我們可以定義進程間的通信接口
作用:
1氯哮、多個應用程序之間建立共同的服務機制;
2商佛、通過AIDL在不同應用程序之間達到數(shù)據(jù)的共享和數(shù)據(jù)相互操作喉钢;
3、主要是用于多應用之間的數(shù)據(jù)交互(而 在單個應用內(nèi)或者說該應用如果不需要和其它第三方應用進行交互則不需要實現(xiàn)aidl接口)良姆;
流程:
1肠虽、編寫aidl文件
2、編寫自己的Service
3玛追、在自己的Service的onBind方法中,將aidl文件生成的類中的Stud的子類返回(需要繼承Stud重寫接口方法)
4税课、在AndroidManifest.xml中配置你的Service類,示例 注意:service android:name="com.aidl.SerachService"中,android:name屬性必須填寫你的Service的名字,包括包名,不能寫aidl生成的類的名字,因為那不是個Servic
5闲延、編寫調(diào)用aidl服務的客戶端
6、把之前編寫的aidl文件(注意不是生成的java文件)和它的包目錄拷貝到客戶端的src目錄中
7韩玩、在需要的地方用一下方法綁定,new Intent構造器中的action填寫的就是之前<action android:name="com.aidl.ISerachService" />中的android:name的字符串什么是BroadcastReceiver垒玲?它有什么作用?
答:BroadcastReceiver是Android四大組件之一找颓,本質(zhì)是一種 全局的監(jiān)聽器合愈,用于監(jiān)聽系統(tǒng)全局的廣播消息。因此它可以非常方便的實現(xiàn)不同組件之間的通信击狮。
作用:通過該機制佛析,使得消息能在各個組件間、各個進程間傳遞彪蓬,起到郵遞員的作用寸莫。什么是有序廣播?有序廣播有什么特點档冬?什么是系統(tǒng)廣播膘茎?
有序廣播:是通過Context.sendOrderedBroadcast來發(fā)送。所有的receiver依次執(zhí)行酷誓。
有序廣播特點即從優(yōu)先級別最高的廣播接收器開始接收披坏,接收完了如果沒有丟棄,就下傳給下一個次高優(yōu)先級別的廣播接 收器進行處理呛牲,依次類推刮萌,直到最后。
系統(tǒng)廣播:當系統(tǒng)發(fā)生事件時娘扩,就會發(fā)送出廣播着茸,通過廣播中的關鍵字段,系統(tǒng)將尋找所有關注這個廣播的應用琐旁,并觸發(fā)他們注冊的Receiver什么是粘性廣播涮阔?它跟普通廣播有什么區(qū)別?
定義:沒有注冊的接收者灰殴,在后來注冊后也能收到廣播敬特,進程間通信
當發(fā)布該廣播后它還駐留在周圍,它可以讓其他接收者迅速的檢索到數(shù)據(jù)牺陶,通過一個方法的(動態(tài)注冊接收者方法)返回值 這個返回值就是意圖
粘性廣播的特點是Intent會一直保留到廣播事件結束伟阔,而這種廣播也沒有所謂的10秒限制,10秒限制是指普通的廣播如果onReceive方法執(zhí)行時間太長掰伸,超過10秒的時候系統(tǒng)會將這個廣播置為可以干掉的candidate皱炉,一旦系統(tǒng)資源不夠的時候,就會干掉這個廣播而讓它不執(zhí)行狮鸭。什么是ContentProvider合搅?如何自定義一個ContentProvider多搀?
ContentProvider(內(nèi)容提供者)是Android中的四大組件之一。主要用于對外共享數(shù)據(jù)灾部,也就是通過ContentProvider把應用中的數(shù)據(jù)共享給其他應用訪問康铭,其他應用可以通過ContentProvider對指定應用中的數(shù)據(jù)進行操作。
1)ContentProvider為存儲和獲取數(shù)據(jù)提供了統(tǒng)一的接口赌髓。ContentProvide對數(shù)據(jù)進行封裝从藤,不用關心數(shù)據(jù)存儲的細節(jié)。使用表的形式來組織數(shù)據(jù)春弥。
2)使用ContentProvider可以在不同的應用程序之間共享數(shù)據(jù)呛哟。
總的來說使用ContentProvider對外共享數(shù)據(jù)的好處是統(tǒng)一了數(shù)據(jù)的訪問方式叠荠。
自定義ContentProvider:
編寫一個類匿沛,必須繼承自ContentProvider類;
實現(xiàn)ContentProvider類中的所有的抽象方法榛鼎;
onCreate();getType();query();Insert();update();delete();等方法
在清單文件中聲明注冊ContentProvider
<provider android:name=".MyWordsprovider"
android:authorities="heying.provider.wordsconetenprovider"
android:exported="true"
/>
將Uri提供出去你使用過哪些系統(tǒng)的ContentProvider逃呼?
媒體庫、通訊錄等
(四)Android面試題(四)數(shù)據(jù)保存和網(wǎng)絡
常用的數(shù)據(jù)持久化(長久保存數(shù)據(jù))方式有哪些者娱?
答:
1抡笼、SharedPreference,共享參數(shù)形式,一種以Key-Value的鍵值對形式保存數(shù)據(jù)的方式黄鳍,Android內(nèi)置的推姻,一般應用的配置信息 ,推薦使用此種方式保存框沟,不能存文件也不適合藏古。其存儲的位置在/data/data/packageName/shared_prefs文件夾下面。
2忍燥、Internal Storage:把數(shù)據(jù)存儲到手機內(nèi)部的存儲空間拧晕,主要用來保存私有數(shù)據(jù)/data/data/packageName/files文件夾下 面
3、External Storage:把數(shù)據(jù)存儲到手機的外部存儲SD卡中梅垄,主要用來保存非私有和大型數(shù)據(jù)厂捞,它有應用程序?qū)S玫奈募A ,也有所有程序公用的文件夾(這個文件夾不會隨著應用程序的卸載而卸載)队丝,需要賦予應用程序訪問Sdcard的權限靡馁,Android的權限 控制尤為重點,在Android程序中机久,如果需要做一些越界的操作臭墨,均需要對其進行授權才可以訪問。在AndroidManifest.xml中添加代碼 :<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4吞加、SQLite Databases:以表格形式存儲信息的一個輕量級的小型數(shù)據(jù)庫
5裙犹、Network Connection:將數(shù)據(jù)存儲到網(wǎng)絡服務器上
6尽狠、ContentProvider:他提供一種方式實現(xiàn)兩個不同應用程序之間的通訊ShareedPrefrence的讀寫數(shù)據(jù)的基本方法?
答:它保存的數(shù)據(jù)主要是簡單類型的Key-value對叶圃。并且Value部分只能是一些基本數(shù)據(jù)類型:boolean袄膏、float、int掺冠、long沉馆、String等 。
1德崭、得到SharedPreference對象的方法有:
a斥黑、Context類中的getSharedPreference(String name,int mode)方法眉厨,name :存儲的文件名锌奴,如果不存在會自動創(chuàng)建一個 mode:訪問模式,一般有兩個參數(shù)MODE_PRIVTE(私有憾股,只有當前應用程序才能進行讀寫)和MODE_MULTI_PROCESS(多個進程對同一個文件進行讀寫)
b鹿蜀、Activity類中的getSharedPreference(int mode)方法,自動將當前活動的類名作為文件名
c服球、PreferenceManager類的getDefaultSharedPreferences(Context context)方法茴恰,這是一個靜態(tài)方法,接收Context參數(shù)斩熊,會自動將應用程序的包名作為前綴去命名文件
2往枣、讀常用方法:
a、boolean contains(String Key):判斷SharedPreferences是否包含特定Key的數(shù)據(jù)
b粉渠、abstract Map<String,?> getAll():獲取SharedPreferences數(shù)據(jù)里全部的Key-Value對分冈。
c、 boolean getXxx(String key,Xxx defValue):獲取SharedPreferences數(shù)據(jù)里指定Key對應的value渣叛。如果該Key不存在丈秩,返回默認值defValue。
3淳衙、寫常用方法(通過SharedPreferences的內(nèi)部接口Editor實現(xiàn)蘑秽,edit()方法即可得到Editor對象)
a、abstract SharedPreferences.Editor clear():清空SharedPreferences里所有的數(shù)據(jù)
b箫攀、abstract SharedPreferences.Editor putXxx(String key,xxx value):向SharedPreferences中插入指定的Key-Value對肠牲。
c、abstract SharedPreferences.Editor remove(String key):從SharedPreferences中移除指定Key的數(shù)據(jù)靴跛。
d缀雳、boolean commit():當Editor編輯完成后,調(diào)用該方法提交修改梢睛,切記不可忘記調(diào)用此方法肥印,否則不能儲存數(shù)據(jù)SQLite的基本語句:建表识椰、增刪改查分別是怎么樣的?
答:
建表:
CREATE TABLE tableName(column1 INTEGER PRIMARY KEY AUTOINCREMENT深碱,column2 VARCHAR(num)腹鹉,.....);
添加:
INSERT INTO tableName values(value1敷硅,value2)功咒;添加所有字段
INSERT INTO tableName(column1,column2) values(value1绞蹦,value2)力奋;添加字段column1和字段column2
刪除:
DELETE TABLE tableName 刪除全部
DELETE form tableName WHERE column2 = vaule2按條件查詢(字段column2的值為vaule2的這一行,如果value2為字符串則需要用單引號括起來)
更新:
UPDATE tableName SET column1 = value1, column2 = value2,...幽七;所有數(shù)據(jù)都這樣更新
UPDATE tableName SET column1 = value1, column2 = value2 WHERE column3 = value3景殷;更新column3 = value3這一行的column1 和column2的值
查詢:
SELECT * FROM tableName;查詢所有的數(shù)據(jù)
SELECT column1锉走,column3 FROM tableName滨彻; 查詢所有數(shù)據(jù)藕届,但是只顯示column1挪蹭,column3這兩個字段的所有值
SELECT * FROM tableName WHERE column2 > someValue;查詢column2字段的值大于someValue的所有字段
SELECT * FROM tableName WHERE column1 = value1 ORDER BY column2 ASC休偶;按條件查詢結果以column2 的升序排列
SELECT * FROM tableName WHERE column1 = value1 ORDER BY column2 DESC梁厉;按條件查詢結果以column2 的降序排列
SELECT * FROM tableName WHERE column2 LIKE '%key%' ORDER BY column2 ASC;// 模糊查找SQLiteOpenHelper的作用是什么?
答:SQLiteOpenHelper主要是用來創(chuàng)建數(shù)據(jù)庫和表格踏兜,以及為數(shù)據(jù)庫升級的作用词顾。在Android系統(tǒng)中,既然可以通過Context類的 openOrCreateDatabase()函數(shù)打開或創(chuàng)建SQLite數(shù)據(jù)庫碱妆,并且可以通過其返回值(即SQLiteDatabase對像)調(diào)用execSQL()函數(shù)對數(shù)據(jù) 庫做任何的操作(CRUD)肉盹,那么還需要SQLiteOpenHelper這個類有什么意義呢?
例如:
db = openOrCreateDatabase(DB_NAME, this.MODE_PRIVATE, null);
db.execSQL("DROP TABLE IF EXISTS students");
db.execSQL("CREATE TABLE IF NOT EXISTS students (_id INTEGER PRIMARY KEY AUTOINCREMENT, name, age INTEGER)");
實際上疹尾,直接操作數(shù)據(jù)庫的語句和其他的語句混在一起上忍,不利于程序的模塊化。而SQLiteOpenHelper是一個抽象類纳本,通過它的名字可以 看出來窍蓝,是一個幫我們打開數(shù)據(jù)庫的小助手:
1、當new SQLiteOpenHelper子類對象時繁成,就會通過其構造函數(shù)創(chuàng)建數(shù)據(jù)庫文件(當然如果數(shù)據(jù)庫如果存在吓笙,就不用創(chuàng)建了, 并且自動調(diào)用onCreate(SQLiteDatabase db)創(chuàng)建數(shù)據(jù)表巾腕;
2面睛、當要對數(shù)據(jù)庫讀操作時絮蒿,只需調(diào)用其子類的getReadableDatabase()返回SQLiteDatabase實例,通過該實例來執(zhí)行SQL語句 叁鉴;
3歌径、當要對數(shù)據(jù)庫寫操作時,只需調(diào)用其子類的getWritableDatabase()返回SQLiteDatabase實例亲茅,通過該實例來執(zhí)行SQL語句 回铛;
4、當通過構造函數(shù)傳進來的數(shù)據(jù)庫版本高于之前的版本時克锣,系統(tǒng)會調(diào)用onUpgrade()函數(shù)來更新數(shù)據(jù)庫茵肃。
于是,對APP而言袭祟,就屏蔽了數(shù)據(jù)庫創(chuàng)建的過程验残,將數(shù)據(jù)表的創(chuàng)建獨立出來了。
SQLiteOpenHelper只是一個數(shù)據(jù)庫管理的幫助類巾乳,讓使用者不直接操作數(shù)據(jù)庫而是通過操作這個類的對象來實現(xiàn)各種數(shù)據(jù)庫操作您没。這個 類就是給數(shù)據(jù)庫操作搭了個架子,使用者根據(jù)需求去填充那些架子胆绊。什么是回調(diào)CallBack氨鹏,回調(diào)的作用是什么?常見的回調(diào)使用場景压状?
答:把接口方法的定義和調(diào)用給封裝起來仆抵,然后在回調(diào)接口中的回調(diào)方法中進行具體的操作
作用:
1、可以節(jié)省時間种冬,充分利用了資源
2镣丑、讓工具類的使用變得簡單易用。用戶不需要關心接口方法的定義以及調(diào)用娱两,只需要關注方法的具體實現(xiàn)功能即可莺匠。
使用場景:
1、事件監(jiān)聽器十兢,這其實就是回調(diào)最常見的應用場景之一
2趣竣、生命周期函數(shù)
3、當方法的具體實現(xiàn)不確定的時候可以設置回調(diào)函數(shù)讓清楚的人自己去實現(xiàn)纪挎,而我們只是提供一個實現(xiàn)的接口出去期贫,而其它的別人不需要知道的東西都封存起來,這也體現(xiàn)了封裝和面向?qū)ο蟮乃枷胍彀溃銌栁覇栴}通砍,而我想到了答案告訴你,至于 你拿到答案后干什么,我怎么想到的答案都不需要對方知道TCP和UDP的區(qū)別是什么封孙?
答:
TCP :傳輸控制協(xié)議迹冤。
a、面向連接虎忌,靠三次握手來完成
b泡徙、速度相對較慢,因為連接的過程會耗時間和資源
c膜蠢、可靠的協(xié)議堪藐,數(shù)據(jù)不會丟失
d、數(shù)據(jù)大小沒有限制
e挑围、耗用系統(tǒng)資源相對較多
UDP :用戶數(shù)據(jù)報文協(xié)議
a礁竞、面向無連接的
b、高效的杉辙、速度快
c模捂、不可靠的協(xié)議,容易丟失數(shù)據(jù)
d蜘矢、數(shù)據(jù)包大小有限制狂男,小于64K
e、耗用系統(tǒng)資源相對較少Http的get和post方法的區(qū)別什么品腹?
答:get方法:
原理上:
主要用來獲取或者查詢資源信息岖食,是安全的和冪等的。就是說不修改信息
表面上:
a珍昨、GET請求的數(shù)據(jù)會附在URL之后(就是把數(shù)據(jù)放在HTTP協(xié)議頭中)县耽,以?分割URL和傳輸數(shù)據(jù)镣典,參數(shù)之間以&相連
b、GET方式提交的數(shù)據(jù)較型偾怼(瀏覽器和操作系統(tǒng)對URL長度的限定)兄春,一般1024字節(jié)
c、GET的安全性相對較弱贿衍,可能會造成信息泄露(信息會明文出現(xiàn)在URL上圾亏,其他人可能會通過瀏覽器的緩存查看到歷史記錄敛腌,從而得到信息)
d、服務器端用Request.QueryString獲取變量的值
e芜茵、GET請求用起來比比較方便
post方法:
原理上:
根據(jù)Http規(guī)范,POST表示可能修改服務器上資源的請求
表面上:
a倡蝙、POST請求把要提交的數(shù)據(jù)放在HTTP包的包體中九串。
b、POST可以提交較大量的數(shù)據(jù)(受到服務器的處理程序的處理能力限制)
c、POST安全性較高(數(shù)據(jù)不會明文出現(xiàn)在URL上)猪钮。
d品山、服務器端用Request.Form獲取提交的數(shù)據(jù)。
e烤低、用起來相對麻煩一點
(五)Android面試題(五)常見的異步方式
常見的實現(xiàn)異步的方式有哪些肘交?
AsyncTask、Thread+Handler常見的耗時操作如何處理扑馁?
常見的耗時操作有:網(wǎng)絡請求涯呻、數(shù)據(jù)庫操作、比較復雜的運算腻要,使用AsyncTask或Thread+Handler進行異步處理子線程更新UI的基本方法有哪些魄懂?
a. Thread + Handler的方式
在非UI線程中執(zhí)行耗時操作(網(wǎng)絡請求、數(shù)據(jù)庫操作闯第、比較復雜的運算)市栗,在需要將操作的進度或者結果更新到UI上時,
就發(fā)送消息并攜帶數(shù)據(jù)咳短,最終由Handler的handleMessage來處理(注意:Handler對象必須是創(chuàng)建在UI線程中)
b. Activity提供的一個簡便的方式來更新UI
runOnUiThread(Runnable r);
內(nèi)部做了判斷當前的活動線程是否是UI線程
是:直接調(diào)用run方法
否:將Runnable給post到UI線程對應的消息隊列
c. Handler里邊也提供簡便的更新UI的方式
handler.post(Runnable r);
內(nèi)部其實調(diào)用了發(fā)送消息的方法填帽,最終也是把Runnable對象給放到了UI線程中執(zhí)行Handler、Looper咙好、Message篡腌、MessageQueue是什么?它們之間有什么關聯(lián)勾效?
Handler:基本功能兩個嘹悼,發(fā)送和處理消息
發(fā)消息:sendXXXX方法
a. 如果不需要通過消息來傳遞具體的數(shù)據(jù),可以發(fā)送空消息
sendEmptyMessage(what);即時消息层宫,立即發(fā)送
sendEmptyMessageDelayed(what杨伙,time);發(fā)送一個延遲消息,在從當前計時到指定時間長度后發(fā)送
sendEmptyMessageAtTime(what, atTime);發(fā)送一個定時的消息萌腿,在指定時刻發(fā)出
b. 如果需要在線程間傳遞一些具體的數(shù)據(jù)限匣,需要發(fā)送帶有具體消息對象的消息
消息對象的獲取:
Message msg = new Message(); // 每一次都新創(chuàng)建一個消息對象
Message msg = handler.obtainMessage();// 每次調(diào)用時會去檢查消息池中是否有可復用的消息毁菱。有則復用米死,無則創(chuàng)建。
Message msg = Message.obtain(); // 每次調(diào)用時會去檢查消息池中是否有可復用的消息贮庞。有則復用峦筒,無則創(chuàng)建。
c. Message都有哪些傳遞數(shù)據(jù)的方式:
what:int窗慎,用于區(qū)分消息從哪里發(fā)出
arg1:int物喷,可以攜帶一個int數(shù)據(jù)
arg2:int,也可以攜帶一個int數(shù)據(jù)
obj:Object,可以攜帶任何的對象
d. 帶數(shù)據(jù)的消息發(fā)送也可以有即時脯丝、延遲商膊、定時
處理消息:handleMessage里邊實現(xiàn)接收到消息之后需要實現(xiàn)的操作,需要注意的是該方法是覆蓋父類Handler的
Message:消息對象宠进,用來傳遞具體的數(shù)據(jù)的晕拆。
MessageQueue:消息隊列,是一種數(shù)據(jù)結構材蹬,特點是符合FIFO实幕,先進先出,由一個或多個消息對象構成的一個隊列
Looper:循環(huán)的意思堤器,作用就是管理消息隊列昆庇,比如說從隊列中取出消息交給對應的Handler進行處理AsyncTask中幾個回調(diào)方法運行在哪個線程、DoInBackGround執(zhí)行在哪個線程闸溃?
4個回調(diào)方法整吆,其中三個運行在主線程(初始化,UI更新辉川,進度條更新)表蝙,DoInBackGround運行在子線程runOnUiThread為什么可以用來更新UI?
該方法內(nèi)部做了判斷當前線程是否為UI線程的操作
不是UI線程則將該action添加到mHandler所在的UI線程的消息隊列中
是UI線程乓旗,則直接執(zhí)行使用Handler+Thread的方式在子線程更新UI時府蛇,Handler對象可以在子線程中創(chuàng)建嗎?
不能屿愚,只能在主線程創(chuàng)建汇跨,再傳到子線程中
- Handler的post方法為什么可以用來更新UI?
該方法內(nèi)部實際上是發(fā)送一個延遲的消息給該線程的Handler處理妆距,該方法內(nèi)部將消息對象加入了消息隊列穷遂,
最終也是把Runnable對象給放到了UI線程中執(zhí)行
如果是更新UI,則這個Handler對象必須創(chuàng)建在UI線程中
(六)Android面試題(六)JSON毅厚、XML塞颁、MediaPlay生命周期
JSON中有幾種數(shù)據(jù)類型,解析對應數(shù)據(jù)類型分別用哪個類吸耿?
四種類型:
第一種類型是標量(scalar),也就是一個單獨的字符串(string)或數(shù)字(numbers)酷窥,
比如"北京"這個單獨的詞咽安。
第二種類型是序列(sequence),也就是若干個相關的數(shù)據(jù)按照一定順序并列在一起蓬推,
又叫做數(shù)組(array)或列表(List)妆棒,比如"北京,上海"。對應JSONAray糕珊;
第三種類型是映射(mapping)动分,也就是一個名/值對(Name/value),即數(shù)據(jù)有一個名稱红选,
還有一個與之相對應的值澜公,這又稱作散列(hash)或字典(dictionary)。對應String喇肋;
第四種坟乾,類似于Java中的類,對應JSONObject蝶防。有哪些方式可以做JSON數(shù)據(jù)的解析甚侣?
兩種解析方式:
1)JSON普通解析方式,運用
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;對象來解析间学;
2)運用gson-2.1.jar包下的Gson類和與之Json數(shù)據(jù)相對應的Translate類來解析:創(chuàng)建Gson對象殷费,調(diào)用它的fromjson方法有哪些方式可以做XML數(shù)據(jù)解析?
DOM在處理XML文件時低葫,將XML文件解析成樹狀結構并放入內(nèi)存中進行處理详羡。
SAX則是以事件作為解析XML文件的模式,它將XML文件轉(zhuǎn)化成一系列的事件氮采,由不同的事件處理器來決定如何處理殷绍。
XML文件較大時,選擇SAX技術是比較合理的鹊漠。
XML pull通過循環(huán)驅(qū)動事件來解析:判斷事件的類型主到,獲取事件中的內(nèi)容
對于XML文檔較大但只需要文檔的一部分時,XML Pull解析器則是更為有效的方法躯概。請闡述一種XML解析方式的基本流程登钥。
1. 獲取解析器對象XmlPullParser對象parser
2. 可以給parser對象設置輸入的編碼方式
3. 循環(huán)驅(qū)動事件進行解析
事件分為4類:
a. 開始文檔:XmlPullParser.START_DOCUMENT值為0
b. 結束文檔:XmlPullParser.END_DOCUMENT值為1
c. 開始標簽:XmlPullParser.START_TAG值為2
d. 結束標簽:XmlPullParser.END_TAG值為3
一個事件處理完畢之后,需要提供parser的next方法去驅(qū)動下一個事件自定義View有哪幾種方式娶靡?
自繪控件牧牢、組合控件、以及繼承控件姿锭。MediaPlayer的生命周期是怎樣的塔鳍?
1.Idle 狀,2.End 狀態(tài)呻此,3.Initialized 狀態(tài)轮纫,4.Prepared 狀態(tài),5.Preparing 狀態(tài)焚鲜,6.Started 狀態(tài)掌唾,7.Paused 狀態(tài)放前,8.Stop 狀態(tài),9.PlaybackCompleted狀態(tài)糯彬,10.Error狀態(tài)請闡述圖片加載的基本流程及優(yōu)化方案凭语。
通過HttpURLConnection c_onn = (HttpURLConnection) url.openConnection()
取得圖片鏈接,通過InputStream in = conn.getInputStream()取得圖片圖片io流
取得Bitmap圖片撩扒。
通過LuraCache來優(yōu)化圖片緩存