28 個回答
Activity.startActivities() 經常使用於在應用程序中間啓動其餘的Activity。html
TextUtils.isEmpty() 簡單的工具類,用於檢測是否爲空。java
Html.fromHtml() 用於生成一個Html,參數能夠是一個字符串.我的認爲它不是很快,因此我不怎麼常常去用.(我說不常常用它是爲了重點突出這句話:請多手動構建 Spannable 來替換 Html.fromHtml),可是它對渲染從 web 上獲取的文字仍是很不錯的。node
TextView.setError() 在驗證用戶輸入的時候很棒。android
Build.VERSION_CODES 這個標明瞭當前的版本號,在處理兼容性問題的時候常常會用到.點進去能夠看到各個版本的不一樣特性。ios
Log.getStackTraceString() 方便的日誌類工具,方法Log.v()、Log.d()、Log.i()、Log.w()和Log.e()都是將信息打印到LogCat中,有時候須要將出錯的信息插入到數據庫或一個自定義的日誌文件中,那麼這種狀況就須要將出錯的信息以字符串的形式返回來,也就是使用static String getStackTraceString(Throwable tr)方法的時候。c++
LayoutInflater.from() 顧名思義,用於Inflate一個layout,參數是layout的id.這個常常寫Adapter的人會用的比較多。git
ViewConfiguration.getScaledTouchSlop() 使用 ViewConfiguration 中提供的值以保證全部觸摸的交互都是統一的。這個方法獲取的值表示:用戶的手滑動這個距離後,才斷定爲正在進行滑動.固然這個值也能夠本身來決定.可是爲了一致性,仍是使用標準的值較好。程序員
PhoneNumberUtils.convertKeypadLettersToDigits 顧名思義.將字母轉換爲數字,相似於T9輸入法,github
Context.getCacheDir() 獲取緩存數據文件夾的路徑,很簡單可是知道的人很少,這個路徑一般在SD卡上(這裏的SD卡指的是廣義上的SD卡,包括外部存儲和內部存儲)Adnroid/data/您的應用程序包名/cache/ 下面.測試的時候,能夠去這裏面看是否緩存成功.緩存在這裏的好處是:不用本身再去手動建立文件夾,不用擔憂用戶把本身建立的文件夾刪掉,在應用程序卸載的時候,這裏會被清空,使用第三方的清理工具的時候,這裏也會被清空。web
ArgbEvaluator 用於處理顏色的漸變。就像 Chris Banes 說的同樣,這個類會進行不少自動裝箱的操做,因此最好仍是去掉它的邏輯本身去實現它。這個沒用過,不明其因此然,回頭再補充.
ContextThemeWrapper 方便在運行的時候修改主題。
Space space是Android 4.0中新增的一個控件,它實際上能夠用來分隔不一樣的控件,其中造成一個空白的區域.這是一個輕量級的視圖組件,它能夠跳過Draw,對於須要佔位符的任何場景來講都是很棒的。
ValueAnimator.reverse() 這個方法能夠很順利地取消正在運行的動畫。
---------------------------------------------------------------------------------------------------------------------------------
Part 2:
DateUtils.formatDateTime() 用來進行區域格式化工做,輸出格式化和本地化的時間或者日期。
AlarmManager.setInexactRepeating 經過鬧鈴分組的方式省電,即便你只調用了一個鬧鐘,這也是一個好的選擇,(能夠確保在使用完畢時自動調用 AlarmManager.cancel ()。原文說的比較抽象,這裏詳細說一下:setInexactRepeating指的是設置非準確鬧鐘,使用方法:alarmManager.setInexactRepeating(AlarmManager.RTC, startTime,intervalL, pendingIntent),非準確鬧鐘只能保證大體的時間間隔,可是不必定準確,可能出現設置間隔爲30分鐘,可是實際上一次間隔20分鐘,另外一次間隔40分鐘。它的最大的好處是能夠合併鬧鐘事件,好比間隔設置每30分鐘一次,不喚醒休眠,在休眠8小時後已經積累了16個鬧鐘事件,而在手機被喚醒的時候,非準時鬧鐘能夠把16個事件合併爲一個, 因此這麼看來,非準時鬧鐘通常來講比較節約能源。
Formatter.formatFileSize() 一個區域化的文件大小格式化工具。通俗來講就是把大小轉換爲MB,G,KB之類的字符串。
ActionBar.hide()/.show() 顧名思義,隱藏和顯示ActionBar,能夠優雅地在全屏和帶Actionbar之間轉換。
Linkify.addLinks() 在Text上添加連接。很實用。
StaticLayout 在自定義 View 中渲染文字的時候很實用。
Activity.onBackPressed() 很方便的管理back鍵的方法,有時候須要本身控制返回鍵的事件的時候,能夠重寫一下。好比加入 「點兩下back鍵退出」 功能。
GestureDetector 用來監聽和相應對應的手勢事件,好比點擊,長按,慢滑動,快滑動,用起來很簡單,比你本身實現要方便許多。
DrawFilter 可讓你在不調用onDrew方法的狀況下,操做canvas,比了個如,你能夠在建立自定義 View 的時候設置一個 DrawFilter,給父 View 裏面的全部 View 設置反別名。
ActivityManager.getMemoryClass() 告訴你你的機器還有多少內存,在計算緩存大小的時候會比較有用。
ViewStub 它是一個初始化不作任何事情的 View,可是以後能夠載入一個佈局文件。在慢加載 View 中很適合作佔位符。惟一的缺點就是不支持標籤,因此若是你不過小心的話,可能會在視圖結構中加入不須要的嵌套。
SystemClock.sleep() 這個方法在保證必定時間的 sleep 時很方便,一般我用來進行 debug 和模擬網絡延時。
DisplayMetrics.density 這個方法你能夠獲取設備像素密度,大部分時候最好讓系統來自動進行縮放資源之類的操做,可是有時候控制的效果會更好一些.(尤爲是在自定義View的時候)。
Pair.create() 方便構建類和構造器的方法。
---------------------------------------------------------------------------------------------------------------------------------
Part 3:
UrlQuerySanitizer——使用這個工具能夠方便對 URL 進行檢查。
Fragment.setArguments——由於在構建 Fragment 的時候不能加參數,因此這是個很好的東西,能夠在建立 Fragment 以前設置參數(即便在 configuration 改變的時候仍然會致使銷燬/重建)。
DialogFragment.setShowsDialog ()—— 這是一個很巧妙的方式,DialogFragment 能夠做爲正常的 Fragment 顯示!這裏可讓 Fragment 承擔雙重任務。我一般在建立 Fragment 的時候把 onCreateView ()和 onCreateDialog ()都加上,就能夠建立一個具備雙重目的的 Fragment。
FragmentManager.enableDebugLogging ()——在須要觀察 Fragment 狀態的時候會有幫助。
LocalBroadcastManager——這個會比全局的 broadcast 更加安全,簡單,快速。像 otto這樣的 Event buses 機制對你的應用場景更加有用。
PhoneNumberUtils.formatNumber ()——顧名思義,這是對數字進行格式化操做的時候用的。
Region.op()——我發如今對比兩個渲染以前的區域的時候很實用,若是你有兩條路徑,那麼怎麼知道它們是否是會重疊呢?使用這個方法就能夠作到。
Application.registerActivityLifecycleCallbacks——雖然缺乏官方文檔解釋,不過我想它就是註冊 Activity 的生命週期的一些回調方法(顧名思義),就是一個方便的工具。
versionNameSuffix——這個 gradle 設置可讓你在基於不一樣構建類型的 manifest 中修改版本名這個屬性,例如,若是須要在在 debug 版本中以」-SNAPSHOT」結尾,那麼就能夠輕鬆的看出當前是 debug 版仍是 release 版。
CursorJoiner——若是你是隻使用一個數據庫的話,使用 SQL 中的 join 就能夠了,可是若是收到的數據是來自兩個獨立的 ContentProvider,那麼 CursorJoiner 就很實用了。
Genymotion——一個很是快的 Android 模擬器,本人一直在用。
-nodpi——在沒有特別定義的狀況下,不少修飾符(-mdpi,-hdpi,-xdpi等等)都會默認自動縮放 assets/dimensions,有時候咱們須要保持顯示一致,這種狀況下就可使用 -nodpi。
BroadcastRecevier.setDebugUnregister ()——又一個方便的調試工具。
Activity.recreate ()——強制讓 Activity 重建。
PackageManager.checkSignatures ()——若是同時安裝了兩個 app 的話,能夠用這個方法檢查。若是不進行簽名檢查的話,其餘人能夠輕易經過使用同樣的包名來模仿你的 app。
---------------------------------------------------------------------------------------------------------------------------------
Part 4:
Activity.isChangingConfigurations ()——若是在 Activity 中 configuration 會常常改變的話,使用這個方法就能夠不用手動作保存狀態的工做了。
SearchRecentSuggestionsProvider——能夠建立最近提示效果的 provider,是一個簡單快速的方法。
ViewTreeObserver——這是一個很棒的工具。能夠進入到 VIew 裏面,並監控 View 結構的各類狀態,一般我都用來作 View 的測量操做(自定義視圖中常常用到)。
org.gradle.daemon=true——這句話能夠幫助減小 Gradle 構建的時間,僅在命令行編譯的時候用到,由於 Android Studio 已經這樣使用了。
DatabaseUtils——一個包含各類數據庫操做的使用工具。
android:weightSum (LinearLayout)——若是想使用 layout weights,可是卻不想填充整個 LinearLayout 的話,就能夠用 weightSum 來定義總的 weight 大小。
android:duplicateParentState (View)——此方法可使得子 View 能夠複製父 View 的狀態。好比若是一個 ViewGroup 是可點擊的,那麼能夠用這個方法在它被點擊的時候讓它的子 View 都改變狀態。
android:clipChildren (ViewGroup)——若是此屬性設置爲不可用,那麼 ViewGroup 的子 View 在繪製的時候會超出它的範圍,在作動畫的時候須要用到。
android:fillViewport (ScrollView)——在這片文章中有詳細介紹文章連接,能夠解決在 ScrollView 中當內容不足的時候填不滿屏幕的問題。
android:tileMode (BitmapDrawable)——能夠指定圖片使用重複填充的模式。
android:enterFadeDuration/android:exitFadeDuration (Drawables)——此屬性在 Drawable 具備多種狀態的時候,能夠定義它展現前的淡入淡出效果。
android:scaleType (ImageView)——定義在 ImageView 中怎麼縮放/剪裁圖片,通常用的比較多的是「centerCrop」和「centerInside」。
Merge——此標籤能夠在另外一個佈局文件中包含別的佈局文件,而不用再新建一個 ViewGroup,對於自定義 ViewGroup 的時候也須要用到;能夠經過載入一個帶有標籤的佈局文件來自動定義它的子部件。
AtomicFile——經過使用備份文件進行文件的原子化操做。這個知識點以前我也寫過,不過最好仍是有出一個官方的版本比較好。
---------------------------------------------------------------------------------------------------------------------------------
Part 5:
ViewDragHelper ——視圖拖動是一個比較複雜的問題。這個類能夠幫助解決很多問題。若是你須要一個例子,DrawerLayout就是利用它實現掃滑。Flavient Laurent 還寫了一些關於這方面的優秀文章。
PopupWindow——Android處處都在使用PopupWindow ,甚至你都沒有意識到(標題導航條ActionBar,自動補全AutoComplete,編輯框錯誤提醒Edittext Errors)。這個類是建立浮層內容的主要方法。
Actionbar.getThemrContext()——導航欄的主題化是很複雜的(不一樣於Activity其餘部分的主題化)。你能夠獲得一個上下文(Context),用這個上下文建立的自定義組件能夠獲得正確的主題。
ThumbnailUtils——幫助建立縮略圖。一般我都是用現有的圖片加載庫(好比,Picasso 或者 Volley),不過這個ThumbnaiUtils能夠建立視頻縮略圖。譯者注:該API從V8纔開始支持。
Context.getExternalFilesDir()———— 申請了SD卡寫權限後,你能夠在SD的任何地方寫數據,把你的數據寫在設計好的合適位置會更加有禮貌。這樣數據能夠及時被清理,也會有更好的用戶體驗。此外,Android 4.0 Kitkat中在這個文件夾下寫數據是不須要權限的,每一個用戶有本身的獨立的數據存儲路徑。譯者注:該API從V8纔開始支持。
SparseArray——Map的高效優化版本。推薦瞭解姐妹類SparseBooleanArray、SparseIntArray和SparseLongArray。
PackageManager.setComponentEnabledSetting()——能夠用來啓動或者禁用程序清單中的組件。對於關閉不須要的功能組件是很是讚的,好比關掉一個當前不用的廣播接收器。
SQLiteDatabase.yieldIfContendedSafely()——讓你暫時中止一個數據庫事務, 這樣你能夠就不會佔用太多的系統資源。
Environment.getExternalStoragePublicDirectory()——仍是那句話,用戶指望在SD卡上獲得統一的用戶體驗。用這個方法能夠得到在用戶設備上放置指定類型文件(音樂、圖片等)的正確目錄。
View.generateViewId()——每次我都想要推薦動態生成控件的ID。須要注意的是,不要和已經存在的控件ID或者其餘已經生成的控件ID重複。
ActivityManager.clearApplicationUserData()—— 一鍵清理你的app產生的用戶數據,多是作用戶退出登陸功能,有史以來最簡單的方式了。
Context.createConfigurationContext() ——自定義你的配置環境信息。我一般會遇到這樣的問題:強制讓一部分顯示在某個特定的環境下(倒不是我一直這樣瞎整,說來話長,你很難理解)。用這個實現起來能夠稍微簡單一點。
ActivityOptions ——方便的定義兩個Activity切換的動畫。 使用ActivityOptionsCompat 能夠很好解決舊版本的兼容問題。
AdapterViewFlipper.fyiWillBeAdvancedByHostKThx()——僅僅由於很好玩,沒有其餘緣由。在整個安卓開源項目中(AOSP the Android ——pen Source Project Android開放源代碼項目)中還有其餘頗有意思的東西(好比
GRAVITY_DEATH_STAR_I)。不過,都不像這個這樣,這個確實有用
ViewParent.requestDisallowInterceptTouchEvent() ——Android系統觸摸事件機制大多時候可以默認處理,不過有時候你須要使用這個方法來剝奪父級控件的控制權。
============================== >> 以上 <<===============================
譯文出自 @Gracker 的博客, Android Performance:
Part1: [譯]Android小技巧(1)
Part2: [譯]Android小技巧(2)
Part3: [譯]Android小技巧(3)
Part4: [譯]Android小技巧(4)
Part5: [譯]Android小技巧(5)
原文出自 Dan Lew 的博客,有 5 篇,強烈推薦。
Android Tips Round-Up, Part 1
Android Tips Round-Up, Part 2
Android Tips Round-Up, Part 3
Android Tips Round-Up, Part 4
Android Tips Round-Up, Part 5
最後作個福利廣告 zhengxiaopeng/android-dev-bookmarks · GitHub
=============================>> 如下補充 <<=============================
一、android:clipChildren 和 android:clipToPadding:clipToPadding就是說控件的繪製區域是否在padding裏面的,true的狀況下若是你設置了padding那麼繪製的區域就往裏 縮,clipChildren是指子控件是否超過padding區域,這兩個屬性默認是true的,因此在設置了padding狀況下,默認滾動是在 padding內部的,要達到上面的效果主要把這兩個屬性設置了false那麼這樣子控件就能畫到padding的區域了。使用場景如:ActionBar(透明)下顯示Listview而第一項要在actionbar下。參見 android:clipToPadding和android:clipChildren。
二、Fragment 的 setUserVisibleHint 方法,可實現 fragment 對用戶可見時才加載資源(延遲加載)。
三、自定義 View 時重寫 hasOverlappingRendering 方法指定 View 是否有 Overlapping 的狀況,提升渲染性能。
四、AutoScrollHelper,在可滾動視圖中長按邊緣實現滾動, Android View.OnTouchListener 的子類。
五、TouchSlop,系統所能識別出的被認爲是最小的滑動距。離,ViewConfiguration.get(context).getScaledTouchSlop()。
六、VelocityTracker,可用於 View 滑動事件速度跟蹤。
七、AlphabetIndexer,字母索引輔助類。
八、Messenger,AIDL 實現的封裝,比手寫 AIDL 更方便。
九、ArrayMap,比 HashMap 更高的內存效率,但比 HashMap 慢,不適合有大量數據的場景。
十、Property,抽象類,封裝出對象中的一個易變的屬性值,使用場景如在使用屬性動畫時對動畫屬性的操做。
...
StephenLee,只是隨便來轉轉!
一、Throwable類中的 getStackTrace()方法,根據這個方法能夠獲得函數的逐層調用地址,其返回值爲StackTraceElement[];
二、 StackTraceElement類,其中四個方法getClassName(),getFileName(),getLineNumber(),getMethodName()在調試程序打印Log時很是有用;
三、 UncaughtExceptionHandler接口,再好的代碼異常不免,利用此接口能夠處理未捕獲的異常;
使用參見: Android使用UncaughtExceptionHandler捕獲全局異常
四、Resources類中的 getIdentifier(name, defType, defPackage)方法,根據資源名稱獲取其ID,作UI時常常用到;
五、View中的 isShown()方法,之前都是用view.getVisibility() == View.VISIBLE來判斷的(╯□╰);
六、Arrays類中的 asList(T... array)方法,數組轉List集合;反過來List. toArray();
七、android.text.format.Formatter類中 formatFileSize(Context, long)方法,用來格式化文件Size(B → KB → MB → GB);
八、 android.media.ThumbnailUtils類,用來獲取媒體(圖片、視頻)縮略圖;
九、String類中的 format(String, Object...)方法,用來格式化strings.xml中的字符串(多謝 @droider An 提示:Context類中getString(int, Object... )方法用起來更加方便);
十、View類中的三個方法: callOnClick(), performClick(), performLongClick(),用於觸發View的點擊事件;
十一、TextUtils類中的 isEmpty(String)方法,判斷字符串是否爲null或"";
十二、TextView類中的 append(String)方法,添加文本;
1三、View類中的 getDrawingCache()等一系列方法,目前只知道能夠用來截圖;
1四、 DecimalFormat類,用於字串格式化包括指定位數、百分數、科學計數法等;
1五、System類中的 arraycopy(src, srcPos, dest, destPos, length)方法,用來copy數組;
1六、Fragment類中的 onHiddenChanged(boolean)方法,使用FragmentTransaction中的hide(),show()時貌似Fragment的其它生命週期方法都不會被調用,太坑爹!
1七、Activity類中的 onWindowFocusChanged(boolean)方法;
1八、View類中的 getLocationInWindow(int[])方法和 getLocationOnScreen(int[])方法,獲取View在窗口/屏幕中的位置;
1九、TextView類中的 setTransformationMethod(TransformationMethod)方法,可用來實現「顯示密碼」功能;
20、 TextWatcher接口,用來監聽文本輸入框內容的改變;
2一、View類中的 setSelected(boolean)方法結合android:state_selected=""用來實現圖片選中效果;
2二、Surface設置透明: SurfaceView.setZOrderOnTop(true);
SurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);可是會擋住其它控件;
2三、ListView或GridView類中的 setFastScrollEnabled(boolean)方法,用來設置快速滾動滑塊是否可見,固然前提是item夠多;
2四、 PageTransformer接口,用來自定義ViewPager頁面切換動畫,用 setPageTransformer(boolean, PageTransformer)方法來進行設置;
2五、apache提供的一系列jar包: commons-lang.jar, commons-collections.jar, commons-beanutils.jar等,裏面不少方法多是你曾經用幾十幾百行代碼實現過的,可是執行效率或許要差不少,好比:ArrayUtils,StringUtils……;
2六、 AndroidTestCase類,Android單元測試;
2七、Activity類中的 onNewIntent(intent)方法;
2八、TextView類的 setKeyListener(KeyListener)方法;
其中DigitsKeyListener類,使用getInstance(String accepted)方法便可指定EditText可輸入字符集。
macro hard,程序猿,寫得一手好bug
一、getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權,誰用誰知道。
二、ArgbEvaluator. evaluate(float fraction, Object startValue, Object endValue);用於根據一個起始顏色值和一個結束顏色值以及一個偏移量生成一個新的顏色,分分鐘實現相似於微信底部欄滑動顏色漸變。
三、Canvas中clipRect、clipPath和clipRegion剪切區域的API。
四、Bitmap.extractAlpha ();返回一個新的Bitmap,capture原始圖片的alpha值。有的時候咱們須要動態的修改一個元素的背景圖片又不但願使用多張圖片的時候,經過這個方法,結合Canvas和Paint能夠動態的修改一個純色Bitmap的顏色。
五、HandlerThread,代替不停new Thread開子線程的重複體力寫法。
六、IntentService,一個能夠幹完活後本身去死且不須要咱們去管理子線程的Service。
七、Palette,5.0加入的能夠提取一個Bitmap中突出顏色的類,結合上面的Bitmap.extractAlpha,你懂的。
八、Executors. newSingleThreadExecutor();這個是java的,以前不知道它,本身花很大功夫去研究了單線程順序執行的任務隊列。。
九、android:animateLayoutChanges="true",LinearLayout中添加View的動畫的辦法,支持經過setLayoutTransition()自定義動畫。
十、ViewDragHelper,自定義ViewGroup處理各類事件很累吧,嗯? what the fuck!!
十一、GradientDrawable,以前接手公司的項目,發現有個陰影效果還不錯,覺得是切的圖片,一看代碼,什麼鬼= =!
十二、AsyncQueryHandler,若是作系統工具類的開發,好比聯繫人短信輔助工具等,確定免不了和ContentProvider打交道,若是數據量不是很大的狀況下,隨便搞,若是數據量大的狀況下,瞭解下這個類是頗有必要的,須要注意的是,這玩意兒吃異常..
1三、ViewFlipper,實現多個view的切換(循環),可自定義動畫效果,且可針對單個切換指定動畫。
1四、有朋友提到了在自定義View時有些方法在開啓硬件加速的時候沒有效果的問題,在API16以後確實有不少方法不支持硬件加速,一般咱們關閉硬件加速都是在清單文件中經過<application android:hardwareAccelerated="false" ...>,其實android也提供了針對特定View關閉硬件加速的方法,調用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);便可。
1五、android util包中的Pair類,能夠方便的用來存儲一"組"數據。注意不是key value。
1六、PointF,graphics包中的一個類,咱們常常見到在處理Touch事件的時候分別定義一個downX,一個downY用來存儲一個座標,若是座標少還好,若是要記錄的座標過多那代碼就很差看了。用PointF(float x, float y);來描述一個座標點會清楚不少。
1七、StateListDrawable,定義Selector一般的辦法都是xml文件,可是有的時候咱們的圖片資源多是從服務器動態獲取的,好比不少app所謂的皮膚,這種時候就只能通StateListDrawable
來完成了,各類addState便可。
1八、android:descendantFocusability,ListView的item中CheckBox等元素搶焦點致使item點擊事件沒法響應時,除了給對應的元素設置 focusable,更簡單的是在item根佈局加上android:descendantFocusability=」blocksDescendants」
19 、android:duplicateParentState="true",讓子View跟隨其Parent的狀態,如pressed等。常見的使用場景是某些時候一個按鈕很小,咱們想要擴大其點擊區域的時候一般會再給其包裹一層佈局,將點擊事件寫到Parent上,這時候若是但願被包裹按鈕的點擊效果對應的Selector繼續生效的話,這時候duplicateParentState就派上用場了。
20、includeFontPadding="false",TextView默認上下是有必定的padding的,有時候咱們可能不須要上下這部分留白,加上它便可。
2一、Messenger,面試的時候一般都會被問到進程間通訊,通常狀況下你們都是開始背書,AIDL巴拉巴拉。。有一天在鴻神的博客看到這個,嗯,如他所說,又能夠裝一下了。
2二、TextView.setError();用於驗證用戶輸入。
2三、ViewConfiguration.getScaledTouchSlop();觸發移動事件的最小距離,自定義View處理touch事件的時候,有的時候須要判斷用戶是否真的存在movie,系統提供了這樣的方法。
2四、ValueAnimator.reverse(); 順暢的取消動畫效果。
2五、ViewStub,有的時候一塊區域須要根據狀況顯示不一樣的佈局,一般咱們都會經過setVisibility的方法來顯示和隱藏不一樣的佈局,可是這樣默認是所有加載的,用ViewStub能夠更好的提高性能。
2六、onTrimMemory,在Activity中重寫此方法,會在內存緊張的時候回調(支持多個級別),便於咱們主動的進行資源釋放,避免OOM。
先這些了,想起來了再補。
---------------------------------------------蒼老師的事業線---------------------------------------------
同屬拋磚等玉,謝贊!發現排版太緊湊看起來很很累,稍做調整~
Allan,Android 開發
android:animateLayoutChanges
一直覺得 Lollipop Dialer 接通畫面裏面那些酷炫的動畫(文字部分)是很複雜的作出來的,後來發現其實只有一行。
只須要加好 android:animateLayoutChanges="true" 而後 setVisibility 就能夠了
- 清除畫布上的內容:canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
- 在自定義View的onDetachedFromWindow方法中清理與View相關的資源;
- Fragment在onAttach方法中接收回調:
@Override public void onAttach(Activity activity) { super.onAttach(activity); try { mPageSelectedListener = (PageSelectedListener) activity; mMenuBtnOnclickListener = (MenuBtnOnClickListener) activity; mCommitBtnOnClickListener = (CommitBtnOnClickListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + "must implements listener"); } }
- 使用ClipDrawable實現進度條功能;
- 自定義view中的getContext(),不再須要專門建立一個mContext全局對象了;
- 自定義手寫view的時候,在手指移動的過程當中經過MotionEvent | Android Developers對象的getHistorySize()得到緩存的歷史點,繪製出來的曲線要平滑不少。
- 複寫Activity的onUserLeaveHint方法,確保用戶離開界面時可以當即暫停界面中的一些任務,關於onUserLeaveHint的更多做用能夠谷歌:android - Google 搜索
- 值得借鑑的點擊兩次退出應用的實現:Android關於雙擊退出應用的問題
沒那麼麻煩,直接用toast的getView().getParent() 判斷是否是空就ok了。API 16 測試經過 public class MainActivity extends Activity { private Toast toast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toast = Toast.makeText(getApplicationContext(), "肯定退出?", 0); } public void onBackPressed() { quitToast(); } /* public boolean onKeyDown(int keyCode, KeyEvent event) { System.out.println(keyCode + "...." + event.getKeyCode()); if(keyCode == KeyEvent.KEYCODE_BACK){ quitToast(); } return super.onKeyDown(keyCode, event); } */ private void quitToast() { if(null == toast.getView().getParent()){ toast.show(); }else{ System.exit(0); } } }
摘自官方文檔:
A utility class to help log timings splits throughout a method call. Typical usage is:
TimingLogger timings = new TimingLogger(TAG, "methodA");
// ... do some work A ... timings.addSplit("work A");
// ... do some work B ... timings.addSplit("work B");
// ... do some work C ... timings.addSplit("work C"); timings.dumpToLog();
The dumpToLog call would add the following to the log:
D/TAG ( 3459): methodA: begin
D/TAG ( 3459): methodA: 9 ms, work A
D/TAG ( 3459): methodA: 1 ms, work B
D/TAG ( 3459): methodA: 6 ms, work C
D/TAG ( 3459): methodA: end, 16 ms
原文 http://www.ydcool.me/archives/11/
master鄭,作好產品
1. 經過 WindowManager.addView 在其餘app界面添加一個view時,常常會沒法顯示,特別在miui,emui固件上,須要指定type爲LayoutParams.TYPE_TOAST。
2. View.getLocationOnScreen(new int[]),獲取view在屏幕上的位置
3. Paint.setXfermode(porterDuffXfermode),在ApiDemo裏面有專門的介紹,實現了穿透,疊加,覆蓋等多種繪製效果,很是實用
4. IBinder binder = ServiceManager.getService("wallpaper");
IWallpaperManager wm = IWallpaperManager.Stub.asInterface(binder);
Bundle params = new Bundle();
ParcelFileDescriptor fd = wm.getWallpaper(stub, params);
直接獲取當前系統壁紙的fd,避免壁紙過大形成oom問題。這種方式有適配問題,需注意。
5. 經過View.getDrawingCache()能夠獲取截圖,可是須要setDrawingCacheEnabled(true)頻繁使用可能會oom,還有一種方法直接用canvas
Bitmap 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. 用一個牛逼的來結尾,AccessibilityService。因爲強大因此須要手動設置來啓用,各類消息獲取各類狀態攔截,豌豆莢就用ta實現了非root自動安裝。
selector用這個來作樣式的多態真是沒有太方便了,之前傻傻的本身分析事件來變換
HierarchyViewer這個工具用來了解界面實現方式,找到每一個view佈局和對應id實在太方便了,還能夠配合dumpsys命令用來調試
ListView ViewHolder的使用,雖然說如今RecyclerView已經把ViewHolder包含進去了,可是仍是要說說這個方法對於複用的意義
moveTaskToBack 看到不少論壇寫模擬home按鍵的方式是用Intent.setAction(Intent.ACTION_MAIN)來實現所謂模擬home鍵的方式(其實是調用launcher),其實不少場景裏面要這麼作的主要目的就是爲了讓當前的APP隱藏而非退出,可是用Intent方法其實並非那麼優雅,剛纔說了這個方法的實質是調用launcher,會致使全部應用所有轉到後臺,最近在作Android多任務相關工做,這麼作對於系統開發者和其餘應用形成不小的困擾,其實在activity層面調用moveTaskToBack就能夠搞定了
setSystemUiVisibility和setStatusBarColor要實現status bar的透明或者顏色用這兩個接口就能夠了,透明只須要設置SystemUiVisibility爲View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE,顏色的話調用後面那個接口就能夠,看到某某雲音樂用系統id status_bar_height高度各類計算,本身繪製來實現對於status bar的染色也是最了
loader和ContentObserver 實現數據於控制機制分離的很是好的結構,Android原生郵件系統使用了大量的這樣的模式,來處理繁雜的郵件相關的信息內容,加載郵件服務器內容到數據庫以及UI上的顯示更新徹底是兩條路
onbackpressed() 返回;
isshown() 判斷visibility;
runOnuithread. 和 view.post省了取handler過程;
string.format()格式化字符串;
sendOrderedBroadcast (Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
能夠設置一個最終廣播接收者 resultReceiver。即便有優先級高的廣播接收者使用了 abortBroadcast() 攔截了廣播,最終的廣播接收着依然能夠接收到廣播。
參考: Context | Android Developers(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle)
咕咚,熱愛代碼,喜歡倒騰的程序員
明明一個循環就搞定的東西,還要用一堆viewholder之類的設計模式。
弄個消息還要第三方組件。
寫個按鈕點擊事件還要繼承實現一堆東西,不是有病吧?
看看c#怎麼寫windows程序的,真心想死,恰恰一堆java的設計模式控還覺着挺樂
fragment + viewPager 寫tab菜單,由於作一個提交類的app,可能數據還沒填寫完就滑去另外一個fragment,回來數據有時候會掉。查了好多值資料後明白這是因爲fragment的緩存機制決定的。 默認狀況下,viewpager切換頁面時會緩存上一個頁面,非相鄰頁面被銷燬
viewPaper.setOffscreenPageLimit(2) 設置默認緩存fragment數目爲2則解決
田元,算不上程序員。
二、AndroidMainfest.xml activity的一些標籤, 好比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」∠)_
三、 getSystemService函數,獲取各類系統service,並且不用擔憂性能問題,都是直接返回各類manager。
四、 Parcelable接口
原來受MFC等c++類庫影響,比較習慣繼承serialiabe接口這種方式,但後來知道了Parcelable的實現方式就喜歡上了。
五、 android.support.v4.widget.DrawerLayout
原生大方的抽屜控件。
六、 android.support.v7.widget.Toolbar
定製性極強的viewGroup
楊亞斌,android ios 開發工程師
內部fragment的manager經過getChildFragmentManager()得到
另一些issue能夠查看 https://github.com/ayyb1988/android-issues