Android面試題分享匯總

(一)Android面試題(一)Activity、Intent

  1. 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ā)送消息)

  2. 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實例的生命周期就結束了,通常會在此方法做一些釋放資源的操作吵血,比如將引用變量值置為null

  3. Activity的四種加載(啟動)模式分別是谎替?各自有什么特點?
    答:
    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實例展示出來

  4. 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)。

  5. Intent是什么莹捡?有什么用處鬼吵?
    答:
    Intent(意圖):作用是調(diào)用某個組件去做一個事情,它既能充當橋梁的角色篮赢,也能傳遞數(shù)據(jù)齿椅。

  6. Intent如何傳值?Bundle是什么启泣,有什么用涣脚?
    答:Intent的傳值:通過Intent類提供的setData和putExtra方法傳遞。
    Bundle(捆):
    兩個Activity之間的通訊可以通過bundle類來實現(xiàn)寥茫,把要傳遞的數(shù)據(jù)通過key-value的形式加入數(shù)據(jù)遣蚀,另外一個Activity里面取出數(shù)據(jù)時,用key找出對應的value

  7. onCreate(Bundle savedInstanceState)中savedInstanceState有什么用纱耻,什么情況下為null?
    答:
    savedInstanceState:是用來保存實例狀態(tài)的芭梯。在Activity中有一個onSaveInstanceStata方法,可以用來存放數(shù)據(jù)弄喘,避免Activity意外退出時保存需要的數(shù)據(jù)玖喘,通過onCreate中savedInstanceState取出保存的數(shù)據(jù),默認不重寫時為null

  8. 如何實現(xiàn)使用Intent來傳遞自定義對象?
    答:
    序列化要傳遞的自定義的對象蘑志,再通過Bundle來傳值芒涡。
    (序列化:將對象的狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程)
    與序列化相對的是反序列化,它將流轉(zhuǎn)換為對象卖漫。
    通過序列化和反序列化就可以實現(xiàn)存儲和傳輸數(shù)據(jù)费尽。

(二)Android面試題(二)OOM、ANR

  1. 什么是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ù)和對象的生成唬血。

  2. 什么是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面試題(三)四大組件

  1. 什么是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ā)生或者聽候差遣孝情。

  2. Service的兩種使用方式分別是什么鱼蝉?它們的生命周期分別怎樣遷移?
    答:
    方式1:通過startService箫荡,Service會經(jīng)歷onCreate->onStart魁亦,stopService的時候直接onDestroy
    方式二:通過bindService,Service只會運行onCreate羔挡,這個時候TestServiceHolder和TestService綁定在一起洁奈,TestServiceHolder退出了,Srevice就會調(diào)用onUnbind->onDestroyed

  3. 什么是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的字符串

  4. 什么是BroadcastReceiver垒玲?它有什么作用?
    答:BroadcastReceiver是Android四大組件之一找颓,本質(zhì)是一種 全局的監(jiān)聽器合愈,用于監(jiān)聽系統(tǒng)全局的廣播消息。因此它可以非常方便的實現(xiàn)不同組件之間的通信击狮。
    作用:通過該機制佛析,使得消息能在各個組件間、各個進程間傳遞彪蓬,起到郵遞員的作用寸莫。

  5. 什么是有序廣播?有序廣播有什么特點档冬?什么是系統(tǒng)廣播膘茎?
    有序廣播:是通過Context.sendOrderedBroadcast來發(fā)送。所有的receiver依次執(zhí)行酷誓。
    有序廣播特點即從優(yōu)先級別最高的廣播接收器開始接收披坏,接收完了如果沒有丟棄,就下傳給下一個次高優(yōu)先級別的廣播接 收器進行處理呛牲,依次類推刮萌,直到最后。
    系統(tǒng)廣播:當系統(tǒng)發(fā)生事件時娘扩,就會發(fā)送出廣播着茸,通過廣播中的關鍵字段,系統(tǒng)將尋找所有關注這個廣播的應用琐旁,并觸發(fā)他們注冊的Receiver

  6. 什么是粘性廣播涮阔?它跟普通廣播有什么區(qū)別?
    定義:沒有注冊的接收者灰殴,在后來注冊后也能收到廣播敬特,進程間通信
    當發(fā)布該廣播后它還駐留在周圍,它可以讓其他接收者迅速的檢索到數(shù)據(jù)牺陶,通過一個方法的(動態(tài)注冊接收者方法)返回值 這個返回值就是意圖
    粘性廣播的特點是Intent會一直保留到廣播事件結束伟阔,而這種廣播也沒有所謂的10秒限制,10秒限制是指普通的廣播如果onReceive方法執(zhí)行時間太長掰伸,超過10秒的時候系統(tǒng)會將這個廣播置為可以干掉的candidate皱炉,一旦系統(tǒng)資源不夠的時候,就會干掉這個廣播而讓它不執(zhí)行狮鸭。

  7. 什么是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提供出去

  8. 你使用過哪些系統(tǒng)的ContentProvider逃呼?
    媒體庫、通訊錄等

