25.Android開發藝術探究Note
阿新 • • 發佈:2017-06-07
tor 服務 .com oncreate pc機 ssa 比較 share 自定義
第一章:Activity的生命周期和啟動模式
生命周期- onPause表示activity正在停止,onPaus必須先執行完(棧頂的activity),新的activity的onResume才會執行。onStop表示activity即將停止(透明不會執行),可以做些稍微重量級的回收工作。onPause和 onStop不能處理太耗時的操作,因為onPause必須執行完成以後新的activity才能resume
- onstart和onstop是從activity是否可見這個角度來回調的,而onresume和onpause是從activity是否位於前臺這個角度回調的,除了這個區別,在實際使用中沒有其他區別,回收或初始化數據,可以看情況提前或者靠後
- 在activity異常終止的時候會調用onsaveinstanceState來保存當前activity的狀態,正常情況情況下系統是不會調用這個方法的。可以通過onRestoreInstanceState和onCreate方法來判斷activity是否被重建了,如果被重建,就可以取出之前保存的數據並恢復,倆者的區別是:onRestoreInstanceState一旦被調用,其參數bundle一定是有值的,不需要額外的判斷是否為空。從時序上來說,onRestoreInstanceState的調用時機在onstart之後。
- 一些後臺工作不適合脫離四大組件而獨自運行在後臺中(程序退出後系統會保留一個空進程方便系統再次啟動),這樣進程很容易被殺死,比較好的方法是將後臺工作放在service中從而保證進程有一定的優先級,這樣就不會輕易被系統殺死了
- 畫曲線的是經常用的
- 當棧中無任何activity的時候,系統就會回收這個任務棧
- standard:標準模式。一個任務棧中可以有多個實例,每個實例也可以屬於不同的任務棧。在這種模式下,誰啟動了這個activity,那麽這個activity就運行在啟動它的那個activity所在的棧中,比如activity A啟動了activity B(B是標準模式),那麽B就進入A所在的棧中
- singleTop:棧頂復用模式。在這種模式下,如果新的activity已經位於任務棧的棧頂,那麽此activity不會重復創建,同時它的onNewIntent方法會被回調,通過此方法的參數可以取出當前請求的信息。singleTask模式也會回調這個方法
- 有倆種方法可以指定activity的啟動模式。第一種是通過清單文件指定,第二種是通過intent中設置標誌位來為activity指定啟動模式。倆者是有卻別的。首先,優先級上,第二種比第一種高,當倆種同時存在時,以第二種方式為準;其次上述倆種方式在限定範圍上有所不同,比如,第一種方式無法直接為activity設定FLAG_ACTIVITY_CLEAR_TOP標示,而第二種方式無法為activity指定singleInstance模式
- 隱式啟動,只有一個intent同時匹配action、category、data才算是完全匹配,只有完全匹配才能成功啟動目標activity。一個activity中可以有多個intent-filter,一個intent只要能匹配任何一組intent-filter即可成功啟動對應的activity
- IPC含義為進程間通信或跨進程通信,是指倆個進程間進行數據交換的過程。IPC不是android中獨有的,任何一個操作系統都需要有相應的IPC機制。
- 在android中使用多進程只有一種方法,那就是給四大組件在清單文件中指定process屬性,除此之外沒有其他方法
- 多進程有這麽問題,但是我們不能因為多進程有很多問題就不去正式它。為了解決這個問題,系統提供了很多跨進程通信方法,雖然不能直接的共享內存,但是通過跨進程通信還是可以實現數據交互。實現跨進程通信的方法有很多,比如通過intent來傳遞數據,共享文件和SharedPreferences,基於binder的message和AIDL以及Socket等
- serializable和Parcelable接口可以完成對象的序列化過程,當我們需要通過Intent和binder傳輸數據時就需要使用他們。還有的時候我們需要把對象持久化到存儲設備上或者通過網絡傳輸給其他客戶端,這個時候也需要序列化
- 用serializable序列化,只需要這個類實現serializable接口並聲明serialVersionUID即可,實際上,甚至這個serialVersionUID也不是必須的,不聲明這個serialVersionUID同樣可以實現序列化,但是這會對反序列化產生影響。當反序列化的時候系統會去檢測文件中的serialVersionUID,看他是否和當前類的serialVersionUID一致,如果一致就說明序列化的類的版本和當前類的版本是相同的,這個時候可以成功序列化。如果類結構發生了非常規性改變,比如修改了類名、成員變量類型,反序列化就會失敗,因為類結構有了毀滅性的改變,根本無法從老版本的數據還原出一個新的類結構對象。註意:靜態成員變量屬於類不屬於對象,所以不會參與序列化過程,其次用transient關鍵字標記的成員變量不參與序列化過程
- AIDL的使用流程:首先創建一個服務service和一個aidl接口,接著創建一個類繼承自aidl接口中的stub類並實現stub中的抽象方法(就是定義接口的方法),在service的onbinder方法中返回這個類的對象,然後在客戶端就可以綁定服務端service,建立連接後就可以訪問遠程服務端的方法了
- 如果公司項目龐大了,現在有10個不同的業務模塊都需要使用aidl來進行進程間通信,不需要創建10個、100個服務,可以將所有的aidl放在同一個服務裏去管理,用binder連接池,具體看書
- Drawable表示的是一種可以在Canvas上進行繪制的抽象概念,它的種類有很多,最常見的顏色和圖片都可以是一個Drawable。優點:首先,它的使用簡單,比自定義view的成本要低;其次,非圖片類型的Drawable占用空間較小,這對減少apk的大小也很有幫助。Drawable常用來作為view的背景使用,一般都是通過XML來定義的,也可以用代碼來創建具體的Drawable,創建比較復雜。
- Drawable的內部寬高通過getIntrinsicWidth和getIntrinsicHeight這來個方法可以獲得。但是並不是所有的Drawable都有寬高,比如一張圖片所形成的Drawable,它的內部寬高就是圖片的寬高,但是一個顏色所形成的Drawable,它就沒有內部寬高的概念,另外需要註意的是,Drawable的內部寬高不等於它的大小,一般來說,Drawable是沒有大小概念的,當用作view的背景時,Drawable會被拉伸至view的同等大小
- Drawable的分類(子類):BitmapDrawable、ShapeDrawable、StateListDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScalDrawable、ClipDrawable等
- Drawable的使用範圍很單一,一個是作為imageview中的圖像來顯示,另外一個就是作為view的背景
25.Android開發藝術探究Note