Android開發藝術探索

來源:互聯網
上載者:User

標籤: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開發藝術探索

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.