(四)Android面試題(四)數(shù)據(jù)保存和網(wǎng)絡

  1. 常用的數(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)兩個不同應用程序之間的通訊

  2. 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ù)

  3. 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;// 模糊查找

  4. 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ù)需求去填充那些架子胆绊。

  5. 什么是回調(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ū)ο蟮乃枷胍彀溃銌栁覇栴}通砍,而我想到了答案告訴你,至于 你拿到答案后干什么,我怎么想到的答案都不需要對方知道

  6. 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)資源相對較少

  7. 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面試題(五)常見的異步方式

  1. 常見的實現(xiàn)異步的方式有哪些肘交?
    AsyncTask、Thread+Handler

  2. 常見的耗時操作如何處理扑馁?
    常見的耗時操作有:網(wǎng)絡請求涯呻、數(shù)據(jù)庫操作、比較復雜的運算腻要,使用AsyncTask或Thread+Handler進行異步處理

  3. 子線程更新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í)行

  4. 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進行處理

  5. AsyncTask中幾個回調(diào)方法運行在哪個線程、DoInBackGround執(zhí)行在哪個線程闸溃?
    4個回調(diào)方法整吆,其中三個運行在主線程(初始化,UI更新辉川,進度條更新)表蝙,DoInBackGround運行在子線程

  6. runOnUiThread為什么可以用來更新UI?
    該方法內(nèi)部做了判斷當前線程是否為UI線程的操作
    不是UI線程則將該action添加到mHandler所在的UI線程的消息隊列中
    是UI線程乓旗,則直接執(zhí)行

  7. 使用Handler+Thread的方式在子線程更新UI時府蛇,Handler對象可以在子線程中創(chuàng)建嗎?
    不能屿愚,只能在主線程創(chuàng)建汇跨,再傳到子線程中

  1. Handler的post方法為什么可以用來更新UI?
    該方法內(nèi)部實際上是發(fā)送一個延遲的消息給該線程的Handler處理妆距,該方法內(nèi)部將消息對象加入了消息隊列穷遂,
    最終也是把Runnable對象給放到了UI線程中執(zhí)行
    如果是更新UI,則這個Handler對象必須創(chuàng)建在UI線程中

(六)Android面試題(六)JSON毅厚、XML塞颁、MediaPlay生命周期

  1. 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蝶防。

  2. 有哪些方式可以做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方法

  3. 有哪些方式可以做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解析器則是更為有效的方法躯概。

  4. 請闡述一種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ū)動下一個事件

  5. 自定義View有哪幾種方式娶靡?
    自繪控件牧牢、組合控件、以及繼承控件姿锭。

  6. 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)

  7. 請闡述圖片加載的基本流程及優(yōu)化方案凭语。
    通過HttpURLConnection c_onn = (HttpURLConnection) url.openConnection()
    取得圖片鏈接,通過InputStream in = conn.getInputStream()取得圖片圖片io流
    取得Bitmap圖片撩扒。
    通過LuraCache來優(yōu)化圖片緩存

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末似扔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子却舀,更是在濱河造成了極大的恐慌虫几,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挽拔,死亡現(xiàn)場離奇詭異辆脸,居然都是意外死亡,警方通過查閱死者的電腦和手機螃诅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門啡氢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人术裸,你說我怎么就攤上這事倘是。” “怎么了袭艺?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵搀崭,是天一觀的道長。 經(jīng)常有香客問我猾编,道長瘤睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任答倡,我火速辦了婚禮轰传,結果婚禮上,老公的妹妹穿的比我還像新娘瘪撇。我一直安慰自己获茬,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布倔既。 她就那樣靜靜地躺著恕曲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渤涌。 梳的紋絲不亂的頭發(fā)上码俩,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音歼捏,去河邊找鬼稿存。 笑死,一個胖子當著我的面吹牛瞳秽,可吹牛的內(nèi)容都是我干的瓣履。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼练俐,長吁一口氣:“原來是場噩夢啊……” “哼袖迎!你這毒婦竟也來了?” 一聲冷哼從身側響起腺晾,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤燕锥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悯蝉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归形,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年鼻由,在試婚紗的時候發(fā)現(xiàn)自己被綠了暇榴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蕉世,死狀恐怖蔼紧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狠轻,我是刑警寧澤奸例,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站向楼,受9級特大地震影響查吊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜜自,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一菩貌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧重荠,春花似錦箭阶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婆殿,卻和暖如春诈乒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婆芦。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工怕磨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喂饥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓肠鲫,卻偏偏與公主長得像员帮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子导饲,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 所有知識點已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)捞高? 在 Jav...
    侯蛋蛋_閱讀 2,450評論 1 4
  • 發(fā)現(xiàn)我最近好久都沒有畫水彩了,這兩天就畫了一些渣锦,比較簡單的硝岗,最近越來越喜歡這種小小的水彩畫了,畫起來也很方便袋毙,比較...
    狍子懟懟閱讀 232評論 2 2