1、Throwable接口中的getStackTrace()方法(或者Thread類的getStackTrace()方法),根據(jù)這個方法可以得到函數(shù)的逐層調(diào)用地址,其返回值為StackTraceElement[]固逗;
2晨仑、StackTraceElement類,其中四個方法getClassName()痴颊,getFileName()赏迟,getLineNumber(),getMethodName()在調(diào)試程序打印Log時非常有用蠢棱;
3锌杀、UncaughtExceptionHandler接口,再好的代碼異常難免泻仙,利用此接口可以對未捕獲的異常善后糕再;
使用參見:Android使用UncaughtExceptionHandler捕獲全局異常
4、Resources類中的getIdentifier(name, defType, defPackage)方法玉转,根據(jù)資源名稱獲取其ID突想,做UI時經(jīng)常用到;
5究抓、View中的isShown()方法猾担,以前都是用view.getVisibility() == View.VISIBLE來判斷的(╯□╰);(謝評論提醒刺下,這里面其實有一個坑:【android】view.isShown ()的用法)
6绑嘹、Arrays類中的一系列關(guān)于數(shù)組操作的工具方法:binarySearch(),asList()橘茉,equals()工腋,sort(),toString()畅卓,copyOfRange()等擅腰;
Collections類中的一系列關(guān)于集合操作的工具方法:sort(),reverse()等髓介;
7惕鼓、android.text.format.Formatter類中formatFileSize(Context, long)方法,用來格式化文件Size(B → KB → MB → GB)唐础;
8箱歧、android.media.ThumbnailUtils類,用來獲取媒體(圖片一膨、視頻)縮略圖呀邢;
9、String類中的format(String, Object...)方法豹绪,用來格式化strings.xml中的字符串(多謝
提示:Context類中g(shù)etString(int, Object... )方法用起來更加方便)价淌;
10申眼、View類中的三個方法:callOnClick(),performClick()蝉衣,performLongClick()括尸,用于觸發(fā)View的點擊事件;
11病毡、TextUtils類中的isEmpty(CharSequence)方法濒翻,判斷字符串是否為null或"";
12啦膜、TextView類中的append(****CharSequence****)方法有送,添加文本。一些特殊文本直接用+連接會變成String僧家;
13雀摘、View類中的getDrawingCache()等一系列方法,目前只知道可以用來截圖八拱;
14阵赠、DecimalFormat類,用于字串格式化包括指定位數(shù)乘粒、百分數(shù)豌注、科學(xué)計數(shù)法等;
15灯萍、System類中的arraycopy(src, srcPos, dest, destPos, length)方法轧铁,用來copy數(shù)組;
16旦棉、Fragment類中的onHiddenChanged(boolean)方法齿风,使用FragmentTransaction中的hide(),show()時貌似Fragment的其它生命周期方法都不會被調(diào)用绑洛,太坑爹救斑!
17、Activity類中的onWindowFocusChanged(boolean)真屯,onNewIntent(intent)等回調(diào)方法脸候;
18、View類中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法绑蔫,獲取View在窗口/屏幕中的位置运沦;
19、TextView類中的setTransformationMethod(TransformationMethod)方法,可用來實現(xiàn)“顯示密碼”功能;
20波岛、TextWatcher接口,用來監(jiān)聽文本輸入框內(nèi)容的改變虎韵,可用來實現(xiàn)一系列具有特殊功能的文本輸入框抑淫;
21鞠抑、View類中的setSelected(boolean)方法結(jié)合android:state_selected=""用來實現(xiàn)圖片選中效果跷叉;
22左敌、Surface設(shè)置透明:SurfaceView.setZOrderOnTop(true);
SurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);但是會擋住其它控件瘾蛋;
23、ListView或GridView類中的setFastScrollEnabled(boolean)方法矫限,用來設(shè)置快速滾動滑塊是否可見瘦黑,當(dāng)然前提是item夠多;
24奇唤、PageTransformer接口,用來自定義ViewPager頁面切換動畫匹摇,用setPageTransformer(boolean, PageTransformer)方法來進行設(shè)置咬扇;
25、apache提供的一系列jar包:commons-lang.jar廊勃,commons-collections.jar懈贺,commons-beanutils.jar等,里面很多方法可能是你曾經(jīng)用幾十幾百行代碼實現(xiàn)過的坡垫,但是執(zhí)行效率或許要差很多梭灿,比如:ArrayUtils,StringUtils……冰悠;
26堡妒、AndroidTestCase類,Android單元測試溉卓,在AndroidStudio中使用非常方便皮迟;
27、TextView類的setKeyListener(KeyListener)方法桑寨;
其中DigitsKeyListener類伏尼,使用getInstance(String accepted)方法即可指定EditText可輸入字符集;
28尉尾、ActivityLifecycleCallbacks接口爆阶,用于在Application類中監(jiān)聽各Activity的狀態(tài)變化;
29沙咏、Context類中的createPackageContext(packageName, flags)方法辨图,可用來獲取指定包名應(yīng)用程序的Context對象。
Part 1:
Activity.startActivities() 常用于在應(yīng)用程序中間啟動其他的Activity芭碍。
TextUtils.isEmpty() 簡單的工具類,用于檢測是否為空徒役。
Html.fromHtml() 用于生成一個Html,參數(shù)可以是一個字符串.個人認為它不是很快,所以我不怎么經(jīng)常去用.(我說不經(jīng)常用它是為了重點突出這句話:請多手動構(gòu)建 Spannable 來替換 Html.fromHtml),但是它對渲染從 web 上獲取的文字還是很不錯的窖壕。
TextView.setError() 在驗證用戶輸入的時候很棒忧勿。
Build.VERSION_CODES 這個標(biāo)明了當(dāng)前的版本號,在處理兼容性問題的時候經(jīng)常會用到.點進去可以看到各個版本的不同特性杉女。
Log.getStackTraceString() 方便的日志類工具,方法Log.v()、Log.d()鸳吸、Log.i()熏挎、Log.w()和Log.e()都是將信息打印到LogCat中,有時候需要將出錯的信息插入到數(shù)據(jù)庫或一個自定義的日志文件中晌砾,那么這種情況就需要將出錯的信息以字符串的形式返回來坎拐,也就是使用static String getStackTraceString(Throwable tr)方法的時候。
LayoutInflater.from() 顧名思義,用于Inflate一個layout,參數(shù)是layout的id.這個經(jīng)常寫Adapter的人會用的比較多养匈。
ViewConfiguration.getScaledTouchSlop() 使用 ViewConfiguration 中提供的值以保證所有觸摸的交互都是統(tǒng)一的哼勇。這個方法獲取的值表示:用戶的手滑動這個距離后,才判定為正在進行滑動.當(dāng)然這個值也可以自己來決定.但是為了一致性,還是使用標(biāo)準(zhǔn)的值較好。
PhoneNumberUtils.convertKeypadLettersToDigits 顧名思義.將字母轉(zhuǎn)換為數(shù)字,類似于T9輸入法,
Context.getCacheDir() 獲取緩存數(shù)據(jù)文件夾的路徑,很簡單但是知道的人不多,這個路徑通常在SD卡上(這里的SD卡指的是廣義上的SD卡,包括外部存儲和內(nèi)部存儲)Adnroid/data/您的應(yīng)用程序包名/cache/ 下面.測試的時候,可以去這里面看是否緩存成功.緩存在這里的好處是:不用自己再去手動創(chuàng)建文件夾,不用擔(dān)心用戶把自己創(chuàng)建的文件夾刪掉,在應(yīng)用程序卸載的時候,這里會被清空,使用第三方的清理工具的時候,這里也會被清空呕乎。
ArgbEvaluator 用于處理顏色的漸變积担。就像 Chris Banes 說的一樣,這個類會進行很多自動裝箱的操作猬仁,所以最好還是去掉它的邏輯自己去實現(xiàn)它帝璧。這個沒用過,不明其所以然,回頭再補充.
ContextThemeWrapper 方便在運行的時候修改主題。
Space space是Android 4.0中新增的一個控件湿刽,它實際上可以用來分隔不同的控件的烁,其中形成一個空白的區(qū)域.這是一個輕量級的視圖組件,它可以跳過Draw诈闺,對于需要占位符的任何場景來說都是很棒的渴庆。
ValueAnimator.reverse() 這個方法可以很順利地取消正在運行的動畫。
Part 2:
DateUtils.formatDateTime() 用來進行區(qū)域格式化工作买雾,輸出格式化和本地化的時間或者日期把曼。
AlarmManager.setInexactRepeating 通過鬧鈴分組的方式省電,即使你只調(diào)用了一個鬧鐘漓穿,這也是一個好的選擇嗤军,(可以確保在使用完畢時自動調(diào)用 AlarmManager.cancel ()。原文說的比較抽象晃危,這里詳細說一下:setInexactRepeating指的是設(shè)置非準(zhǔn)確鬧鐘叙赚,使用方法:alarmManager.setInexactRepeating(AlarmManager.RTC, startTime僚饭,intervalL震叮, pendingIntent),非準(zhǔn)確鬧鐘只能保證大致的時間間隔鳍鸵,但是不一定準(zhǔn)確苇瓣,可能出現(xiàn)設(shè)置間隔為30分鐘,但是實際上一次間隔20分鐘偿乖,另一次間隔40分鐘击罪。它的最大的好處是可以合并鬧鐘事件哲嘲,比如間隔設(shè)置每30分鐘一次,不喚醒休眠媳禁,在休眠8小時后已經(jīng)積累了16個鬧鐘事件眠副,而在手機被喚醒的時候,非準(zhǔn)時鬧鐘可以把16個事件合并為一個竣稽, 所以這么看來囱怕,非準(zhǔn)時鬧鐘一般來說比較節(jié)約能源。
Formatter.formatFileSize() 一個區(qū)域化的文件大小格式化工具毫别。通俗來說就是把大小轉(zhuǎn)換為MB娃弓,G,KB之類的字符串岛宦。
ActionBar.hide()/.show() 顧名思義忘闻,隱藏和顯示ActionBar,可以優(yōu)雅地在全屏和帶Actionbar之間轉(zhuǎn)換恋博。
Linkify.addLinks() 在Text上添加鏈接。很實用私恬。
StaticLayout 在自定義 View 中渲染文字的時候很實用债沮。
Activity.onBackPressed() 很方便的管理back鍵的方法,有時候需要自己控制返回鍵的事件的時候本鸣,可以重寫一下疫衩。比如加入 “點兩下back鍵退出” 功能。
GestureDetector 用來監(jiān)聽和相應(yīng)對應(yīng)的手勢事件荣德,比如點擊闷煤,長按,慢滑動涮瞻,快滑動鲤拿,用起來很簡單,比你自己實現(xiàn)要方便許多署咽。
DrawFilter 可以讓你在不調(diào)用onDrew方法的情況下近顷,操作canvas,比了個如宁否,你可以在創(chuàng)建自定義 View 的時候設(shè)置一個 DrawFilter窒升,給父 View 里面的所有 View 設(shè)置反別名。
ActivityManager.getMemoryClass() 告訴你你的機器還有多少內(nèi)存慕匠,在計算緩存大小的時候會比較有用饱须。
ViewStub 它是一個初始化不做任何事情的 View,但是之后可以載入一個布局文件台谊。在慢加載 View 中很適合做占位符蓉媳。唯一的缺點就是不支持標(biāo)簽譬挚,所以如果你不太小心的話,可能會在視圖結(jié)構(gòu)中加入不需要的嵌套督怜。
SystemClock.sleep() 這個方法在保證一定時間的 sleep 時很方便殴瘦,通常我用來進行 debug 和模擬網(wǎng)絡(luò)延時。
DisplayMetrics.density 這個方法你可以獲取設(shè)備像素密度号杠,大部分時候最好讓系統(tǒng)來自動進行縮放資源之類的操作蚪腋,但是有時候控制的效果會更好一些.(尤其是在自定義View的時候)。
Pair.create() 方便構(gòu)建類和構(gòu)造器的方法姨蟋。
Part 3:
UrlQuerySanitizer——使用這個工具可以方便對 URL 進行檢查屉凯。
Fragment.setArguments——因為在構(gòu)建 Fragment 的時候不能加參數(shù),所以這是個很好的東西眼溶,可以在創(chuàng)建 Fragment 之前設(shè)置參數(shù)(即使在 configuration 改變的時候仍然會導(dǎo)致銷毀/重建)悠砚。
DialogFragment.setShowsDialog ()—— 這是一個很巧妙的方式,DialogFragment 可以作為正常的 Fragment 顯示堂飞!這里可以讓 Fragment 承擔(dān)雙重任務(wù)灌旧。我通常在創(chuàng)建 Fragment 的時候把 onCreateView ()和 onCreateDialog ()都加上,就可以創(chuàng)建一個具有雙重目的的 Fragment绰筛。
FragmentManager.enableDebugLogging ()——在需要觀察 Fragment 狀態(tài)的時候會有幫助枢泰。
LocalBroadcastManager——這個會比全局的 broadcast 更加安全,簡單铝噩,快速衡蚂。像 otto 這樣的 Event buses 機制對你的應(yīng)用場景更加有用。
PhoneNumberUtils.formatNumber ()——顧名思義骏庸,這是對數(shù)字進行格式化操作的時候用的毛甲。
Region.op()——我發(fā)現(xiàn)在對比兩個渲染之前的區(qū)域的時候很實用,如果你有兩條路徑具被,那么怎么知道它們是不是會重疊呢玻募?使用這個方法就可以做到。
Application.registerActivityLifecycleCallbacks——雖然缺少官方文檔解釋一姿,不過我想它就是注冊 Activity 的生命周期的一些回調(diào)方法(顧名思義)补箍,就是一個方便的工具。
versionNameSuffix——這個 gradle 設(shè)置可以讓你在基于不同構(gòu)建類型的 manifest 中修改版本名這個屬性啸蜜,例如坑雅,如果需要在在 debug 版本中以”-SNAPSHOT”結(jié)尾,那么就可以輕松的看出當(dāng)前是 debug 版還是 release 版衬横。
CursorJoiner——如果你是只使用一個數(shù)據(jù)庫的話裹粤,使用 SQL 中的 join 就可以了,但是如果收到的數(shù)據(jù)是來自兩個獨立的 ContentProvider,那么 CursorJoiner 就很實用了遥诉。
Genymotion——一個非衬雌快的 Android 模擬器,本人一直在用矮锈。
-nodpi——在沒有特別定義的情況下霉翔,很多修飾符(-mdpi,-hdpi,-xdpi等等)都會默認自動縮放 assets/dimensions,有時候我們需要保持顯示一致苞笨,這種情況下就可以使用 -nodpi债朵。
BroadcastRecevier.setDebugUnregister ()——又一個方便的調(diào)試工具。
Activity.recreate ()——強制讓 Activity 重建瀑凝。
PackageManager.checkSignatures ()——如果同時安裝了兩個 app 的話序芦,可以用這個方法檢查。如果不進行簽名檢查的話粤咪,其他人可以輕易通過使用一樣的包名來模仿你的 app谚中。
Part 4:
Activity.isChangingConfigurations ()——如果在 Activity 中 configuration 會經(jīng)常改變的話,使用這個方法就可以不用手動做保存狀態(tài)的工作了寥枝。
SearchRecentSuggestionsProvider——可以創(chuàng)建最近提示效果的 provider宪塔,是一個簡單快速的方法。
ViewTreeObserver——這是一個很棒的工具囊拜◎螋铮可以進入到 VIew 里面,并監(jiān)控 View 結(jié)構(gòu)的各種狀態(tài)艾疟,通常我都用來做 View 的測量操作(自定義視圖中經(jīng)常用到)。
org.gradle.daemon=true——這句話可以幫助減少 Gradle 構(gòu)建的時間敢辩,僅在命令行編譯的時候用到蔽莱,因為 Android Studio 已經(jīng)這樣使用了。
DatabaseUtils——一個包含各種數(shù)據(jù)庫操作的使用工具戚长。
android:weightSum (LinearLayout)——如果想使用 layout weights盗冷,但是卻不想填充整個 LinearLayout 的話,就可以用 weightSum 來定義總的 weight 大小同廉。
android:duplicateParentState (View)——此方法可以使得子 View 可以復(fù)制父 View 的狀態(tài)仪糖。比如如果一個 ViewGroup 是可點擊的,那么可以用這個方法在它被點擊的時候讓它的子 View 都改變狀態(tài)迫肖。
android:clipChildren (ViewGroup)——如果此屬性設(shè)置為不可用锅劝,那么 ViewGroup 的子 View 在繪制的時候會超出它的范圍,在做動畫的時候需要用到蟆湖。
android:fillViewport (ScrollView)——在這片文章中有詳細介紹文章鏈接故爵,可以解決在 ScrollView 中當(dāng)內(nèi)容不足的時候填不滿屏幕的問題。
android:tileMode (BitmapDrawable)——可以指定圖片使用重復(fù)填充的模式隅津。
android:enterFadeDuration/android:exitFadeDuration (Drawables)——此屬性在 Drawable 具有多種狀態(tài)的時候诬垂,可以定義它展示前的淡入淡出效果劲室。
android:scaleType (ImageView)——定義在 ImageView 中怎么縮放/剪裁圖片,一般用的比較多的是“centerCrop”和“centerInside”结窘。
Merge——此標(biāo)簽可以在另一個布局文件中包含別的布局文件很洋,而不用再新建一個 ViewGroup,對于自定義 ViewGroup 的時候也需要用到;可以通過載入一個帶有標(biāo)簽的布局文件來自動定義它的子部件横腿。
AtomicFile——通過使用備份文件進行文件的原子化操作斋射。這個知識點之前我也寫過,不過最好還是有出一個官方的版本比較好线定。
Part 5:
ViewDragHelper ——視圖拖動是一個比較復(fù)雜的問題。這個類可以幫助解決不少問題确买。如果你需要一個例子斤讥,DrawerLayout就是利用它實現(xiàn)掃滑。Flavient Laurent 還寫了一些關(guān)于這方面的優(yōu)秀文章湾趾。
PopupWindow——Android到處都在使用PopupWindow 芭商,甚至你都沒有意識到(標(biāo)題導(dǎo)航條ActionBar,自動補全AutoComplete搀缠,編輯框錯誤提醒Edittext Errors)铛楣。這個類是創(chuàng)建浮層內(nèi)容的主要方法。
Actionbar.getThemrContext()——導(dǎo)航欄的主題化是很復(fù)雜的(不同于Activity其他部分的主題化)艺普。你可以得到一個上下文(Context)簸州,用這個上下文創(chuàng)建的自定義組件可以得到正確的主題。
ThumbnailUtils——幫助創(chuàng)建縮略圖歧譬。通常我都是用現(xiàn)有的圖片加載庫(比如岸浑,Picasso 或者 Volley),不過這個ThumbnaiUtils可以創(chuàng)建視頻縮略圖瑰步。譯者注:該API從V8才開始支持矢洲。
Context.getExternalFilesDir()———— 申請了SD卡寫權(quán)限后,你可以在SD的任何地方寫數(shù)據(jù)缩焦,把你的數(shù)據(jù)寫在設(shè)計好的合適位置會更加有禮貌读虏。這樣數(shù)據(jù)可以及時被清理,也會有更好的用戶體驗袁滥。此外盖桥,Android 4.0 Kitkat中在這個文件夾下寫數(shù)據(jù)是不需要權(quán)限的,每個用戶有自己的獨立的數(shù)據(jù)存儲路徑题翻。譯者注:該API從V8才開始支持葱轩。
SparseArray——Map的高效優(yōu)化版本。推薦了解姐妹類SparseBooleanArray、SparseIntArray和SparseLongArray靴拱。
PackageManager.setComponentEnabledSetting()——可以用來啟動或者禁用程序清單中的組件垃喊。對于關(guān)閉不需要的功能組件是非常贊的,比如關(guān)掉一個當(dāng)前不用的廣播接收器袜炕。
SQLiteDatabase.yieldIfContendedSafely()——讓你暫時停止一個數(shù)據(jù)庫事務(wù)本谜, 這樣你可以就不會占用太多的系統(tǒng)資源。
Environment.getExternalStoragePublicDirectory()——還是那句話偎窘,用戶期望在SD卡上得到統(tǒng)一的用戶體驗乌助。用這個方法可以獲得在用戶設(shè)備上放置指定類型文件(音樂、圖片等)的正確目錄陌知。
View.generateViewId()——每次我都想要推薦動態(tài)生成控件的ID他托。需要注意的是,不要和已經(jīng)存在的控件ID或者其他已經(jīng)生成的控件ID重復(fù)仆葡。
ActivityManager.clearApplicationUserData()—— 一鍵清理你的app產(chǎn)生的用戶數(shù)據(jù)赏参,可能是做用戶退出登錄功能,有史以來最簡單的方式了沿盅。
Context.createConfigurationContext() ——自定義你的配置環(huán)境信息把篓。我通常會遇到這樣的問題:強制讓一部分顯示在某個特定的環(huán)境下(倒不是我一直這樣瞎整,說來話長腰涧,你很難理解)韧掩。用這個實現(xiàn)起來可以稍微簡單一點。
ActivityOptions ——方便的定義兩個Activity切換的動畫窖铡。 使用ActivityOptionsCompat 可以很好解決舊版本的兼容問題疗锐。
AdapterViewFlipper.fyiWillBeAdvancedByHostKThx()——僅僅因為很好玩,沒有其他原因费彼。在整個安卓開源項目中(AOSP the Android ——pen Source Project Android開放源代碼項目)中還有其他很有意思的東西(比如
GRAVITY_DEATH_STAR_I)滑臊。不過,都不像這個這樣敌买,這個確實有用
ViewParent.requestDisallowInterceptTouchEvent() ——Android系統(tǒng)觸摸事件機制大多時候能夠默認處理,不過有時候你需要使用這個方法來剝奪父級控件的控制權(quán)阶界。
1虹钮、android:clipChildren 和 android:clipToPadding:clipToPadding就是說控件的繪制區(qū)域是否在padding里面的,true的情況下如果你設(shè)置了padding那么繪制的區(qū)域就往里 縮膘融,clipChildren是指子控件是否超過padding區(qū)域芙粱,這兩個屬性默認是true的,所以在設(shè)置了padding情況下氧映,默認滾動是在 padding內(nèi)部的春畔,要達到上面的效果主要把這兩個屬性設(shè)置了false那么這樣子控件就能畫到padding的區(qū)域了。使用場景如:ActionBar(透明)下顯示Listview而第一項要在actionbar下。參見 android:clipToPadding和android:clipChildren律姨。
2振峻、Fragment 的 setUserVisibleHint 方法,可實現(xiàn) fragment 對用戶可見時才加載資源(延遲加載)择份。
3扣孟、自定義 View 時重寫 hasOverlappingRendering 方法指定 View 是否有 Overlapping 的情況,提高渲染性能荣赶。
4凤价、AutoScrollHelper,在可滾動視圖中長按邊緣實現(xiàn)滾動拔创,Android View.OnTouchListener 的子類利诺。
5、TouchSlop剩燥,系統(tǒng)所能識別出的被認為是最小的滑動距慢逾。離,ViewConfiguration.get(context).getScaledTouchSlop()躏吊。
6氛改、VelocityTracker,可用于 View 滑動事件速度跟蹤比伏。
7胜卤、AlphabetIndexer,字母索引輔助類赁项。
8葛躏、Messenger,AIDL 實現(xiàn)的封裝悠菜,比手寫 AIDL 更方便舰攒。
9、ArrayMap悔醋,比 HashMap 更高的內(nèi)存效率摩窃,但比 HashMap 慢,不適合有大量數(shù)據(jù)的場景芬骄。
10猾愿、Property,抽象類账阻,封裝出對象中的一個易變的屬性值蒂秘,使用場景如在使用屬性動畫時對動畫屬性的操作。
11淘太、SortedList姻僧,v7 包中规丽,見名知意。
1撇贺、android:clipChildren 和 android:clipToPadding:clipToPadding就是說控件的繪制區(qū)域是否在padding里面的赌莺,true的情況下如果你設(shè)置了padding那么繪制的區(qū)域就往里 縮,clipChildren是指子控件是否超過padding區(qū)域显熏,這兩個屬性默認是true的雄嚣,所以在設(shè)置了padding情況下,默認滾動是在 padding內(nèi)部的喘蟆,要達到上面的效果主要把這兩個屬性設(shè)置了false那么這樣子控件就能畫到padding的區(qū)域了缓升。使用場景如:ActionBar(透明)下顯示Listview而第一項要在actionbar下。參見 android:clipToPadding和android:clipChildren蕴轨。
2港谊、Fragment 的 setUserVisibleHint 方法,可實現(xiàn) fragment 對用戶可見時才加載資源(延遲加載)橙弱。
3歧寺、自定義 View 時重寫 hasOverlappingRendering 方法指定 View 是否有 Overlapping 的情況,提高渲染性能棘脐。
4斜筐、AutoScrollHelper,在可滾動視圖中長按邊緣實現(xiàn)滾動蛀缝,Android View.OnTouchListener 的子類顷链。
5、TouchSlop屈梁,系統(tǒng)所能識別出的被認為是最小的滑動距嗤练。離,ViewConfiguration.get(context).getScaledTouchSlop()在讶。
6煞抬、VelocityTracker,可用于 View 滑動事件速度跟蹤构哺。
7革答、AlphabetIndexer,字母索引輔助類曙强。
8残拐、Messenger,AIDL 實現(xiàn)的封裝旗扑,比手寫 AIDL 更方便蹦骑。
9慈省、ArrayMap臀防,比 HashMap 更高的內(nèi)存效率眠菇,但比 HashMap 慢,不適合有大量數(shù)據(jù)的場景袱衷。
10捎废、Property,抽象類致燥,封裝出對象中的一個易變的屬性值登疗,使用場景如在使用屬性動畫時對動畫屬性的操作。
11嫌蚤、SortedList辐益,v7 包中,見名知意脱吱。
- HandlerThread 單一線程 + 任務(wù)隊列 處理輕量的異步任務(wù) 詳見 詳解 Android 中的 HandlerThread
- Proguard assumenosideeffects 編譯器屏蔽日志 詳見 關(guān)于Android Log的一些思考
- Android性能調(diào)優(yōu)利器StrictMode
- Android中線程優(yōu)先級控制 android.os.Process.setThreadPriority 詳見 剖析Android中進程與線程調(diào)度之nice
- Android Lint 一個靜態(tài)分析工具 詳見 使用Android lint發(fā)現(xiàn)并解決高版本API問題* (更新) 使用UncaughtExceptionHandler 處理應(yīng)用崩潰智政,收集信息甚至可以不顯示崩潰對話框 詳細:Android處理崩潰的一些實踐* Application.registerActivityLifecycleCallbacks 用來監(jiān)聽一些Activity的回調(diào)。使用參考:http://droidyue.com/blog/2016/02/21/thinking-of-getting-the-current-activity-in-android/
1箱蝠、getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權(quán)续捂,誰用誰知道。
2宦搬、ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);用于根據(jù)一個起始顏色值和一個結(jié)束顏色值以及一個偏移量生成一個新的顏色牙瓢,分分鐘實現(xiàn)類似于微信底部欄滑動顏色漸變。
3间校、Canvas中clipRect矾克、clipPath和clipRegion剪切區(qū)域的API。
4撇簿、Bitmap.extractAlpha ();返回一個新的Bitmap聂渊,capture原始圖片的alpha值。有的時候我們需要動態(tài)的修改一個元素的背景圖片又不希望使用多張圖片的時候四瘫,通過這個方法汉嗽,結(jié)合Canvas和Paint可以動態(tài)的修改一個純色Bitmap的顏色。
5找蜜、HandlerThread饼暑,代替不停new Thread開子線程的重復(fù)體力寫法。
6洗做、IntentService,一個可以干完活后自己去死且不需要我們?nèi)ス芾碜泳€程的Service弓叛。
7、Palette诚纸,5.0加入的可以提取一個Bitmap中突出顏色的類撰筷,結(jié)合上面的Bitmap.extractAlpha,你懂的畦徘。
8毕籽、Executors. newSingleThreadExecutor();這個是java的抬闯,之前不知道它,自己花很大功夫去研究了單線程順序執(zhí)行的任務(wù)隊列关筒。溶握。
9、android:animateLayoutChanges="true"蒸播,LinearLayout中添加View的動畫的辦法睡榆,支持通過setLayoutTransition()自定義動畫。
10袍榆、ViewDragHelper胀屿,自定義ViewGroup處理各種事件很累吧,嗯? what the fuck!!
11包雀、GradientDrawable碉纳,之前接手公司的項目,發(fā)現(xiàn)有個陰影效果還不錯馏艾,以為是切的圖片劳曹,一看代碼,什么鬼= =琅摩!
12铁孵、AsyncQueryHandler,如果做系統(tǒng)工具類的開發(fā)房资,比如聯(lián)系人短信輔助工具等蜕劝,肯定免不了和ContentProvider打交道,如果數(shù)據(jù)量不是很大的情況下轰异,隨便搞岖沛,如果數(shù)據(jù)量大的情況下,了解下這個類是很有必要的搭独,需要注意的是婴削,這玩意兒吃異常..
13、ViewFlipper牙肝,實現(xiàn)多個view的切換(循環(huán))唉俗,可自定義動畫效果,且可針對單個切換指定動畫配椭。
14虫溜、有朋友提到了在自定義View時有些方法在開啟硬件加速的時候沒有效果的問題,在API16之后確實有很多方法不支持硬件加速,通常我們關(guān)閉硬件加速都是在清單文件中通過<application android:hardwareAccelerated="false" ...>,其實android也提供了針對特定View關(guān)閉硬件加速的方法,調(diào)用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可泄隔。
15筛峭、android util包中的Pair類瘾境,可以方便的用來存儲一"組"數(shù)據(jù)坎背。注意不是key value。
16寄雀、PointF,graphics包中的一個類陨献,我們經(jīng)常見到在處理Touch事件的時候分別定義一個downX盒犹,一個downY用來存儲一個坐標(biāo),如果坐標(biāo)少還好眨业,如果要記錄的坐標(biāo)過多那代碼就不好看了急膀。用PointF(float x, float y);來描述一個坐標(biāo)點會清楚很多。
17龄捡、StateListDrawable卓嫂,定義Selector通常的辦法都是xml文件,但是有的時候我們的圖片資源可能是從服務(wù)器動態(tài)獲取的聘殖,比如很多app所謂的皮膚晨雳,這種時候就只能通StateListDrawable
來完成了,各種addState即可奸腺。
18餐禁、android:descendantFocusability,ListView的item中CheckBox等元素搶焦點導(dǎo)致item點擊事件無法響應(yīng)時突照,除了給對應(yīng)的元素設(shè)置 focusable,更簡單的是在item根布局加上android:descendantFocusability=”blocksDescendants”
19帮非、android:duplicateParentState="true",讓子View跟隨其Parent的狀態(tài)讹蘑,如pressed等末盔。常見的使用場景是某些時候一個按鈕很小,我們想要擴大其點擊區(qū)域的時候通常會再給其包裹一層布局座慰,將點擊事件寫到Parent上陨舱,這時候如果希望被包裹按鈕的點擊效果對應(yīng)的Selector繼續(xù)生效的話,這時候duplicateParentState就派上用場了版仔。
20隅忿、includeFontPadding="false",TextView默認上下是有一定的padding的邦尊,有時候我們可能不需要上下這部分留白背桐,加上它即可。
21蝉揍、Messenger链峭,面試的時候通常都會被問到進程間通信,一般情況下大家都是開始背書又沾,AIDL巴拉巴拉弊仪。熙卡。有一天在鴻神的博客看到這個,嗯励饵,如他所說驳癌,又可以裝一下了。
22役听、TextView.setError();用于驗證用戶輸入颓鲜。
23、ViewConfiguration.getScaledTouchSlop();觸發(fā)移動事件的最小距離典予,自定義View處理touch事件的時候甜滨,有的時候需要判斷用戶是否真的存在movie,系統(tǒng)提供了這樣的方法瘤袖。
24衣摩、ValueAnimator.reverse(); 順暢的取消動畫效果。
25捂敌、ViewStub艾扮,有的時候一塊區(qū)域需要根據(jù)情況顯示不同的布局,通常我們都會通過setVisibility的方法來顯示和隱藏不同的布局占婉,但是這樣默認是全部加載的栏渺,用ViewStub可以更好的提升性能。
26锐涯、onTrimMemory磕诊,在Activity中重寫此方法,會在內(nèi)存緊張的時候回調(diào)(支持多個級別)纹腌,便于我們主動的進行資源釋放霎终,避免OOM。
27升薯、EditTxt.setImeOptions莱褒, 使用EditText彈出軟鍵盤時,修改回車鍵的顯示內(nèi)容(一直很討厭用回車鍵來交互涎劈,所以之前一直不知道這玩意兒)
28广凸、TextView.setCompoundDrawablePadding,代碼設(shè)置TextView的drawable padding蛛枚。
29谅海、ImageSwitcher,可以用來做圖片切換的一個類蹦浦,類似于幻燈片扭吁。
30、java8中新增的LocalDate和LocalTime接口,Date雖然是個萬能接口侥袜,但是它真的不好用蝌诡,有了這倆,終于可以愉快的處理日期時間了枫吧。
31浦旱、WeakHashMap,直接使用HashMap有時候會帶來內(nèi)存溢出的風(fēng)險九杂,使用WaekHashMap實例化Map颁湖。當(dāng)使用者不再有對象引用的時候,WeakHashMap將自動被移除對應(yīng)Key值的對象尼酿。
1、android.support.design.widget.TextInputLayout植影,給EditText帶個套吧⊙▽⊙2裳擎、AndroidMainfest.xml activity的一些標(biāo)簽,比如android:windowSoftInputMode <activity android:name=".Main" android:label="@string/app_name" android:windowSoftInputMode="stateHidden" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> activity launch后默認隱藏鍵盤思币,這在activity里面有EditText等元素又不想一開始就彈出軟鍵盤的情況下有用鹿响,在此之前就知道android:name 和android.label這兩個屬性_(:3」∠)_3、getSystemService函數(shù)谷饿,獲取各種系統(tǒng)service,而且不用擔(dān)心性能問題惶我,都是直接返回各種manager。4博投、Parcelable接口原來受MFC等c++類庫影響绸贡,比較習(xí)慣繼承serialiabe接口這種方式,但后來知道了Parcelable的實現(xiàn)方式就喜歡上了毅哗。5听怕、android.support.v4.widget.DrawerLayout原生大方的抽屜控件。6虑绵、android.support.v7.widget.Toolbar定制性極強的viewGroup
- 一行代碼加入點擊波紋擴散效果android:foreground="?android:attr/selectableItemBackground"
- 判斷當(dāng)前Activity是否已被銷毀通常尿瞭,在網(wǎng)絡(luò)請求的回調(diào)中會對UI進行更新操作,彈出吐司等翅睛。但是在網(wǎng)絡(luò)狀態(tài)不佳的情況下声搁,等到異步結(jié)果回調(diào)時,當(dāng)前Activity已經(jīng)被系統(tǒng)銷毀捕发,此時進行UI操作就會造成異常疏旨,彈出的吐司也讓人疑惑。所以扎酷,在網(wǎng)絡(luò)回調(diào)中需要先判斷一下當(dāng)前Activity狀態(tài)充石,若已銷毀,直接return。代碼片段如下:if (this.isFinishing() || this.isDestroyed()) {
return;
} - 使用SystemClock.sleep()替代Thread.sleep()兩者使用方法跟作用都類似骤铃,但SystemClock.sleep()不會立即拋出InterruptedException拉岁,中斷事件被推遲到下一個可中斷操作中。 可以說非常適合簡單的延遲操作了惰爬,不用頻繁喊暖。(說的好像Thread.sleep()方法Try Catch了Exception真的會做什么一樣......4. 模擬點擊View這個功能不多說了,實用撕瞧!/**
模擬點擊陵叽,點擊該View的xy坐標(biāo)(5,5)
-
@param view 模擬點擊的View
*/
public static void simulateTouch(View view) {final long downTime = SystemClock.uptimeMillis();
int[] ints = new int[2];
view.getLocationOnScreen(ints);
view.dispatchTouchEvent(MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN,
ints[0] + 5, ints[1] + 5, 0));
view.dispatchTouchEvent(MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP,
ints[0] + 5, ints[1] + 5, 0));
}
- 使用tools屬性工具預(yù)覽布局tools屬性僅對IDE生效,并不會影響最終打包的應(yīng)用丛版。比如:TextView需要預(yù)覽內(nèi)容巩掺,可以使用tools:text屬性;如果ImageView默認不顯示页畦,而你又要預(yù)覽胖替,就可以使用tools:visibility屬性,避免改動android:visibility過后忘記改回去的尷尬豫缨。其他更多用法可以自己去嘗試了独令。<TextView
android:id="@+id/bus_time_textView"
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@color/text_default"
android:textSize="15sp"
tools:text="30分鐘" />
<ImageView
android:id="@+id/less_time_imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/icon_the_fastest"
tools:visibility="visible"
android:visibility="gone" />
作者:master鄭
鏈接:https://www.zhihu.com/question/33636939/answer/57770247
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)好芭,非商業(yè)轉(zhuǎn)載請注明出處燃箭。
- 通過 WindowManager.addView 在其他app界面添加一個view時,經(jīng)常會無法顯示舍败,特別在miui招狸,emui固件上,需要指定type為LayoutParams.TYPE_TOAST邻薯。2. View.getLocationOnScreen(new int[])瓢颅,獲取view在屏幕上的位置3. Paint.setXfermode(porterDuffXfermode),在ApiDemo里面有專門的介紹弛说,實現(xiàn)了穿透挽懦,疊加,覆蓋等多種繪制效果木人,非常實用4. IBinder binder = ServiceManager.getService("wallpaper"); IWallpaperManager wm = IWallpaperManager.Stub.asInterface(binder); Bundle params = new Bundle(); ParcelFileDescriptor fd = wm.getWallpaper(stub, params); 直接獲取當(dāng)前系統(tǒng)壁紙的fd信柿,避免壁紙過大造成oom問題。這種方式有適配問題醒第,需注意渔嚷。5. 通過View.getDrawingCache()可以獲取截圖,但是需要setDrawingCacheEnabled(true)頻繁使用可能會oom稠曼,還有一種方法直接用canvasBitmap bm = Bitmap.createBitmap((int) (w * scale), (int) (h*scale), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas();canvas.setBitmap(bm);View.draw(canvas);return bm形病;6. 說到幾個oom,順帶說下有一種偷懶又有效的解決辦法,在manifest上加android:largeHeap="true"7. 用一個牛逼的來結(jié)尾漠吻,AccessibilityService量瓜。由于強大所以需要手動設(shè)置來啟用,各種消息獲取各種狀態(tài)攔截途乃,豌豆莢就用ta實現(xiàn)了非root自動安裝绍傲。
簡介
在Android應(yīng)用開發(fā)過程中,通過Log類輸出日志是一種很重要的調(diào)試手段耍共。
大家對于Log類的使用烫饼,一般會形成幾點共識:
在Debug模式下打印日志,在Release模式下不打印日志
避免濫用Log類進行輸出日志试读。因為這樣可能造成日志刷屏杠纵,淹沒真正有用的日志。
封裝Log類钩骇,以提供同時輸出日志到文件等功能
具體細化為以下幾點建議:
禁用System.out.println
Android應(yīng)用中比藻,一般通過封裝過的Log類來輸出日志,方便控制伊履。而System.out.println是標(biāo)準(zhǔn)的Java輸出方法韩容,使用不當(dāng)款违,可能造成Release模式下輸出日志的結(jié)果唐瀑。禁用e.printStackTrace
禁用理由同上
建議通過封裝過的Log類來輸出異常堆棧信息Debug模式下,通過一個靜態(tài)變量插爹,控制日志的顯示隱藏哄辣。
我一般習(xí)慣直接使用BuildConfig.DEBUG,當(dāng)然赠尾,你也可以自己定義一個力穗。
private static final boolean isDebug = BuildConfig.DEBUG;public static void i(String tag, String msg) { if (isDebug) { Log.i(tag, msg);
}
}
4.Release模式下,通過Proguard配置來移除日志
在Proguard配置文件中气嫁,確保沒有添加 --dontoptimize選項 來禁用優(yōu)化的前提下当窗,
添加以下代碼:
-assumenosideeffects class android.util.Log { public static *** d(...); public static *** e(...); public static *** i(...); public static *** v(...); public static *** println(...); public static *** w(...); public static *** wtf(...);
}
那么,是否我們按照上面的做寸宵,就真的一勞永逸呢崖面?
我的腦海中浮現(xiàn)出幾個相關(guān)問題:
Proguard配置中添加的配置,真的可以在Release模式下梯影,移除日志嗎巫员?
如果我們用的是封裝過的Log工具類,應(yīng)該怎么配置甲棍?
移除日志后简识,原來在日志方法中的拼接字符串參數(shù),是否還會申請/占用內(nèi)存?
...
本著大膽假設(shè)七扰,小心求證的原則奢赂,下面我們通過實踐來探索上面的問題答案。
本文基于以下項目進行測試實踐:
https://github.com/snowdream/test/tree/master/android/test/logtest
反編譯工具:JD-GUI
驗證Proguard配置清理日志的有效性
CASE
Log.i(TAG,"這樣使用戳寸,得到的LOGTAG的值就是DroidSettings呈驶," + "然而并非如此,當(dāng)DroidSettings這個類進行了混淆之后疫鹊, 類名變成了類似a,b,c這樣的名稱袖瞻," + "LOGTAG則不再是DroidSettings這個值了。這樣可能造成的問題就是拆吆,內(nèi)部混淆有日志的包聋迎,我們?nèi)ミ^濾DroidSettings " + "卻永遠得不到任何信息。");
在添加上述Proguard配置前后枣耀,編譯打包Release模式的正式包霉晕,使用JD-GUI進行反編譯,對比上述代碼的編譯后代碼捞奕。
結(jié)果
添加配置前
添加配置后
結(jié)論
通過比對結(jié)果牺堰,我們可以得出結(jié)論:
通過添加Proguard配置,可以在Release模式下颅围,移除掉日志伟葫。
驗證封裝過的Log工具類,是否有必要進行而外配置
CASE
LogUtil.i(TAG,"這樣使用院促,得到的LOGTAG的值就是DroidSettings筏养," + "然而并非如此,當(dāng)DroidSettings這個類進行了混淆之后常拓,類名變成了類似a,b,c這樣的名稱渐溶," + "LOGTAG則不再是DroidSettings這個值了。這樣可能造成的問題就是弄抬,內(nèi)部混淆有日志的包茎辐,我們?nèi)ミ^濾DroidSettings " +"卻永遠得不到任何信息。");
在添加上述Proguard配置前后掂恕,編譯打包Release模式的正式包拖陆,使用JD-GUI進行反編譯,對比上述代碼的編譯后代碼竹海。
結(jié)果
添加配置前
添加配置后
結(jié)論
通過比對結(jié)果慕蔚,我們可以得出結(jié)論:
在這種簡單封裝的情況下,我們不需要額外的配置斋配,也可以將封裝過的Log工具類調(diào)用日志一起移除孔飒。
當(dāng)然灌闺,實際使用過程中座柱,可能封裝更復(fù)雜首量。為了保險起見诗充,可以也添加上Log工具類的配置饮笛。示例如下:
-assumenosideeffects class com.github.snowdream.logtest.LogUtil { public static *** d(...); public static *** e(...); public static *** i(...); public static *** v(...); public static *** w(...);
}
驗證移除日志后,字符串拼接是否還存在弦聂?
CASE
Log.i(TAG,"這樣使用洒试,得到的LOGTAG的值就是DroidSettings怕膛," +"然而并非如此缀棍,當(dāng)DroidSettings這個類進行了混淆之后宅此,類名變成了類似a,b,c這樣的名稱," +"LOGTAG則不再是DroidSettings這個值了爬范。這樣可能造成的問題就是父腕,內(nèi)部混淆有日志的包,我們?nèi)ミ^濾DroidSettings " +"卻永遠得不到任何信息青瀑。");Log.i(TAG, "這樣使用璧亮,得到的LOGTAG的值就是DroidSettings," +"然而并非如此斥难,當(dāng)DroidSettings這個類進行了混淆之后枝嘶,類名變成了類似a,b,c這樣的名稱," +"LOGTAG則不再是DroidSettings這個值了哑诊。這樣可能造成的問題就是群扶,內(nèi)部混淆有日志的包,我們?nèi)ミ^濾DroidSettings " +"卻永遠得不到任何信息搭儒。" + index ++);
上面代碼的區(qū)別是:
前面是簡單的字符串相加穷当,而后面是字符串和變量的相加
在添加上述Proguard配置的前提下提茁,分別針對以上兩段代碼淹禾,編譯打包Release模式的正式包,使用JD-GUI進行反編譯茴扁,對比上述代碼的編譯后代碼铃岔。
結(jié)果
簡單字符串相加
字符串和變量相加
結(jié)論
通過比對結(jié)果,我們可以得出結(jié)論:
如果只是簡單字符串相加峭火,是會徹底移除的毁习,并且字符串拼接也不見了,不會占用內(nèi)存卖丸。
而如果是字符串和變量相加纺且,日志會移除,但是字符串拼接還在稍浆,還會占用內(nèi)存载碌。
驗證日志中使用函返回值的情況
CASE
LogUtil.i(TAG, getMessage());
LogUtil.i(TAG, "FROM FUNCTION " + getMessage()); private String getMessage() { return "這樣使用猜嘱,得到的LOGTAG的值就是DroidSettings," +"然而并非如此嫁艇,當(dāng)DroidSettings這個類進行了混淆之后朗伶,類名變成了類似a,b,c這樣的名稱," + "LOGTAG則不再是DroidSettings這個值了步咪。這樣可能造成的問題就是论皆,內(nèi)部混淆有日志的包,我們?nèi)ミ^濾DroidSettings " +"卻永遠得不到任何信息猾漫。"点晴;
}
上面代碼的區(qū)別是:
前面是直接使用函數(shù)返回值,而后面是字符串和函數(shù)返回值的相加
在添加上述Proguard配置的前提下悯周,分別針對以上兩段代碼觉鼻,編譯打包Release模式的正式包,使用JD-GUI進行反編譯队橙,對比上述代碼的編譯后代碼坠陈。
結(jié)果
直接使用函數(shù)返回值
case1-b.png
字符串和函數(shù)返回值相加
case4.png
結(jié)論
通過比對結(jié)果,我們可以得出結(jié)論:
以上兩種場景下捐康,日志移除仇矾,拼接字符串不在了,也不會占用內(nèi)存解总。
經(jīng)過大量實踐后的結(jié)論
如果你以為上面就是全部真相的話贮匕,就錯了。
經(jīng)過大量的測試實踐花枫,實際上真相更復(fù)雜刻盐。
以下是開啟Proguard前提下,各種情況下的測試結(jié)論:
Log.i(簡單字符串)
Log.i(局部變量)
Log.i(成員變量)
Log.i(簡單字符串+局部變量)
以上四種情況劳翰,日志被徹底移除敦锌,不會額外增加內(nèi)存。Log.i(簡單字符串+成員變量)
日志被移除佳簸,但是字符串拼接會存在乙墙,并占用內(nèi)存。Log.i(成員函數(shù)) 其中生均,成員函數(shù)返回值為: 簡單字符串
Log.i(成員函數(shù)) 其中听想,成員函數(shù)返回值為: 簡單字符串+局部變量
以上兩種情況,日志被徹底移除马胧,不會額外增加內(nèi)存汉买。Log.i(成員函數(shù)) 其中,成員函數(shù)返回值為: 簡單字符串+成員變量
日志被移除佩脊,但是字符串拼接會存在蛙粘,并占用內(nèi)存朽色。
注:以上所有情況,參數(shù)都是指第二個或者后面的參數(shù)。第一個參數(shù)组题,我都使用了靜態(tài)成員變量:
private static final String TAG = MainActivity.class.getSimpleName();
優(yōu)化建議
-
確保沒有開啟 --dontoptimize選項的前提下葫男,添加Proguard優(yōu)化日志配置
-assumenosideeffects class android.util.Log { public static *** d(...); public static *** e(...); public static *** i(...); public static *** v(...); public static *** println(...); public static *** w(...); public static *** wtf(...); }
針對這種情況“Log.i(成員函數(shù)) 其中,成員函數(shù)返回值為: 簡單字符串+成員變量”
目前并沒有辦法規(guī)避崔列,不建議這么使用梢褐。針對這種情況"Log.i(簡單字符串+成員變量)"
我們的解決方案是,在封裝的Log工具類方法中赵讯,使用變長參數(shù)盈咳。
下面是一個簡單的示例:
package com.github.snowdream.logtest;import android.text.TextUtils;import android.util.Log;/**
* Created by snowdream on 16-10-22.
*/public class LogUtil { private static final boolean isDebug = BuildConfig.DEBUG; public static void i(String tag, String... args) { if (isDebug) { Log.i(tag, getLog(tag,args));
}
} public static void d(String tag, String... args) { if (isDebug) { Log.i(tag, getLog(tag,args));
}
} public static void v(String tag, String... args) { if (isDebug) { Log.i(tag, getLog(tag,args));
}
} public static void w(String tag, String... args) { if (isDebug) { Log.i(tag, getLog(tag,args));
}
} public static void e(String tag, String... args) { if (isDebug) { Log.i(tag, getLog(tag,args));
}
} private static String getLog(String tag, String... args){
StringBuilder builder = new StringBuilder();
for (String arg : args){ if (TextUtils.isEmpty(arg)) continue;
builder.append(arg);
} return builder.toString();
}
}