1. 程式人生 > >android常用的必備基礎知識

android常用的必備基礎知識

首先從四大元件說起: 
Activity: 
生命週期: 
activity三種狀態:執行(執行在最前端)、停止(不可見,完全被覆蓋)、暫停(可見,但前端還有其他activity) 
生命週期相關的方法:onCreate-onStart-onResume-onPause-onStop-onDestory-onRestart 
切換時如果要儲存資料, 可以重寫: onSaveInstanceState(); 
恢復資料時, 重寫: onRestoreInstanceState(); 
啟動模式: 
1.standard:預設的,每次呼叫startActivity()啟動時都會建立一個新的activity放在棧頂 
2.singleTop:啟動Activity時,指定Activity不在任務棧棧頂就建立,如在棧頂,則不會建立,會呼叫onNewInstance(),複用已經存在的例項。 
3.singleTask:在任務棧裡面只允許一個例項,如果啟動activity不存在就建立,如果存在直接跳轉到指定Activity所在位置。 
4.singleInstance:開啟一個新的任務棧來存放這個Activity的例項,此模式開啟的Activity是執行在自己單獨的任務棧中的。

2.BroadcastReceiver廣播接收者 
有序廣播用過呼叫abortBroadcast()方法來中斷,接收者之間可以傳遞資料 
動態註冊廣播register,取消unregister 
廣播接收者開啟Activity,需要設定一下Intent.FLAG_ACTIVITY_NEW_TASK 
應為廣播接收者是沒有Activity任務棧的 
sendOrderBroadcast()傳送有序廣播 
1)靜態註冊:在AndroidManifest.xml註冊,android不能自動銷燬廣播接收器,也就是說當應用程式關閉後,還是會接收廣播。 
2)動態註冊:在程式碼中通過registerReceiver()手工註冊.當程式關閉時,該接收器也會隨之銷燬。當然,也可手工呼叫unregisterReceiver()進行銷燬。

3.Service服務 
Service中的生命週期方法(Context呼叫執行): 
1)startService() 如果沒建立就先onCreate()再startCommand(), 如果已建立就只執行startCommand(); 
2)stopService() 執行onDestroy() 
3)bindService() 如果沒有建立就先onCreate()再onBind() 
4)unbindService() 如果服務是在繫結時啟動的, 先執行onUnbind()再執行onDestroy(). 如果服務在繫結前已啟動, 那麼只執行onUnbind(); 
3、開啟服務的2種方式 
2種不同開啟方式的區別: 
1)startService: 
開啟服務,服務一旦開啟,就長期就後臺執行,即使呼叫者退出來,服務還會長期執行; 
資源不足時,被殺死,資源足夠時,又會復活; 
2)bindService: 
繫結服務,繫結服務的生命週期會跟呼叫者關聯起來,呼叫者退出,服務也會跟著銷燬; 
通過繫結服務,可以間接的呼叫服務裡面的方法(onBind返回IBinder); 
4、服務混合呼叫生命週期 
一般的呼叫順序: 
①、start -> stop 開啟 –> 結束 
②、bind -> unbind 繫結(服務開啟) -> 解綁(服務結束) 
混合呼叫: 
①、start –> bind -> stop->unbind->ondestroy 通常不會使用這種模式 
開啟 –> 繫結 –> 結束(服務停不了)->解除繫結(服務才可停掉) 
②、start –> bind -> unbind -> stop 經常使用 
開啟 –> 繫結 –> 解綁(服務繼續執行)-> stop(不用時,再停止服務) 
這樣保證了服務長期後臺執行,又可以呼叫服務中的方法

4、內容提供者 
這個問的非常少,但是一旦問道還是要知道怎麼回事的。 
ContentProvider: 
在資料庫中有對應的增刪改查的方法,如果要讓別的應用程式訪問,需要有一個路徑uri 
通過content:路徑對外暴露,uri寫法:content://主機名/表名 
1)ContentProvider:內容提供者 
把一個應用程式的私有資料(如資料庫)資訊暴露給別的應用程式,讓別的應用程式可以訪問; 
在資料庫中有對應的增刪改查的方法,如果要讓別的應用程式訪問,需要有一個路徑uri: 
通過content:// 路徑對外暴露,uri寫法:content://主機名/表名 
2)ContentResolver:內容解析者 
根據內容提供者的路徑,對資料進行操作(crud); 
3)ContentObserver:內容觀察者 
可以理解成android系統包裝好的回撥,資料傳送變化時,會執行回撥中的方法; 
ContentResolver傳送通知,ContentObserver監聽通知; 
當A的資料發生變化的時候,A就會顯示的通知一個內容觀察者,不指定觀察者,就會發訊息給一個路徑 
ContentProvider和sql的實現上的區別: 
1,Contentprovider遮蔽了資料儲存的細節,內部實現對使用者完全透明,使用者只需要i、關心操作資料的uri就可以了,ContentProvider可以實現不同app之間的共享 
2,Sql也有增刪改查的方法,但是sql只能查詢本應用下的資料庫。而Comtentprovider還可以去增刪改查本地檔案.xml檔案的讀取等

非同步載入網路資料(AsyncTask) 
AsyncTask類,這個類中的任務是執行在後臺執行緒中的,並可以將結果放在UI執行緒中去處理 
它定義了三種泛型,分別是Params、Progress和Result,分別表示請求的引數、任務的進度和獲取的結果資料 
執行過程:1.onPreExecte():執行在主執行緒。這步操作是用於準備好任務的,作為任務載入的準備工作。建議在這個方法中彈出一個提示框。 
2.doInBackground():執行在子執行緒中。需要將請求的引數傳遞進來,傳送給伺服器,並將獲取到的資料返回,資料回傳給下一步的onProgressUpdate()中進行進度更新。 
3.onProgressUpdate():進度更新 
4.onPostExectue():介面更新 
實現原理: 
1.執行緒池的建立:預設建立一個執行緒池ThreadPoolExecutor,並預設創建出5個執行緒放入到執行緒池中,最多可放128個執行緒,且這個執行緒池是公共的唯一一份。 
2.任務的執行:執行run方法,執行完run方法後,會呼叫scheduleNext()不斷的從雙端佇列中輪詢,獲取下一個任務並繼續放到一個子執行緒中執行,直到非同步任務執行完畢。 
3.訊息的處理:在AsyncTask中維護了一個InternalHandler的類,這個類是繼承Handler的,獲取的資料是通過handler進行處理和傳送的。其中handleMessage方法中,將訊息傳遞給onProgressUpdate()進行進度的更新,也可以將結果傳送到主執行緒中,進行介面的更新了。