1. 程式人生 > >Android小經驗

Android小經驗

lis ont view andro rpi 方便 sans 圖片緩存 eee

轉載自:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dca68cdda2212dec4d86c0&scene=21#wechat_redirect

今天是馮建同學投稿。總結他在Android開發方面的各種小經驗,我認為很有意義,所謂經驗豐富有時候是指積累的這些小經驗許多,他這篇分享相信會幫助到一些朋友。我也曾推薦過他的 APK魔鬼瘦身 一文。沒看過的朋友也能夠再去看看。

做Android久了,就會踩非常多坑,被坑得多了就有經驗了,閑暇之余整理了部分,現挑選一些重要或者偏門的“小”經驗做個記錄。

查看SQLite日誌

技術分享
由於實現裏用了Log.isLoggable(TAG, Log.VERBOSE)做了推斷,在LessCode的LogLess中也參考了這樣的機制:https://github.com/openproject/LessCode/blob/master/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java

使用這樣的方法就能夠在Release版本號也能做到查看應用的打印日誌了。

PNG優化

APK打包會自己主動對PNG進行無損壓縮,假設自行無損壓縮是無效的。
當然進行有損壓縮是能夠的:https://tinypng.com/

Tcpdump抓包

有些模擬器比方genymotion自帶了tcpdump,假設沒有的話,須要下載tcpdump:
http://www.strazzere.com/android/tcpdump


把tcpdump push到/data/local下。抓包命令:

技術分享

查看簽名

非常多開發人員服務都須要綁定簽名信息,用以下的命令能夠查看簽名:
技術分享
註意,這個是須要password的,能夠查看MD5, SHA1。SHA256等等。

單例模式(懶漢式)的最佳寫法

特別講到這個問題。是由於網上非常多這種代碼:
技術分享
這樣的寫法線程不安全,改進一下,加一個同步鎖:
技術分享
網上這種代碼很多其它。能夠非常好的工作,可是缺點是效率低。

實際上。早在JDK1.5就引入volatilekeyword,所以又有了一種更好的雙重校驗鎖寫法:

技術分享
這才是最佳寫法!

。!


不是說另外一種寫法有問題,或者在Android中一定要用第三種寫法。僅僅是告訴大家一種更好的寫法。

多進程Application

是不是常常發現Application裏的方法運行了多次?百思不得其解。

由於當有多個進程的時候。Application會運行多次,能夠通過pid來推斷那些方法僅僅運行一次,避免浪費資源。

隱式啟動Service

這是Android5.0的一個修改。不支持隱式的Service調用。以下的代碼在Android 5.0+上會報錯:Service Intent must be explicit:
技術分享
可改成例如以下:

技術分享

fill_parent的壽命

在Android2.2之後,支持使用match_parent。你的布局文件中是不是既有fill_parent和match_parent顯得非常亂?

假設你如今的minSdkVersion是8+的話。就能夠忽略fill_parent。統一使用match_parent了,否則請使用fill_parent。

ListView的局部刷新

有的列表可能notifyDataSetChanged()代價有點高,最好能局部刷新。

局部刷新的重點是,找到要更新的那項的View,然後再依據業務邏輯更新數據就可以。
技術分享
強調一下。最後那個列表數據別忘記更新, 不然數據源不變。一滾動可能又還原了。

系統日誌中幾個重要的TAG

技術分享

一行居中,多行居左的TextView

這個一般用於提示信息對話框,假設文字是一行就居中。多行就居左。
在TextView外套一層wrap_content的ViewGroup就可以簡單實現:

技術分享

setCompoundDrawablesWithIntrinsicBounds()

網上一大堆setCompoundDrawables()方法無效不顯示的問題,然後解決方法是setBounds。須要計算大小…


不用這麽麻煩,用setCompoundDrawablesWithIntrinsicBounds()這種方法最簡單!

計算程序執行時間

為了計算一段代碼執行時間,一般的做法是,在代碼的前面加個startTime,在代碼的後面把當前時間減去startTime,這個時間差就是執行時間。

這裏提供一種寫起來更方便的方法。全然無時間邏輯。僅僅是加一個打印log就夠了。
技術分享
沒有計算時間的邏輯,這能測出來?

把日誌過濾出來,執行命令“adb logcat -v time | grep TAG”:
技術分享
通過-v time參數,能夠比較日誌左邊的時間來算出中間的代碼執行的時間。

Java引用類型一覽表

技術分享

Context使用場景

為了防止Activity,Service等這種Context泄漏於一些生命周期更長的對象,能夠使用生命周期更長的ApplicationContext,可是不是全部的Context的都能替換為ApplicationContext

這是網上流傳的一份表格:
技術分享

圖片緩存大小

如今非常多圖片庫須要給圖片設置一個最大緩存。可是這個值設置多少合適呢?

高端機和低端機的配置顯然應該不同,能夠考慮設置一個動態值。

建議設置為應用可用內存的1/8:

技術分享

系統內置的一些工具類

在AOSP源代碼全局搜了一下包括Utilkeyword的類。整理出這個列表供大家參考:

技術分享

這麽多工具類,一定能夠找到對你實用的。

ClipPadding

這個不多說,ListView的ClipPadding設為false。就能為ListView設置各種padding而不會出現醜陋的滑動“禁區”了。

強大的dumpsys

dumpsys能夠查看系統服務和狀態,很強大,可通過例如以下查看全部支持的子命令:
技術分享
這裏列舉幾個略微經常使用的:
技術分享

bugreport命令

非常多人都用過adb logcat,可是假設想要更具體的信息,logcat則無能為力。

所以大多數手機廠商測試很多其它的是用adb bugreport來抓log給開發者分析。

技術分享

dpi目錄的換算比例

技術分享

更新媒體庫文件

曾經做ROM的時候常常碰到一些第三方軟件(某音樂APP)下載了新文件或刪除文件之後,可是媒體庫並沒有更新,由於這個是須要第三方軟件主動觸發。
技術分享
媒體庫會在手機啟動。SD卡插拔的情況下進行全盤掃描,不是實時的並且代價比較大,所以單個文件的刷新非常有必要。

Monkey參數

大家都知道,跑monkey的參數設置有一些要註意的地方,比方太快了不行不切實際,太慢了也不行等等。這裏給出一個參考:

技術分享
一邊跑monkey,一遍抓log吧。

小結

不管是大經驗還是小經驗,都是好經驗,關鍵時候出奇效。

Android小經驗