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()進行進度的更新,也可以將結果傳送到主執行緒中,進行介面的更新了。