Android 小技巧
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
原文出處:?Dan Lew???譯文出處:Android Performance???
前言
本文是一篇譯文,這篇是這個(gè)系列的第一篇.講述的是Android開(kāi)發(fā)中遇到的一些好用的小技巧,或者一些實(shí)用的API,很多人都知道,但也有人不知道,記錄下來(lái),如果能幫助到大家,也是極好的.由于不是嚴(yán)格的博文,所以翻譯也不那么嚴(yán)格,有些工具和類我也會(huì)經(jīng)常用,所以我會(huì)根據(jù)自己的想法去寫.有些地方坐在并沒(méi)有將這個(gè)工具的作用講出來(lái),我會(huì)補(bǔ)充上去.
正文
Activity.startActivities()?常用于在應(yīng)用程序中間啟動(dòng)其他的Activity.
TextUtils.isEmpty()?簡(jiǎn)單的工具類,用于檢測(cè)是否為空
Html.fromHtml()?用于生成一個(gè)Html,參數(shù)可以是一個(gè)字符串.個(gè)人認(rèn)為它不是很快,所以我不怎么經(jīng)常去用.(我說(shuō)不經(jīng)常用它是為了重點(diǎn)突出這句話:請(qǐng)多手動(dòng)構(gòu)建 Spannable 來(lái)替換 Html.fromHtml),但是它對(duì)渲染從 web 上獲取的文字還是很不錯(cuò)的。
TextView.setError()?在驗(yàn)證用戶輸入的時(shí)候很棒
Build.VERSION_CODES?這個(gè)標(biāo)明了當(dāng)前的版本號(hào),在處理兼容性問(wèn)題的時(shí)候經(jīng)常會(huì)用到.點(diǎn)進(jìn)去可以看到各個(gè)版本的不同特性
Log.getStackTraceString()?方便的日志類工具,方法Log.v()、Log.d()、Log.i()、Log.w()和Log.e()都是將信息打印到LogCat中,有時(shí)候需要將出錯(cuò)的信息插入到數(shù)據(jù)庫(kù)或一個(gè)自定義的日志文件中,那么這種情況就需要將出錯(cuò)的信息以字符串的形式返回來(lái),也就是使用static String getStackTraceString(Throwable tr)方法的時(shí)候.
LayoutInflater.from()?顧名思義,用于Inflate一個(gè)layout,參數(shù)是layout的id.這個(gè)經(jīng)常寫Adapter的人會(huì)用的比較多.
ViewConfiguration.getScaledTouchSlop()?使用 ViewConfiguration 中提供的值以保證所有觸摸的交互都是統(tǒng)一的。這個(gè)方法獲取的值表示:用戶的手滑動(dòng)這個(gè)距離后,才判定為正在進(jìn)行滑動(dòng).當(dāng)然這個(gè)值也可以自己來(lái)決定.但是為了一致性,還是使用標(biāo)準(zhǔn)的值較好.
PhoneNumberUtils.convertKeypadLettersToDigits?顧名思義.將字母轉(zhuǎn)換為數(shù)字,類似于T9輸入法,
Context.getCacheDir()?獲取緩存數(shù)據(jù)文件夾的路徑,很簡(jiǎn)單但是知道的人不多,這個(gè)路徑通常在SD卡上(這里的SD卡指的是廣義上的SD卡,包括外部存儲(chǔ)和內(nèi)部存儲(chǔ))Adnroid/data/您的應(yīng)用程序包名/cache/ ?下面.測(cè)試的時(shí)候,可以去這里面看是否緩存成功.緩存在這里的好處是:不用自己再去手動(dòng)創(chuàng)建文件夾,不用擔(dān)心用戶把自己創(chuàng)建的文件夾刪掉,在應(yīng)用程序卸載的時(shí)候,這里會(huì)被清空,使用第三方的清理工具的時(shí)候,這里也會(huì)被清空.
ArgbEvaluator?用于處理顏色的漸變。就像?Chris Banes?說(shuō)的一樣,這個(gè)類會(huì)進(jìn)行很多自動(dòng)裝箱的操作,所以最好還是去掉它的邏輯自己去實(shí)現(xiàn)它。這個(gè)沒(méi)用過(guò),不明其所以然,回頭再補(bǔ)充.
ContextThemeWrapper?方便在運(yùn)行的時(shí)候修改主題.
Space?space是Android 4.0中新增的一個(gè)控件,它實(shí)際上可以用來(lái)分隔不同的控件,其中形成一個(gè)空白的區(qū)域.這是一個(gè)輕量級(jí)的視圖組件,它可以跳過(guò)Draw,對(duì)于需要占位符的任何場(chǎng)景來(lái)說(shuō)都是很棒的。
ValueAnimator.reverse()?這個(gè)方法可以很順利地取消正在運(yùn)行的動(dòng)畫.我超喜歡.
DateUtils.formatDateTime()?用來(lái)進(jìn)行區(qū)域格式化工作,輸出格式化和本地化的時(shí)間或者日期。
AlarmManager.setInexactRepeating?通過(guò)鬧鈴分組的方式省電,即使你只調(diào)用了一個(gè)鬧鐘,這也是一個(gè)好的選擇,(可以確保在使用完畢時(shí)自動(dòng)調(diào)用 AlarmManager.cancel ()。原文說(shuō)的比較抽象,這里詳細(xì)說(shuō)一下:setInexactRepeating指的是設(shè)置非準(zhǔn)確鬧鐘,使用方法:alarmManager.setInexactRepeating(AlarmManager.RTC, startTime,intervalL, pendingIntent),非準(zhǔn)確鬧鐘只能保證大致的時(shí)間間隔,但是不一定準(zhǔn)確,可能出現(xiàn)設(shè)置間隔為30分鐘,但是實(shí)際上一次間隔20分鐘,另一次間隔40分鐘。它的最大的好處是可以合并鬧鐘事件,比如間隔設(shè)置每30分鐘一次,不喚醒休眠,在休眠8小時(shí)后已經(jīng)積累了16個(gè)鬧鐘事件,而在手機(jī)被喚醒的時(shí)候,非準(zhǔn)時(shí)鬧鐘可以把16個(gè)事件合并為一個(gè), 所以這么看來(lái),非準(zhǔn)時(shí)鬧鐘一般來(lái)說(shuō)比較節(jié)約能源。
Formatter.formatFileSize()?一個(gè)區(qū)域化的文件大小格式化工具。通俗來(lái)說(shuō)就是把大小轉(zhuǎn)換為MB,G,KB之類的字符串。
ActionBar.hide()/.show()?顧名思義,隱藏和顯示ActionBar,可以優(yōu)雅地在全屏和帶Actionbar之間轉(zhuǎn)換。
Linkify.addLinks()?在Text上添加鏈接。很實(shí)用。
StaticLayout?在自定義 View 中渲染文字的時(shí)候很實(shí)用。
Activity.onBackPressed()?很方便的管理back鍵的方法,有時(shí)候需要自己控制返回鍵的事件的時(shí)候,可以重寫一下。比如加入 “點(diǎn)兩下back鍵退出” 功能。
GestureDetector?用來(lái)監(jiān)聽(tīng)和相應(yīng)對(duì)應(yīng)的手勢(shì)事件,比如點(diǎn)擊,長(zhǎng)按,慢滑動(dòng),快滑動(dòng),用起來(lái)很簡(jiǎn)單,比你自己實(shí)現(xiàn)要方便許多。
DrawFilter?可以讓你在不調(diào)用onDrew方法的情況下,操作canvas,比了個(gè)如,你可以在創(chuàng)建自定義 View 的時(shí)候設(shè)置一個(gè) DrawFilter,給父 View 里面的所有 View 設(shè)置反別名。
ActivityManager.getMemoryClass()?告訴你你的機(jī)器還有多少內(nèi)存,在計(jì)算緩存大小的時(shí)候會(huì)比較有用.
ViewStub?它是一個(gè)初始化不做任何事情的 View,但是之后可以載入一個(gè)布局文件。在慢加載 View 中很適合做占位符。唯一的缺點(diǎn)就是不支持標(biāo)簽,所以如果你不太小心的話,可能會(huì)在視圖結(jié)構(gòu)中加入不需要的嵌套。
SystemClock.sleep()?這個(gè)方法在保證一定時(shí)間的 sleep 時(shí)很方便,通常我用來(lái)進(jìn)行 debug 和模擬網(wǎng)絡(luò)延時(shí)。
DisplayMetrics.density?這個(gè)方法你可以獲取設(shè)備像素密度,大部分時(shí)候最好讓系統(tǒng)來(lái)自動(dòng)進(jìn)行縮放資源之類的操作,但是有時(shí)候控制的效果會(huì)更好一些.(尤其是在自定義View的時(shí)候).
Pair.create()?方便構(gòu)建類和構(gòu)造器的方法。
UrlQuerySanitizer——使用這個(gè)工具可以方便對(duì) URL 進(jìn)行檢查。
Fragment.setArguments——因?yàn)樵跇?gòu)建 Fragment 的時(shí)候不能加參數(shù),所以這是個(gè)很好的東西,可以在創(chuàng)建 Fragment 之前設(shè)置參數(shù)(即使在 configuration 改變的時(shí)候仍然會(huì)導(dǎo)致銷毀/重建)。
DialogFragment.setShowsDialog ()—— 這是一個(gè)很巧妙的方式,DialogFragment 可以作為正常的 Fragment 顯示!這里可以讓 Fragment 承擔(dān)雙重任務(wù)。我通常在創(chuàng)建 Fragment 的時(shí)候把 onCreateView ()和 onCreateDialog ()都加上,就可以創(chuàng)建一個(gè)具有雙重目的的 Fragment。
FragmentManager.enableDebugLogging ()——在需要觀察 Fragment 狀態(tài)的時(shí)候會(huì)有幫助。
LocalBroadcastManager——這個(gè)會(huì)比全局的 broadcast 更加安全,簡(jiǎn)單,快速。像?otto?這樣的 Event buses 機(jī)制對(duì)你的應(yīng)用場(chǎng)景更加有用。
PhoneNumberUtils.formatNumber ()——顧名思義,這是對(duì)數(shù)字進(jìn)行格式化操作的時(shí)候用的。
Region.op()——我發(fā)現(xiàn)在對(duì)比兩個(gè)渲染之前的區(qū)域的時(shí)候很實(shí)用,如果你有兩條路徑,那么怎么知道它們是不是會(huì)重疊呢?使用這個(gè)方法就可以做到。
Application.registerActivityLifecycleCallbacks——雖然缺少官方文檔解釋,不過(guò)我想它就是注冊(cè) Activity 的生命周期的一些回調(diào)方法(顧名思義),就是一個(gè)方便的工具。
versionNameSuffix——這個(gè) gradle 設(shè)置可以讓你在基于不同構(gòu)建類型的 manifest 中修改版本名這個(gè)屬性,例如,如果需要在在 debug 版本中以”-SNAPSHOT”結(jié)尾,那么就可以輕松的看出當(dāng)前是 debug 版還是 release 版。
CursorJoiner——如果你是只使用一個(gè)數(shù)據(jù)庫(kù)的話,使用 SQL 中的 join 就可以了,但是如果收到的數(shù)據(jù)是來(lái)自兩個(gè)獨(dú)立的 ContentProvider,那么 CursorJoiner 就很實(shí)用了。
Genymotion——一個(gè)非常快的 Android 模擬器,本人一直在用。
-nodpi——在沒(méi)有特別定義的情況下,很多修飾符(-mdpi,-hdpi,-xdpi等等)都會(huì)默認(rèn)自動(dòng)縮放 assets/dimensions,有時(shí)候我們需要保持顯示一致,這種情況下就可以使用 -nodpi。
BroadcastRecevier.setDebugUnregister ()——又一個(gè)方便的調(diào)試工具。
Activity.recreate ()——強(qiáng)制讓 Activity 重建。
PackageManager.checkSignatures ()——如果同時(shí)安裝了兩個(gè) app 的話,可以用這個(gè)方法檢查。如果不進(jìn)行簽名檢查的話,其他人可以輕易通過(guò)使用一樣的包名來(lái)模仿你的 app。
Activity.isChangingConfigurations ()——如果在 Activity 中 configuration 會(huì)經(jīng)常改變的話,使用這個(gè)方法就可以不用手動(dòng)做保存狀態(tài)的工作了。
SearchRecentSuggestionsProvider——可以創(chuàng)建最近提示效果的 provider,是一個(gè)簡(jiǎn)單快速的方法。
ViewTreeObserver——這是一個(gè)很棒的工具。可以進(jìn)入到 VIew 里面,并監(jiān)控 View 結(jié)構(gòu)的各種狀態(tài),通常我都用來(lái)做 View 的測(cè)量操作(自定義視圖中經(jīng)常用到)。
org.gradle.daemon=true——這句話可以幫助減少 Gradle 構(gòu)建的時(shí)間,僅在命令行編譯的時(shí)候用到,因?yàn)?Android Studio 已經(jīng)這樣使用了。
DatabaseUtils——一個(gè)包含各種數(shù)據(jù)庫(kù)操作的使用工具。
android:weightSum (LinearLayout)——如果想使用 layout weights,但是卻不想填充整個(gè) LinearLayout 的話,就可以用 weightSum 來(lái)定義總的 weight 大小。
android:duplicateParentState (View)——此方法可以使得子 View 可以復(fù)制父 View 的狀態(tài)。比如如果一個(gè) ViewGroup 是可點(diǎn)擊的,那么可以用這個(gè)方法在它被點(diǎn)擊的時(shí)候讓它的子 View 都改變狀態(tài)。
android:clipChildren (ViewGroup)——如果此屬性設(shè)置為不可用,那么 ViewGroup 的子 View 在繪制的時(shí)候會(huì)超出它的范圍,在做動(dòng)畫的時(shí)候需要用到。
android:fillViewport (ScrollView)——在這片文章中有詳細(xì)介紹文章鏈接,可以解決在 ScrollView 中當(dāng)內(nèi)容不足的時(shí)候填不滿屏幕的問(wèn)題。
android:tileMode (BitmapDrawable)——可以指定圖片使用重復(fù)填充的模式。
android:enterFadeDuration/android:exitFadeDuration (Drawables)——此屬性在 Drawable 具有多種狀態(tài)的時(shí)候,可以定義它展示前的淡入淡出效果。
android:scaleType (ImageView)——定義在 ImageView 中怎么縮放/剪裁圖片,一般用的比較多的是“centerCrop”和“centerInside”。
Merge——此標(biāo)簽可以在另一個(gè)布局文件中包含別的布局文件,而不用再新建一個(gè) ViewGroup,對(duì)于自定義 ViewGroup 的時(shí)候也需要用到;可以通過(guò)載入一個(gè)帶有標(biāo)簽的布局文件來(lái)自動(dòng)定義它的子部件。
AtomicFile——通過(guò)使用備份文件進(jìn)行文件的原子化操作。這個(gè)知識(shí)點(diǎn)之前我也寫過(guò),不過(guò)最好還是有出一個(gè)官方的版本比較好。
ViewDragHelper?——視圖拖動(dòng)是一個(gè)比較復(fù)雜的問(wèn)題。這個(gè)類可以幫助解決不少問(wèn)題。如果你需要一個(gè)例子,DrawerLayout就是利用它實(shí)現(xiàn)掃滑。Flavient Laurent 還寫了一些關(guān)于這方面的優(yōu)秀文章。
PopupWindow——Android到處都在使用PopupWindow ,甚至你都沒(méi)有意識(shí)到(標(biāo)題導(dǎo)航條ActionBar,自動(dòng)補(bǔ)全AutoComplete,編輯框錯(cuò)誤提醒Edittext Errors)。這個(gè)類是創(chuàng)建浮層內(nèi)容的主要方法。
Actionbar.getThemrContext()——導(dǎo)航欄的主題化是很復(fù)雜的(不同于Activity其他部分的主題化)。你可以得到一個(gè)上下文(Context),用這個(gè)上下文創(chuàng)建的自定義組件可以得到正確的主題。
ThumbnailUtils——幫助創(chuàng)建縮略圖。通常我都是用現(xiàn)有的圖片加載庫(kù)(比如,Picasso 或者 Volley),不過(guò)這個(gè)ThumbnaiUtils可以創(chuàng)建視頻縮略圖。譯者注:該API從V8才開(kāi)始支持。
Context.getExternalFilesDir()———— 申請(qǐng)了SD卡寫權(quán)限后,你可以在SD的任何地方寫數(shù)據(jù),把你的數(shù)據(jù)寫在設(shè)計(jì)好的合適位置會(huì)更加有禮貌。這樣數(shù)據(jù)可以及時(shí)被清理,也會(huì)有更好的用戶體驗(yàn)。此外,Android 4.0 Kitkat中在這個(gè)文件夾下寫數(shù)據(jù)是不需要權(quán)限的,每個(gè)用戶有自己的獨(dú)立的數(shù)據(jù)存儲(chǔ)路徑。譯者注:該API從V8才開(kāi)始支持。
SparseArray——Map的高效優(yōu)化版本。推薦了解姐妹類SparseBooleanArray、SparseIntArray和SparseLongArray。
PackageManager.setComponentEnabledSetting()——可以用來(lái)啟動(dòng)或者禁用程序清單中的組件。對(duì)于關(guān)閉不需要的功能組件是非常贊的,比如關(guān)掉一個(gè)當(dāng)前不用的廣播接收器。
SQLiteDatabase.yieldIfContendedSafely()——讓你暫時(shí)停止一個(gè)數(shù)據(jù)庫(kù)事務(wù), 這樣你可以就不會(huì)占用太多的系統(tǒng)資源。
Environment.getExternalStoragePublicDirectory()——還是那句話,用戶期望在SD卡上得到統(tǒng)一的用戶體驗(yàn)。用這個(gè)方法可以獲得在用戶設(shè)備上放置指定類型文件(音樂(lè)、圖片等)的正確目錄。
View.generateViewId()——每次我都想要推薦動(dòng)態(tài)生成控件的ID。需要注意的是,不要和已經(jīng)存在的控件ID或者其他已經(jīng)生成的控件ID重復(fù)。
ActivityManager.clearApplicationUserData()—— 一鍵清理你的app產(chǎn)生的用戶數(shù)據(jù),可能是做用戶退出登錄功能,有史以來(lái)最簡(jiǎn)單的方式了。
Context.createConfigurationContext()?——自定義你的配置環(huán)境信息。我通常會(huì)遇到這樣的問(wèn)題:強(qiáng)制讓一部分顯示在某個(gè)特定的環(huán)境下(倒不是我一直這樣瞎整,說(shuō)來(lái)話長(zhǎng),你很難理解)。用這個(gè)實(shí)現(xiàn)起來(lái)可以稍微簡(jiǎn)單一點(diǎn)。
ActivityOptions?——方便的定義兩個(gè)Activity切換的動(dòng)畫。 使用ActivityOptionsCompat?可以很好解決舊版本的兼容問(wèn)題。
AdapterViewFlipper.fyiWillBeAdvancedByHostKThx()——僅僅因?yàn)楹芎猛?#xff0c;沒(méi)有其他原因。在整個(gè)安卓開(kāi)源項(xiàng)目中(AOSP the Android ——pen Source Project Android開(kāi)放源代碼項(xiàng)目)中還有其他很有意思的東西(比如
GRAVITY_DEATH_STAR_I)。不過(guò),都不像這個(gè)這樣,這個(gè)確實(shí)有用
ViewParent.requestDisallowInterceptTouchEvent()?——Android系統(tǒng)觸摸事件機(jī)制大多時(shí)候能夠默認(rèn)處理,不過(guò)有時(shí)候你需要使用這個(gè)方法來(lái)剝奪父級(jí)控件的控制權(quán)(順便說(shuō)一下,如果你想對(duì)Android觸摸機(jī)制了解更多,這個(gè)演講會(huì)令你驚嘆不已。)
防止截屏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);?
轉(zhuǎn)載于:https://my.oschina.net/yaly/blog/739226
總結(jié)
以上是生活随笔為你收集整理的Android 小技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux 大规模请求服务器连接数相关设
- 下一篇: AFNetworking 3.0 源码解