這章主要介紹android基礎知識:包括4大組件、fragment、webView以及Binder的一些簡單介紹。java
activity用戶交互的界面,包含4中狀態:running/paused/stopped/killer。android
生命週期:web
activity啓動會執行onCreate()->onStart()->onResume, 點擊home鍵會執行onPause()->onStop(),注意若是內存吃緊,有可能會被回收。 再次回到原activity會執行onRestart()->onStart()->onResume()。 退出activity會執行onPause()->onStop()->onDestory()。
安全
分爲前臺/可見/服務/後臺/空bash
android中使用棧的方式來管理其中的Activity,後進先出的數據結構服務器
1.Standard 默認模式,每次都會new一個activity實例入棧 2.SingleTop 棧頂複用,調用onNewIntent()函數。 3.SingleTask 任務棧存在啓動activity就把它移動到棧頂,當前activity之上的全部activity都被移除棧。 4.SingleInstance 系統會建立一個新的任務棧,而且這個任務棧只有他一個Activity。不過啓動會慢一些,每每用於多個應用之間切換。markdown
android中scheme是一種頁面內跳轉協議,經過自定義scheme協議,能夠很是方便的跳轉app中的各個頁面。數據結構
fragment爲什麼被稱爲第5大組件 答:首先fragment不屬於四大組件,它有本身的生命週期,同時它能夠靈活的加載到activity當中去。 fragment雖然有本身的生命週期,但必須依附於activity存在。多線程
通常fragment會配合viewpage使用,FragmentPagerAdapter通常用於頁面較少的狀況,FragmentStatePagerAdapter用於頁面較多的狀況。 併發
FragmentManager中,replace是替換fragment實例,是把activity最上層的fragment替換成你想替換的fragment,add只是fragment加到activity的上層。
Service(服務)是一個一種能夠在後臺執行長時間運行操做而沒有用戶界面的應用組件。
onBind() 當另外一個組件想經過調用 bindService() 與服務綁定(例如執行 RPC)時,系統將調用此方法。在此方法的實現中,必須返回 一個IBinder 接口的實現類,供客戶端onServiceConnected中能夠獲取到該實例通訊。不管是啓動狀態仍是綁定狀態,此方法必須重寫,但在啓動狀態的狀況下直接返回 null。
onCreate() 首次建立服務時,系統將調用此方法來執行一次性設置程序(在調用 onStartCommand() 或onBind() 以前)。若是服務已在運行,則不會調用此方法,該方法只調用一次
onStartCommand() 當另外一個組件(如 Activity)經過調用 startService() 請求啓動服務時,系統將調用此方法。一旦執行此方法,服務即會啓動並可在後臺無限期運行。 若是本身實現此方法,則須要在服務工做完成後,經過調用 stopSelf() 或 stopService() 來中止服務。(在綁定狀態下,無需實現此方法。)
onDestroy() 當服務再也不使用且將被銷燬時,系統將調用此方法。服務應該實現此方法來清理全部資源,如線程、註冊的偵聽器、接收器等,這是服務接收的最後一個調用。
startService(Intent intent)一旦啓動,服務便可在後臺無限期運行,即便啓動服務的組件已被銷燬也不受影響,除非手動調用 stopSelf() 或 stopService() 才能中止服務, 已啓動的服務一般是執行單一操做,並且不會將結果返回給調用方。
bindService屬於client-server模式。service只有一個,但綁定到service上面的client能夠有一個或不少個。這裏所提到的client指的是組件,好比某個Activity。 服務的生命週期與其綁定的client息息相關。當client銷燬時,client會自動與Service解除綁定。固然,client也能夠明確調用Context的unbindService()方法與Service解除綁定。當沒有任何client與Service綁定時,Service會自行銷燬。通常用於IPC通訊。
廣播定義 普遍應用在應用程序之間傳遞信息的機制,相似觀察者模式,經過intent能夠傳遞數據。
加載網頁的組件。
ViewParent parent = mWebView.getParent(); if (parent != null) { ((ViewGroup) parent).removeView(mWebView); } mWebView.stopLoading(); mWebView.removeAllViews(); mWebView.destroy(); mWebView=null; super.onDestroy(); 複製代碼
WebViewClient.onPageFinished-->WebChromeClient.onProgressChanged onPageFinished沒法肯定當WebView調用這個方法的時候,網頁內容是否真的加載完畢 了。當前正在加載的網頁產生跳轉的時候這個方法可能會被屢次調用,判斷網頁是否加載完成最好 用onProgressChanged中的progres==100回調。
後臺耗電 WebView加載網頁,WebView會本身開啓一些線程,若是你沒有正確地將WebView銷燬的話,會致使電量居高不下。接調用System.exit(0);
後臺沒法釋放js 致使耗電。在Activity.onDestroy()中直接調用System.exit(0),使得應用程序徹底被移出虛擬機,這樣就不會有任何問題了。 [參考那些年在WebView上踩過的坑](blog.csdn.net/u012124438/… details/53401663)
Binder是什麼? Binder是由四個模塊組成,Binder Driver 、Binder Client、Binder Server、 Server Manager。 Binder Client至關於客戶端,Binder Server至關於服務器, ServerManager至關於DNS服務器,Binder Driver 至關於一個路由器。 Binder Driver位於內核空間,主要負責Binder通訊的創建,以及其在進程見得傳遞和Binder引用計數管理/數據包的傳輸等。Binder Server與 Binder Client之間的跨進程通訊則經過Binder Driver轉發。對於 Binder Client只須要知道本身要使用Binder的名字以及該binder實體在 Server Manager中的0號引用便可。ServerManager就是一個標準的BinderServer,而且在Android中約定其在Binder通訊過程當中惟一標識符永遠是0。
名稱 | 優勢 | 缺點 | 適用場景 |
---|---|---|---|
AIDL | 1.功能強大;2.支持實時通訊;3.支持一對多併發通訊;4.支持RPC(遠程過程調用) | 1.使用複雜,需建立AIDL文件;2.需處理好線程同步問題 | 低併發的一對多即時通訊,無RPC要求,不須要處理多線程) |
Messenger | 1.使用簡單,輕量級;2.支持實時通訊;3.支持一對多串行通訊 | 1.功能簡單;2.不支持RPC;3.數據經過message傳輸;4.不支持高併發場景;5.服務端想要回應客戶端,必須經過Message的replyTo把服務端的Messenger傳遞過去 | 一對多且有RPC需求,想在服務裏處理多線程的業務) |
client端: client端要拿到返回值,須要把client的Messenger做爲msg.replyTo參數傳遞過去,service端處理完以後,在調用客戶端的Messenger的send(Message msg)方法把返回值傳遞迴client
建立 AIDL 建立要操做的實體類,實現 Parcelable 接口,以便序列化/反序列化 新建 aidl 文件夾,在其中建立接口 aidl 文件以及實體類的映射 aidl 文件 Make project ,生成 Binder 的 Java 文件
服務端 建立 Service,在其中建立上面生成的 Binder 對象實例,實現接口定義的方法 在 onBind() 中返回
客戶端 實現 ServiceConnection 接口,在其中拿到 AIDL 類 bindService() 調用 AIDL 類中定義好的操做請求 操做請求