(一)Android面試題(一)Activity、Intent
Android四大組件分別是哪些?各自有什么作用和特點?
答:
活動(Activity):Activity是Android程序與用戶交互的窗口,是Android構造中最基本的一種,它需要為保持各界面的狀態,做很多持久化的事情,妥善管理生命周期以及一些跳轉邏輯。
服務(Service):后臺服務于Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的事務,定義好需要接受的Intent提供同步和異步接口。
內容提供者(Content Provider):是Android提供的第三方應用數據的訪問方案,可以派生Content Provider類,對外提供數據,可以像數據庫一樣進行選擇排序,屏蔽內部數據的存儲細節,向外提供統一的接口模型,大大簡化上層應用,對數據的整合提供了更方便的途徑。
廣播接收器(BroadCast Receiver):接受一種或者多種Intent作觸發時間,接受相關消息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型。(如接受系統通知,向通知欄發送消息)Activity的生命周期函數有哪些?點擊HOME鍵、BACK鍵等操作時,生命周期函數如何遷移?
答:
onCreate // 創建Act實例時調用。通常進行一些數據的初始化,比如獲取控件、申請數組或集合的內存、變量賦值
onRestart // Act停留在onStop但是沒有onDestory
onStart // 該方法在onCreate或者onRestart之后調用,調用之后,Act進入可視生命周期
onResume // onStart之后調用,調用該方法后Act進入活動(運行、前臺)狀態,可以和用戶進行交互,比如響應用戶的輸入、點擊、觸摸等操作
onPause // 在onResume之后,調用該方法,此Act就不能繼續和用戶交互,用戶自定義的一些數據可以在此方法中進行保存
onStop // onPause之后進行調用,一旦調用onStop,Act就退出了可視狀態,但是Act實例并沒有銷毀
onDestroy // 此方法是在銷毀Act的時候調用,一旦調用表明該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時,不會產生第四個實例只是把MainAct所在的棧切換到SecondAct所在的棧,把棧頂的Act實例展示出來Activity意外退出時,如何進行數據保存和恢復?
答:
開發者提前可以復寫onSaveInstanceState方法,創建一個Bundle類型的參數,把數據存儲在這個Bundle對象中,這樣即使Activity意外退出,Activity被系統摧毀,當重新啟動這個Activity而調用onCreate方法時,上述Bundle對象會作為參數傳遞給onCreate方法,開發者可以從Bundle對象中取出保存的數據,利用這些數據將Activity恢復到被摧毀之前的狀態。Intent是什么?有什么用處?
答:
Intent(意圖):作用是調用某個組件去做一個事情,它既能充當橋梁的角色,也能傳遞數據。Intent如何傳值?Bundle是什么,有什么用?
答:Intent的傳值:通過Intent類提供的setData和putExtra方法傳遞。
Bundle(捆):
兩個Activity之間的通訊可以通過bundle類來實現,把要傳遞的數據通過key-value的形式加入數據,另外一個Activity里面取出數據時,用key找出對應的valueonCreate(Bundle savedInstanceState)中savedInstanceState有什么用,什么情況下為null?
答:
savedInstanceState:是用來保存實例狀態的。在Activity中有一個onSaveInstanceStata方法,可以用來存放數據,避免Activity意外退出時保存需要的數據,通過onCreate中savedInstanceState取出保存的數據,默認不重寫時為null如何實現使用Intent來傳遞自定義對象?
答:
序列化要傳遞的自定義的對象,再通過Bundle來傳值。
(序列化:將對象的狀態轉換為可保持或傳輸的格式的過程)
與序列化相對的是反序列化,它將流轉換為對象。
通過序列化和反序列化就可以實現存儲和傳輸數據。
(二)Android面試題(二)OOM、ANR
什么是OOM?如何避免OOM?
OOM概念:內存溢出(OutOfMemor),內存占有量超過了JVM分配的最大內存。
避免OOM:
<1.避免對activity的超過生命周期的引用(盡量使用application代替activity)。
因為程序一般是由很多個Activity構成的,從一個Activity跳轉了以后,
系統就有可能回收這個Activity的各種內存占用??墒谴藭r如果你的一些不可回收變量(比如靜態變量)保持了對此Activity對象的引用,
那么GC就不會對此Activity進行回收,無故占用了大量的內存。這種情況最好的辦法就是用application代替activity。
用Context.getApplicationContext() 或者 Activity.getApplication()可以很方便的得到application對象。
<2.在展示高分辨率圖片時,先將圖片進行壓縮到與空間大小相近。
<3.及時釋放不使用的Bitmap,動態回收內存,方法:bitmap.recycle()。
<4.對適配器視圖進行優化處理,避免過多加載數據和對象的生成。什么是ANR?產生ANR的原因是什么?如何避免ANR的發生?
ANR概念:
應用程序無響應(application not response)。
原因:
主線程中做了非常耗時的操作。
解決辦法:
<1.運行在主線程里的任何方法都盡可能少做事情,盡量用Handler來處理UIthread和別的thread之間的交互;
<2.應用程序應該避免在BroadcastReceiver里做耗時的操作或計算;
<3.避免在Intent Receiver里啟動一個Activity,因為它會創建一個新的畫面,并從當前用戶正在運行的程序上搶奪焦點;
<4.在主線程中更新UI。
(三)Android面試題(三)四大組件
什么是Service?Service和Activity有什么區別?
答:Service是提供服務的代碼,這些代碼最終體現為一個個的接口函數,所以,Service就是實現一組函數的對象,通常也稱為組件。
區別:
①從設計的角度來講:
Android的Activity的設計與Web頁面非常類似,從頁面的跳轉通過連接,以及從頁面的定位通過URL,從每個頁面的獨立封裝等方面都可以看出來,它主要負責與用戶進行交互。
Service則是在后臺運行,默默地為用戶提供功能,進行調度和統籌,如果一棵樹的地上部分是Activity的話,它龐大的根須就是Service。Android的服務組件沒有運行在獨立的進程或線程中,它和其他的組件一樣也在應用的主線程中運行,如果服務組件執行比較耗時的操作就會導致主線程阻塞或者假死,從而無法響應用戶的操作。
②從使用的角度來講:
Service不僅可以給Activity建立雙向連接,為Activity提供數據和功能支持,也可以單向接受Intent的請求,進行數據的分析處理和功能調度。
③從扮演的角色來講:
Activity的功能比較單一,主要就是顯示應用所具有的一些功能,幫助用戶與應用進行交互,像一個人的臉。而Service可能扮演功能調度者也能扮演功能提供者,從觸發器收集信息進行分析和處理,然后更新界面,修改數據或進行其他操作時是一個功能調度者,從輸入法的選擇考慮Service扮演的就是一個功能提供者。View組件是Android中用戶能夠實實在在看到的部分,如按鈕,輸入框等就是繼承自這個類,View只有裝入Activity這樣的容器中才有意義,而反過來
Activity裝入了這些View后才能夠成功完成與用戶交互的任務,但是Service不需要這些花哨的東西,只需要默默地等待事件發生或者聽候差遣。Service的兩種使用方式分別是什么?它們的生命周期分別怎樣遷移?
答:
方式1:通過startService,Service會經歷onCreate->onStart,stopService的時候直接onDestroy
方式二:通過bindService,Service只會運行onCreate,這個時候TestServiceHolder和TestService綁定在一起,TestServiceHolder退出了,Srevice就會調用onUnbind->onDestroyed什么是AIDL?AIDL的作用是什么?它的基本使用流程是怎么樣的?
答:AIDL是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口
作用:
1、多個應用程序之間建立共同的服務機制;
2、通過AIDL在不同應用程序之間達到數據的共享和數據相互操作;
3、主要是用于多應用之間的數據交互(而 在單個應用內或者說該應用如果不需要和其它第三方應用進行交互則不需要實現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、編寫調用aidl服務的客戶端
6、把之前編寫的aidl文件(注意不是生成的java文件)和它的包目錄拷貝到客戶端的src目錄中
7、在需要的地方用一下方法綁定,new Intent構造器中的action填寫的就是之前<action android:name="com.aidl.ISerachService" />中的android:name的字符串什么是BroadcastReceiver?它有什么作用?
答:BroadcastReceiver是Android四大組件之一,本質是一種 全局的監聽器,用于監聽系統全局的廣播消息。因此它可以非常方便的實現不同組件之間的通信。
作用:通過該機制,使得消息能在各個組件間、各個進程間傳遞,起到郵遞員的作用。什么是有序廣播?有序廣播有什么特點?什么是系統廣播?
有序廣播:是通過Context.sendOrderedBroadcast來發送。所有的receiver依次執行。
有序廣播特點即從優先級別最高的廣播接收器開始接收,接收完了如果沒有丟棄,就下傳給下一個次高優先級別的廣播接 收器進行處理,依次類推,直到最后。
系統廣播:當系統發生事件時,就會發送出廣播,通過廣播中的關鍵字段,系統將尋找所有關注這個廣播的應用,并觸發他們注冊的Receiver什么是粘性廣播?它跟普通廣播有什么區別?
定義:沒有注冊的接收者,在后來注冊后也能收到廣播,進程間通信
當發布該廣播后它還駐留在周圍,它可以讓其他接收者迅速的檢索到數據,通過一個方法的(動態注冊接收者方法)返回值 這個返回值就是意圖
粘性廣播的特點是Intent會一直保留到廣播事件結束,而這種廣播也沒有所謂的10秒限制,10秒限制是指普通的廣播如果onReceive方法執行時間太長,超過10秒的時候系統會將這個廣播置為可以干掉的candidate,一旦系統資源不夠的時候,就會干掉這個廣播而讓它不執行。什么是ContentProvider?如何自定義一個ContentProvider?
ContentProvider(內容提供者)是Android中的四大組件之一。主要用于對外共享數據,也就是通過ContentProvider把應用中的數據共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的數據進行操作。
1)ContentProvider為存儲和獲取數據提供了統一的接口。ContentProvide對數據進行封裝,不用關心數據存儲的細節。使用表的形式來組織數據。
2)使用ContentProvider可以在不同的應用程序之間共享數據。
總的來說使用ContentProvider對外共享數據的好處是統一了數據的訪問方式。
自定義ContentProvider:
編寫一個類,必須繼承自ContentProvider類;
實現ContentProvider類中的所有的抽象方法;
onCreate();getType();query();Insert();update();delete();等方法
在清單文件中聲明注冊ContentProvider
<provider android:name=".MyWordsprovider"
android:authorities="heying.provider.wordsconetenprovider"
android:exported="true"
/>
將Uri提供出去你使用過哪些系統的ContentProvider?
媒體庫、通訊錄等
(四)Android面試題(四)數據保存和網絡
常用的數據持久化(長久保存數據)方式有哪些?
答:
1、SharedPreference,共享參數形式,一種以Key-Value的鍵值對形式保存數據的方式,Android內置的,一般應用的配置信息 ,推薦使用此種方式保存,不能存文件也不適合。其存儲的位置在/data/data/packageName/shared_prefs文件夾下面。
2、Internal Storage:把數據存儲到手機內部的存儲空間,主要用來保存私有數據/data/data/packageName/files文件夾下 面
3、External Storage:把數據存儲到手機的外部存儲SD卡中,主要用來保存非私有和大型數據,它有應用程序專用的文件夾 ,也有所有程序公用的文件夾(這個文件夾不會隨著應用程序的卸載而卸載),需要賦予應用程序訪問Sdcard的權限,Android的權限 控制尤為重點,在Android程序中,如果需要做一些越界的操作,均需要對其進行授權才可以訪問。在AndroidManifest.xml中添加代碼 :<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4、SQLite Databases:以表格形式存儲信息的一個輕量級的小型數據庫
5、Network Connection:將數據存儲到網絡服務器上
6、ContentProvider:他提供一種方式實現兩個不同應用程序之間的通訊ShareedPrefrence的讀寫數據的基本方法?
答:它保存的數據主要是簡單類型的Key-value對。并且Value部分只能是一些基本數據類型:boolean、float、int、long、String等 。
1、得到SharedPreference對象的方法有:
a、Context類中的getSharedPreference(String name,int mode)方法,name :存儲的文件名,如果不存在會自動創建一個 mode:訪問模式,一般有兩個參數MODE_PRIVTE(私有,只有當前應用程序才能進行讀寫)和MODE_MULTI_PROCESS(多個進程對同一個文件進行讀寫)
b、Activity類中的getSharedPreference(int mode)方法,自動將當前活動的類名作為文件名
c、PreferenceManager類的getDefaultSharedPreferences(Context context)方法,這是一個靜態方法,接收Context參數,會自動將應用程序的包名作為前綴去命名文件
2、讀常用方法:
a、boolean contains(String Key):判斷SharedPreferences是否包含特定Key的數據
b、abstract Map<String,?> getAll():獲取SharedPreferences數據里全部的Key-Value對。
c、 boolean getXxx(String key,Xxx defValue):獲取SharedPreferences數據里指定Key對應的value。如果該Key不存在,返回默認值defValue。
3、寫常用方法(通過SharedPreferences的內部接口Editor實現,edit()方法即可得到Editor對象)
a、abstract SharedPreferences.Editor clear():清空SharedPreferences里所有的數據
b、abstract SharedPreferences.Editor putXxx(String key,xxx value):向SharedPreferences中插入指定的Key-Value對。
c、abstract SharedPreferences.Editor remove(String key):從SharedPreferences中移除指定Key的數據。
d、boolean commit():當Editor編輯完成后,調用該方法提交修改,切記不可忘記調用此方法,否則不能儲存數據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,...;所有數據都這樣更新
UPDATE tableName SET column1 = value1, column2 = value2 WHERE column3 = value3;更新column3 = value3這一行的column1 和column2的值
查詢:
SELECT * FROM tableName;查詢所有的數據
SELECT column1,column3 FROM tableName; 查詢所有數據,但是只顯示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主要是用來創建數據庫和表格,以及為數據庫升級的作用。在Android系統中,既然可以通過Context類的 openOrCreateDatabase()函數打開或創建SQLite數據庫,并且可以通過其返回值(即SQLiteDatabase對像)調用execSQL()函數對數據 庫做任何的操作(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)");
實際上,直接操作數據庫的語句和其他的語句混在一起,不利于程序的模塊化。而SQLiteOpenHelper是一個抽象類,通過它的名字可以 看出來,是一個幫我們打開數據庫的小助手:
1、當new SQLiteOpenHelper子類對象時,就會通過其構造函數創建數據庫文件(當然如果數據庫如果存在,就不用創建了, 并且自動調用onCreate(SQLiteDatabase db)創建數據表;
2、當要對數據庫讀操作時,只需調用其子類的getReadableDatabase()返回SQLiteDatabase實例,通過該實例來執行SQL語句 ;
3、當要對數據庫寫操作時,只需調用其子類的getWritableDatabase()返回SQLiteDatabase實例,通過該實例來執行SQL語句 ;
4、當通過構造函數傳進來的數據庫版本高于之前的版本時,系統會調用onUpgrade()函數來更新數據庫。
于是,對APP而言,就屏蔽了數據庫創建的過程,將數據表的創建獨立出來了。
SQLiteOpenHelper只是一個數據庫管理的幫助類,讓使用者不直接操作數據庫而是通過操作這個類的對象來實現各種數據庫操作。這個 類就是給數據庫操作搭了個架子,使用者根據需求去填充那些架子。什么是回調CallBack,回調的作用是什么?常見的回調使用場景?
答:把接口方法的定義和調用給封裝起來,然后在回調接口中的回調方法中進行具體的操作
作用:
1、可以節省時間,充分利用了資源
2、讓工具類的使用變得簡單易用。用戶不需要關心接口方法的定義以及調用,只需要關注方法的具體實現功能即可。
使用場景:
1、事件監聽器,這其實就是回調最常見的應用場景之一
2、生命周期函數
3、當方法的具體實現不確定的時候可以設置回調函數讓清楚的人自己去實現,而我們只是提供一個實現的接口出去,而其它的別人不需要知道的東西都封存起來,這也體現了封裝和面向對象的思想,你問我問題,而我想到了答案告訴你,至于 你拿到答案后干什么,我怎么想到的答案都不需要對方知道TCP和UDP的區別是什么?
答:
TCP :傳輸控制協議。
a、面向連接,靠三次握手來完成
b、速度相對較慢,因為連接的過程會耗時間和資源
c、可靠的協議,數據不會丟失
d、數據大小沒有限制
e、耗用系統資源相對較多
UDP :用戶數據報文協議
a、面向無連接的
b、高效的、速度快
c、不可靠的協議,容易丟失數據
d、數據包大小有限制,小于64K
e、耗用系統資源相對較少Http的get和post方法的區別什么?
答:get方法:
原理上:
主要用來獲取或者查詢資源信息,是安全的和冪等的。就是說不修改信息
表面上:
a、GET請求的數據會附在URL之后(就是把數據放在HTTP協議頭中),以?分割URL和傳輸數據,參數之間以&相連
b、GET方式提交的數據較小(瀏覽器和操作系統對URL長度的限定),一般1024字節
c、GET的安全性相對較弱,可能會造成信息泄露(信息會明文出現在URL上,其他人可能會通過瀏覽器的緩存查看到歷史記錄,從而得到信息)
d、服務器端用Request.QueryString獲取變量的值
e、GET請求用起來比比較方便
post方法:
原理上:
根據Http規范,POST表示可能修改服務器上資源的請求
表面上:
a、POST請求把要提交的數據放在HTTP包的包體中。
b、POST可以提交較大量的數據(受到服務器的處理程序的處理能力限制)
c、POST安全性較高(數據不會明文出現在URL上)。
d、服務器端用Request.Form獲取提交的數據。
e、用起來相對麻煩一點
(五)Android面試題(五)常見的異步方式
常見的實現異步的方式有哪些?
AsyncTask、Thread+Handler常見的耗時操作如何處理?
常見的耗時操作有:網絡請求、數據庫操作、比較復雜的運算,使用AsyncTask或Thread+Handler進行異步處理子線程更新UI的基本方法有哪些?
a. Thread + Handler的方式
在非UI線程中執行耗時操作(網絡請求、數據庫操作、比較復雜的運算),在需要將操作的進度或者結果更新到UI上時,
就發送消息并攜帶數據,最終由Handler的handleMessage來處理(注意:Handler對象必須是創建在UI線程中)
b. Activity提供的一個簡便的方式來更新UI
runOnUiThread(Runnable r);
內部做了判斷當前的活動線程是否是UI線程
是:直接調用run方法
否:將Runnable給post到UI線程對應的消息隊列
c. Handler里邊也提供簡便的更新UI的方式
handler.post(Runnable r);
內部其實調用了發送消息的方法,最終也是把Runnable對象給放到了UI線程中執行Handler、Looper、Message、MessageQueue是什么?它們之間有什么關聯?
Handler:基本功能兩個,發送和處理消息
發消息:sendXXXX方法
a. 如果不需要通過消息來傳遞具體的數據,可以發送空消息
sendEmptyMessage(what);即時消息,立即發送
sendEmptyMessageDelayed(what,time);發送一個延遲消息,在從當前計時到指定時間長度后發送
sendEmptyMessageAtTime(what, atTime);發送一個定時的消息,在指定時刻發出
b. 如果需要在線程間傳遞一些具體的數據,需要發送帶有具體消息對象的消息
消息對象的獲取:
Message msg = new Message(); // 每一次都新創建一個消息對象
Message msg = handler.obtainMessage();// 每次調用時會去檢查消息池中是否有可復用的消息。有則復用,無則創建。
Message msg = Message.obtain(); // 每次調用時會去檢查消息池中是否有可復用的消息。有則復用,無則創建。
c. Message都有哪些傳遞數據的方式:
what:int,用于區分消息從哪里發出
arg1:int,可以攜帶一個int數據
arg2:int,也可以攜帶一個int數據
obj:Object,可以攜帶任何的對象
d. 帶數據的消息發送也可以有即時、延遲、定時
處理消息:handleMessage里邊實現接收到消息之后需要實現的操作,需要注意的是該方法是覆蓋父類Handler的
Message:消息對象,用來傳遞具體的數據的。
MessageQueue:消息隊列,是一種數據結構,特點是符合FIFO,先進先出,由一個或多個消息對象構成的一個隊列
Looper:循環的意思,作用就是管理消息隊列,比如說從隊列中取出消息交給對應的Handler進行處理AsyncTask中幾個回調方法運行在哪個線程、DoInBackGround執行在哪個線程?
4個回調方法,其中三個運行在主線程(初始化,UI更新,進度條更新),DoInBackGround運行在子線程runOnUiThread為什么可以用來更新UI?
該方法內部做了判斷當前線程是否為UI線程的操作
不是UI線程則將該action添加到mHandler所在的UI線程的消息隊列中
是UI線程,則直接執行使用Handler+Thread的方式在子線程更新UI時,Handler對象可以在子線程中創建嗎?
不能,只能在主線程創建,再傳到子線程中
- Handler的post方法為什么可以用來更新UI?
該方法內部實際上是發送一個延遲的消息給該線程的Handler處理,該方法內部將消息對象加入了消息隊列,
最終也是把Runnable對象給放到了UI線程中執行
如果是更新UI,則這個Handler對象必須創建在UI線程中
(六)Android面試題(六)JSON、XML、MediaPlay生命周期
JSON中有幾種數據類型,解析對應數據類型分別用哪個類?
四種類型:
第一種類型是標量(scalar),也就是一個單獨的字符串(string)或數字(numbers),
比如"北京"這個單獨的詞。
第二種類型是序列(sequence),也就是若干個相關的數據按照一定順序并列在一起,
又叫做數組(array)或列表(List),比如"北京,上海"。對應JSONAray;
第三種類型是映射(mapping),也就是一個名/值對(Name/value),即數據有一個名稱,
還有一個與之相對應的值,這又稱作散列(hash)或字典(dictionary)。對應String;
第四種,類似于Java中的類,對應JSONObject。有哪些方式可以做JSON數據的解析?
兩種解析方式:
1)JSON普通解析方式,運用
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;對象來解析;
2)運用gson-2.1.jar包下的Gson類和與之Json數據相對應的Translate類來解析:創建Gson對象,調用它的fromjson方法有哪些方式可以做XML數據解析?
DOM在處理XML文件時,將XML文件解析成樹狀結構并放入內存中進行處理。
SAX則是以事件作為解析XML文件的模式,它將XML文件轉化成一系列的事件,由不同的事件處理器來決定如何處理。
XML文件較大時,選擇SAX技術是比較合理的。
XML pull通過循環驅動事件來解析:判斷事件的類型,獲取事件中的內容
對于XML文檔較大但只需要文檔的一部分時,XML Pull解析器則是更為有效的方法。請闡述一種XML解析方式的基本流程。
1. 獲取解析器對象XmlPullParser對象parser
2. 可以給parser對象設置輸入的編碼方式
3. 循環驅動事件進行解析
事件分為4類:
a. 開始文檔:XmlPullParser.START_DOCUMENT值為0
b. 結束文檔:XmlPullParser.END_DOCUMENT值為1
c. 開始標簽:XmlPullParser.START_TAG值為2
d. 結束標簽:XmlPullParser.END_TAG值為3
一個事件處理完畢之后,需要提供parser的next方法去驅動下一個事件自定義View有哪幾種方式?
自繪控件、組合控件、以及繼承控件。MediaPlayer的生命周期是怎樣的?
1.Idle 狀,2.End 狀態,3.Initialized 狀態,4.Prepared 狀態,5.Preparing 狀態,6.Started 狀態,7.Paused 狀態,8.Stop 狀態,9.PlaybackCompleted狀態,10.Error狀態請闡述圖片加載的基本流程及優化方案。
通過HttpURLConnection c_onn = (HttpURLConnection) url.openConnection()
取得圖片鏈接,通過InputStream in = conn.getInputStream()取得圖片圖片io流
取得Bitmap圖片。
通過LuraCache來優化圖片緩存