標籤:test 內部使用 核心線程 最大並發數 cat 之間 靜態變數 硬體 標準模式
Android開發藝術探索
1 Activity的生命週期和啟動模式
典型情況下生命週期
異常情況下生命週期
啟動模式
標準模式
棧頂複用模式
棧內複用模式
單一實例模式
Activity的Flags
IntentFilter的匹配規則
2 IPC機制
處理序間通訊
Serializanle
Parcelable
Binder
3 View的事件體系
事件分發機制
事件分發機制
點擊事件就是MotionEvent 事件分發其實就是對MotionEvent事件的分發
三大方法
dispatchTouchEvent 分發
onInterceptTouchEvent 攔截
onTouchEvent 消費
事件行程順序 Activity Window View
對於ViewGroup 點擊事件產生後 就會調用dispatchTouchEvent 然後調用onInterceptTouchEvent
如果返回true 表示要攔截該事件 就會調用onTouchEvent
如果返回false 表示不看就 則該事件就會傳遞到其子項目中
4 View的工作原理
View的工作流程
onMeasure 為整個View樹計算實際的大小 設定實際的寬高
每個View控制項的實際寬高由父視圖和本身視圖決定
onLayout 根據子視圖大小布局參數 將View放到合適的位置上
onDraw 繪製映像 首先繪製背景 再調用onDraw繪製視圖本身 如果View是ViewGroup
調用dispatch繪製子視圖 最後繪製捲軸
自訂View
繼承View重寫onDraw 用於實現一些不規則的效果
繼承ViewGroup派生特殊的Layout 用於實現自訂布局
5 RemoteViews
6 Drawable
7 Android動畫
View動畫 通過對情境裡的對象做映像變換 平移 縮放 旋轉 透明度從而產生動畫效果
幀動畫 通過順序播放一系列映像從而產生動畫效果
屬性動畫 API11 動態改變對象的屬性產生動畫效果
8 Window WindowManager
9 四大組件工作機制
10 Android的訊息機制
Handler機制
Handler通過調用sendMessage把訊息放在訊息佇列MessageQueue中
Looper負責把訊息從訊息佇列中取出來 重新再交給Handler進行處理
11 線程和線程池
AsyncTask
封裝了線程池和Handler 方便在子線程中更新UI
HandlerThread
具有訊息迴圈的線程 內部使用Handler
實現方式是run中通過Looper.prepare來建立訊息佇列 並通過Looper.loop來開啟訊息迴圈
IntentService
特殊的Service 封裝了HandlerThread和Handler 用於執行後天耗時的任務 任務執行後自動停止
ThreadPoolExecuter 線程池
重用線程池中線程 避免因為線程的建立銷毀帶來的效能開銷
有效控制線程池最大並發數 避免線程之間搶佔資源導致的阻塞
能夠對線程進行簡單管理
構造方法參數
corePoolSize 核心線程數
maxmunPoolSize 最大線程數
keepAliveTime 逾時時間長度
unit 時間單位
workQueue 任務隊列
threadFactory 線程工廠
四類線程池
FixedThreadPool
CachedThreadPool
ScheuledThreadPool
SingleThreadPool
12 Bitmap的載入和Cache
Bitmap載入和緩衝
LruCache 記憶體緩衝
內部採用LinkedHashMap以強引用方式儲存外界緩衝對象
強引用 直接的對象引用
軟引用 系統記憶體不足時該對象被gc回收
弱引用 此對象隨時會被gc回收
DiskLruCache 硬碟緩衝
13 綜合技術
CrashHandler
multidex解決方案數越界
動態載入技術
資源訪問
Activity生命週期管理
ClassLoader管理
反編譯初步
14 JNI和NDK
JNI Java本地介面 方便Java調用C C++等本地代碼所封裝的一層介面
NDK Android所提供的一個工具集合 通過NDK可以在Android中更加方便
的通過JNI來訪問本地代碼
JNI的開發流程
在Java中聲明native方法
編譯Java源檔案得到class檔案 然後通過javah匯出JNI的標頭檔
實現JNI方法
編譯so庫並在Java中調用
NDK開發流程
下載並配置NDK
建立一個Android項目並聲明所需的native方法 java檔案 System.loadLibrary
實現Android項目所聲明的native方法 test.cpp Android.mk Application.mk
通過ndk-build命令編譯產生so庫
JNI的資料類型和類型簽名
JNI調用Java方法的流程
15 Android效能最佳化
效能最佳化
布局最佳化
刪除布局中無用的控制項和層級 選擇效能較低的ViewGroup 避免過度繪製
include標籤 重用指定的布局檔案
merge標籤和include標籤一起使用減少布局層級
ViewStub 按需載入所需的布局檔案
繪製最佳化
View的onDraw避免執行大量的操作
不要建立新的局部對象 不要做耗時任務
記憶體流失最佳化
靜態變數導致的記憶體流失
單例模式導致
屬性動畫無限迴圈
補充
資來源物件沒有關閉 如查詢資料庫沒有關閉遊標
構造Adapter沒有使用convertView
Bitmap在不使用時未調用recycle釋放記憶體
Context逃逸
註冊沒有取消 如動態註冊廣播在Activity銷毀沒有反註冊
集合對象未清理
Activity中使用非靜態內部類 並開啟一個長時啟動並執行線程
由於內部類持有Activity引用 導致Activity無法回收
Handler記憶體流失
類的靜態變數持有大資料對象
非靜態內部類存在靜態執行個體
響應速度最佳化 避免在主線程中做耗時操作
ANR
Activity 5秒內無法響應輸入操作
BroadcastReceiver 10m秒內還未執行完操作
Servcice 20秒內未完成相關處理
定位 開發機器上查看traces.txt日誌
避免 使用子線程處理耗時IO操作
解決辦法
Java多線程
AsyncTask
Handler機制
HandlerThread
IntentService
ListView最佳化
採用ViewHolder並避免在getView中執行耗時操作
根據列表的滑動狀態來控制任務的執行頻率
開啟硬體加速使ListView滑動更流程
Bitmap最佳化
通過BitmapFactory.Options來根據需要對圖片進行採樣
配置inSampleSize參數
線程最佳化
採用線程池
MAT 記憶體泄露分析工具
提供者可維護性
Android開發藝術探索