Android開發(fā)中,那些相見恨晚的方法、類和接口以及一些不可不知的技巧

  • 圖標(biāo)資源對應(yīng)的像素
圖標(biāo)資源.png
  • 有些時候不能使用Application的Context,不然會報錯(比如啟動Activity,顯示Dialog等)
  • getParent().requestDisallowInterceptTouchEvent(true);剝奪父view 對touch 事件的處理權(quán),誰用誰知道。

  • ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue); 用于根據(jù)一個起始顏色值和一個結(jié)束顏色值以及一個偏移量生成一個新的顏色,分分鐘實現(xiàn)類似于微信底部欄滑動顏色漸變。

  • Canvas中clipRect、clipPath和clipRegion 剪切區(qū)域的API。

  • Bitmap.extractAlpha ();返回一個新的Bitmap,capture原始圖片的alpha 值。有的時候我們需要動態(tài)的修改一個元素的背景圖片又不希望使用多張圖片的時候,通過這個方法,結(jié)合Canvas 和Paint 可以動態(tài)的修改一個純色Bitmap的顏色。

  • HandlerThread,代替不停new Thread 開子線程的重復(fù)體力寫法。

  • IntentService,一個可以干完活后自己去死且不需要我們?nèi)ス芾碜泳€程的Service。

  • Palette,5.0加入的可以提取一個Bitmap 中突出顏色的類,結(jié)合上面的Bitmap.extractAlpha,你懂的。

  • Executors. newSingleThreadExecutor();這個是java 的,之前不知道它,自己花很大功夫去研究了單線程順序執(zhí)行的任務(wù)隊列。

  • android:animateLayoutChanges=”true”,LinearLayout中添加View 的動畫的辦法,支持通過setLayoutTransition()自定義動畫。

  • ViewDragHelper,自定義一個子View可拖拽的ViewGroup 時,處理各種事件很累吧,嗯? what the fuck!!

  • GradientDrawable,之前接手公司的項目,發(fā)現(xiàn)有個陰影效果還不錯,以為是切的圖片,一看代碼,什么鬼= =!

  • AsyncQueryHandler,如果做系統(tǒng)工具類的開發(fā),比如聯(lián)系人短信輔助工具等,肯定免不了和ContentProvider打交道,如果數(shù)據(jù)量不是很大的情況下,隨便搞,如果數(shù)據(jù)量大的情況下,了解下這個類是很有必要的,需要注意的是,這玩意兒吃異常..

  • ViewFlipper,實現(xiàn)多個view的切換(循環(huán)),可自定義動畫效果,且可針對單個切換指定動畫。

  • 有朋友提到了在自定義View時有些方法在開啟硬件加速的時候沒有效果的問題,在API16之后確實有很多方法不支持硬件加速,通常我們關(guān)閉硬件加速都是在清單文件中通過,其實android也提供了針對特定View關(guān)閉硬件加速的方法,調(diào)用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可。

  • android util包中的Pair類,可以方便的用來存儲一”組”數(shù)據(jù)。注意不是key value。

  • PointF,graphics包中的一個類,我們經(jīng)常見到在處理Touch事件的時候分別定義一個downX,一個downY用來存儲一個坐標(biāo),如果坐標(biāo)少還好,如果要記錄的坐標(biāo)過多那代碼就不好看了。用PointF(float x, float y);來描述一個坐標(biāo)點會清楚很多。

  • StateListDrawable,定義Selector通常的辦法都是xml文件,但是有的時候我們的圖片資源可能是從服務(wù)器動態(tài)獲取的,比如很多app所謂的皮膚,這種時候就只能通StateListDrawable
    來完成了,各種addState即可。

  • android:descendantFocusability,ListView的item中CheckBox等元素搶焦點導(dǎo)致item點擊事件無法響應(yīng)時,除了給對應(yīng)的元素設(shè)置 focusable,更簡單的是在item根布局加上android:descendantFocusability=”blocksDescendants”

  • android:duplicateParentState=”true”,讓子View跟隨其Parent的狀態(tài),如pressed等。常見的使用場景是某些時候一個按鈕很小,我們想要擴大其點擊區(qū)域的時候通常會再給其包裹一層布局,將點擊事件寫到Parent上,這時候如果希望被包裹按鈕的點擊效果對應(yīng)的Selector繼續(xù)生效的話,這時候duplicateParentState就派上用場了。

  • includeFontPadding=”false”,TextView默認上下是有一定的padding的,有時候我們可能不需要上下這部分留白,加上它即可。

  • Messenger,面試的時候通常都會被問到進程間通信,一般情況下大家都是開始背書,AIDL巴拉巴拉。。有一天在鴻神的博客看到這個,嗯,如他所說,又可以裝一下了。

  • TextView.setError();用于驗證用戶輸入。

  • ViewConfiguration.getScaledTouchSlop();觸發(fā)移動事件的最小距離,自定義View處理touch事件的時候,有的時候需要判斷用戶是否真的存在movie,系統(tǒng)提供了這樣的方法。

  • ValueAnimator.reverse(); 順暢的取消動畫效果。

  • ViewStub,有的時候一塊區(qū)域需要根據(jù)情況顯示不同的布局,通常我們都會通過setVisibility的方法來顯示和隱藏不同的布局,但是這樣默認是全部加載的,用ViewStub可以更好的提升性能。

  • onTrimMemory,在Activity中重寫此方法,會在內(nèi)存緊張的時候回調(diào)(支持多個級別),便于我們主動的進行資源釋放,避免OOM。

  • EditTxt.setImeOptions, 使用EditText彈出軟鍵盤時,修改回車鍵的顯示內(nèi)容(一直很討厭用回車鍵來交互,所以之前一直不知道這玩意兒)

  • TextView.setCompoundDrawablePadding,代碼設(shè)置TextView的drawable padding。

  • ImageSwitcher,可以用來做圖片切換的一個類,類似于幻燈片。

  • WeakHashMap,直接使用HashMap有時候會帶來內(nèi)存溢出的風(fēng)險,使用WaekHashMap實例化Map。當(dāng)使用者不再有對象引用的時候,WeakHashMap將自動被移除對應(yīng)Key值的對象。

  • isShown(),以前都是用view.getVisibility() == View.VISIBLE來判斷的(╯□╰)。

  • getStackTrace(),Throwable接口中的getStackTrace()方法(或者Thread類的getStackTrace()方法),根據(jù)這個方法可以得到函數(shù)的逐層調(diào)用地址,其返回值為StackTraceElement[]。

  • Application.registerActivityLifecycleCallbacks,用來監(jiān)聽一些Activity的回調(diào)。

  • setSelected(boolean),View類中的setSelected(boolean)方法結(jié)合android:state_selected=""用來實現(xiàn)圖片選中效果。

這里收集了大家常用的一些Android代碼,持續(xù)更新中,內(nèi)容來自自己的平時積累和網(wǎng)絡(luò)上看到的文章,部分原文地址在最下方。如有錯誤歡迎指正,如有侵權(quán),請聯(lián)系我刪除。里面可能會有重復(fù)內(nèi)容,請忽略或者提醒我刪除。<br /><br />

  • setBackgroundResource(0) 可以移除 View 的背景色

  • Resources.getSystem().getDisplayMetrics().density 可以不用 Context 也能獲取屏幕密度哦

  • 通過重載 ViewGroup 的 dispatchDraw 可以實現(xiàn)一個簡單的蒙版效果。 例如下拉刷新時,可以在 contentView 上加一層遮罩。 canvas.drawRect(0, mContentView.getTranslationY(), getWidth(), getHeight(), mMaskPaint);

  • new 出來的 View 可以用 View.generateViewId() (API 17 以上可用) 生成 id,系統(tǒng)保證唯一

  • 使用 GridView時 android:padding 和 android:clipToPadding="false" 配合使用效果更好哦。

  • 在布局文件中,如果只是為了占位,可以用 Space 來取代 View。 最棒的一點是Space可以跳過 Draw 這個過程。

  • TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics) 方便dp, px, sp 之間的轉(zhuǎn)換。

  • Activity.startActivities() 這個方法最直接的理解就是使用intent開啟多個Activity

  • TextUtils.isEmpty() 如果傳入的String 為NULL或者Length為0的話就返回 true。

  • Html.fromHtml() 如果你對Html熟悉的話,可以很迅速通過這個方法處理一些富文本操作。比如超鏈接和圖文排版等處理。

  • TextView.setError() 設(shè)置文本框錯誤提醒

  • Build.VERSION_CODES 有些時候我們的app需要根據(jù)不同的SDK版本進行執(zhí)行不同的操作

  • PhoneNumberUtils.convertKeypadLettersToDigits 這個方法簡單粗暴,會將輸入的字母根據(jù)鍵盤上的映射轉(zhuǎn)換為數(shù)字。

  • ArgbEvaluator ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);根據(jù)一個起始顏色值和一個結(jié)束顏色值以及一個偏移量生成一個新的顏色,分分鐘實現(xiàn)類似于微信底部欄滑動顏色漸變。

  • ValueAnimator.reverse() 順暢的取消動畫效果

  • DateUtils.formatDateTime()) 這個方法可以輸出相應(yīng)格式化的時間或者日期

  • Pair 這個類 可以用來存儲存儲一”組”數(shù)據(jù)。但不是key和value的關(guān)系。

  • SparseArray 目前有很多地方從性能優(yōu)化方說使用SparseArray來替換hashMap,來節(jié)省內(nèi)存,提高性能。

  • Linkify.addLinks() 這個類可以更方便的為文本添加超鏈接。

  • android.media.ThumbnailUtils這個類主要是用來處理縮略圖相關(guān)的工作,比如:用來獲取媒體(圖片、視頻)的縮略圖

createVideoThumbnail(String filePath, int kind)
extractThumbnail(Bitmap source, int width, int height)
  • Bitmap.extractAlpha ();返回一個新的Bitmap,capture原始圖片的alpha值。有的時候我們需要動態(tài)的修改一個元素的背景圖片又不希望使用多張圖片的時候,通過這個方法,結(jié)合Canvas和Paint可以動態(tài)的修改一個純色Bitmap的顏色。

  • 模塊間有消息需要傳遞時,使用LocalBroadcastManager替代Listener進行模塊解耦。除了解耦,這樣發(fā)送消息和執(zhí)行消息差一個線程循環(huán),可以減小方法的調(diào)用鏈,我這就碰到一次方法調(diào)用鏈太長導(dǎo)致StackOverflow的問題。

  • 靜態(tài)變量不要直接或者間接引用Activity、Service等。這會使用Activity以及它所引用的所有對象無法釋放,然后,用戶操作時間一長,內(nèi)存就會狂升。

  • Handler機制有一個特點是不會隨著Activity、Service的生命周期結(jié)束而結(jié)束。也就是說,如果你Post了一個Delay的Runnable,然后在Runnable執(zhí)行之前退出了Activity,Runnable到時間之后還是要執(zhí)行的。如果Runnable里面包含更新View的操作,可能會造成內(nèi)存泄露,所以可以在 onDestory() 的時候調(diào)用removeCallbacksAndMessages來移除這個Handler所對應(yīng)等待執(zhí)行的message。

  • 不少人在子線程中更新View時喜歡使用Context.runOnUiThread,這個方法有個缺點,就是一但Context生命周期結(jié)束,比如Activity已經(jīng)銷毀時,一調(diào)用就會崩潰。

  • SharedPreferences.Editor.commit這個方法是同步的,一直到把數(shù)據(jù)同步到Flash上面之后才會返回,由IO操作的不可控,盡量使用apply方法代替。apply只在API Level>=9才會支持,需要做兼容。不過,最新的 support v4 包已經(jīng)為我們做好了處理,使用 SharedPreferencesCompat.EditorCompat.getInstance().apply(editor) 即可。

  • PackageManager.getInstalledPackages這個方法經(jīng)常使用,你可能不知道,當(dāng)獲取的結(jié)果數(shù)量比較多的時候,在某些機型上面調(diào)用它花費的時間可能秒級的,所以盡量在子線程中使用。另外,如果結(jié)果太多,超過系統(tǒng)設(shè)置的Binder數(shù)據(jù)最大傳輸量的上限,則會發(fā)生TransactionException,如果你使用這個方法獲取機器上的己安裝應(yīng)用列表,最好做一下預(yù)防。

  • 如果使用Context.startActivity啟動外部應(yīng)用,最好做一下異常預(yù)防,因為尋找不到對應(yīng)的應(yīng)用時,會拋出異常。如果你要打開的是應(yīng)用內(nèi)的Activity,不防使用顯式Intent,這樣能提高系統(tǒng)搜索目標(biāo)Activity的效率。

  • Application的生命周期就是進程的生命周期。只有進程被干掉時,Application才會銷毀。哪怕是沒有Activity、Service在運行,Application也會存在。所以,為了減少內(nèi)存壓力,盡量不要在Application里面引用大對象、Context等。

  • 設(shè)置全屏方法有2種:1.通過代碼設(shè)置,2通過manifest文件設(shè)置。用代碼設(shè)置全屏?xí)rapp在我們應(yīng)用運行后,可能會看到短暫的狀態(tài)欄,然后才全屏,而第二種方法是不會有這種情況的,所以推薦第二種。

//方法1: 
//無title   
requestWindowFeature(Window.FEATURE_NO_TITLE);    
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN,WindowManager.LayoutParams. FLAG_FULLSCREEN);   
//必須在setContentView()之前調(diào)用
setContentView(R.layout.main);  
//方法2:
<activity android:name="." 
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" //全屏主題
    android:label="@string/app_name" />
  • viewpager 的 setCurrentItem 一定要在 setAdapter 方法之后調(diào)用才會有效果.

  • 判斷手機是不是飛行模式 boolean isEnabled = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1;

  • TabLayout 修改字體的方法
    官方的 TabLayout 沒有提供修改 TextView size 的方法,可以新建一個 style CustomTabLayoutTextAppearance 繼承 TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse ,然后增加 item ,設(shè)置 android:textAllCaps 為 true ,再設(shè)置 android:textSize 為你想設(shè)置的大小。


再在 TabLayout 的布局文件里設(shè)置 app:tabTextAppearance="@style/CustomTabLayoutTextAppearance" 即可。

  • 遍歷HashMap的最佳方法
public static void printMap(Map mp) {
    for (Map.Entry m : mp.entrySet()) {
            System.out.println(m.getKey() + ":" + m.getValue());
        }
}
  • 使用Java在一個區(qū)間內(nèi)產(chǎn)生隨機整數(shù)數(shù)
public static int randInt(int min, int max) {
    Random rand = new Random();
    int randomNum = rand.nextInt((max - min) + 1) + min;
    return randomNum;
}
  • 如果子類實現(xiàn)Serializable接口而父類未實現(xiàn)時,父類不會被序列化,但此時父類必須有個無參構(gòu)造方法,否則會拋InvalidClassException異常。

  • transient關(guān)鍵字修飾變量可以限制序列化。

  • 當(dāng)使用JakeWharton的TabPageIndicator時,如果需要先做一些耗時的操作,然后再展示TabPageIndicator的話,需要先設(shè)置mIndirector.setVisibility(View.GONE);然后耗時任務(wù)結(jié)束以后再mIndirector.setVisibility(View.VISIBLE);否則會報錯

  • 類繼承之間的調(diào)用順序 父類static成員 -> 子類static成員 -> 父類普通成員初始化和初始化塊 -> 父類構(gòu)造方法 -> 子類普通成員初始化和初始化塊 -> 子類構(gòu)造方法

  • 華為手機無法顯示log解決方案,.撥號界面輸入(*#*#2846579#*#*) Service menu will appear.Go to "ProjectMenu" -> "Background Setting" -> "Log Setting"Open "Log switch" and set it to ON.Open "Log level setting" and set the log level you wish.

  • 后臺service經(jīng)常因為重啟之類的出現(xiàn)onStartCommand()中的Intent傳遞的參數(shù)為null, 通過在onStartCommand()中的返回值改成return super.onStartCommand(intent, Service.START_REDELIVER_INTENT, startId); 可以解決問題。下面介紹幾個flag的意思<br />

  • | flag | 解釋 |
    | ------------- |:-------------:|
    | START_STICKY | 如果service進程被kill掉,保留service的狀態(tài)為開始狀態(tài),但不保留遞送的intent對象。隨后系統(tǒng)會嘗試重新創(chuàng)建service,由于服務(wù)狀態(tài)為開始狀態(tài),所以創(chuàng)建服務(wù)后一定會調(diào)用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那么參數(shù)Intent將為null。 |
    | START_NOT_STICKY | “非粘性的”。使用這個返回值時,如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉,系統(tǒng)不會自動重啟該服務(wù)。 |
    |START_REDELIVER_INTENT|重傳Intent。使用這個返回值時,如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉,系統(tǒng)會自動重啟該服務(wù),并將Intent的值傳入。|
    |START_STICKY_COMPATIBILITY|START_STICKY的兼容版本,但不保證服務(wù)被kill后一定能重啟。 |

  • 不能在Activity沒有完全顯示時顯示PopupWindow和Dialog

  • 在多進程之間不要用SharedPreferences共享數(shù)據(jù),雖然可以(MODE_MULTI_PROCESS),但極不穩(wěn)定

  • 謹慎使用Android的透明主題,透明主題會導(dǎo)致很多問題,比如:如果新的Activity采用了透明主題,那么當(dāng)前Activity的onStop方法不會被調(diào)用;在設(shè)置為透明主題的Activity界面按Home鍵時,可能會導(dǎo)致刷屏不干凈的問題;進入主題為透明主題的界面會有明顯的延時感

  • 不要在非UI線程中初始化ViewStub,否則會返回null

  • 盡量不要通過Application緩存數(shù)據(jù),這不穩(wěn)定

  • 華為手機無法打開USB調(diào)試的問題,

  1. 插好數(shù)據(jù)線,撥號界面 輸入 ##2846579## 進入工程模式
  2. projectmenu→3后臺設(shè)置→4USB端口配置→Balong調(diào)試模式,點確定
  3. 不要拔線,退出工程模式,直接重啟手機,電腦中顯示可移動磁盤(若仍未出現(xiàn),重復(fù)步驟1、2)
  4. 這個是關(guān)閉USB調(diào)試的情況下電腦中使用手機的可移動磁盤的方法,使用后下拉菜單中usb選項也回來了。
  • android listview中的消息被軟鍵盤遮擋了,在設(shè)置listview的時候加上android:transcriptMode="normal"就好了

  • TextUtils 是一個非常好用的工具類,把 List<String> 轉(zhuǎn)成字符串,逗號分隔,逗號分隔的 String 字符串,切割成 List<String> ,分別可以用 TextUtils 的 join 和 split 方法。如果要對 List 去重,則可以用 Collection 的 frequency 方法。

  • 在activity中調(diào)用 moveTaskToBack (boolean nonRoot)方法即可將activity 退到后臺,注意不是finish()退出。

  • activity中的runOnUiThrea(Runnable action)方法可以直接回到主線程

  • listview有個footerDividersEnabled和headerDividersEnabled方法可以設(shè)置listview的頂部和底部divide,但是必須保證你設(shè)置了headview和footview才會有效果

  • Throwable類中的getStackTrace()方法,根據(jù)這個方法可以得到函數(shù)的逐層調(diào)用地址,其返回值為StackTraceElement[];

  • StackTraceElement類,其中四個方法getClassName(),getFileName(),getLineNumber(),getMethodName()在調(diào)試程序打印Log時非常有用;

  • UncaughtExceptionHandler接口,再好的代碼異常難免,利用此接口可以對未捕獲的異常善后

  • Resources類中的getIdentifier(name, defType, defPackage)方法,根據(jù)資源名稱獲取其ID,做UI時經(jīng)常用到;

  • view的isShown方法,只有當(dāng)view本身以及它的所有祖先們都是visible時,isShown()才返回TRUE。而平常我們調(diào)用if(view.getVisibility() == View.VISIBLE)只是對view本身而不對祖先的可見性進行判斷。

  • Arrays類中的一系列關(guān)于數(shù)組操作的工具方法:binarySearch(),asList(),equals(),sort(),toString(),copyOfRange()等;Collections類中的一系列關(guān)于集合操作的工具方法:sort(),reverse()等;

  • TextView類中的append(CharSequence)方法,添加文本。一些特殊文本直接用+連接會變成String;

  • System類中的arraycopy(src, srcPos, dest, destPos, length)方法,用來copy數(shù)組;

  • Fragment類中的onHiddenChanged(boolean)方法,使用FragmentTransaction中的hide(),show()時只會調(diào)用Fragment中的show和hidden狀態(tài),其他生命周期不會調(diào)用。

  • Activity類中的onWindowFocusChanged(boolean),onNewIntent(intent)等回調(diào)方法;

  • TextView類中的setTransformationMethod(TransformationMethod)方法,可用來實現(xiàn)“顯示密碼”功能

  • PageTransformer接口,用來自定義ViewPager頁面切換動畫,用setPageTransformer(boolean, PageTransformer)方法來進行設(shè)置;

  • apache提供的一系列jar包:commons-lang.jar,commons-collections.jar,commons-beanutils.jar等,里面很多方法可能是你曾經(jīng)用幾十幾百行代碼實現(xiàn)過的,但是執(zhí)行效率或許要差很多,比如:ArrayUtils,StringUtils……;

  • ActivityLifecycleCallbacks接口,用于在Application類中監(jiān)聽各Activity的狀態(tài)變化 閱讀地址點我

  • ActionBar.hide()/.show() 顧名思義,隱藏和顯示ActionBar,可以優(yōu)雅地在全屏和帶Actionbar之間轉(zhuǎn)換。

  • SystemClock.sleep() 這個方法在保證一定時間的 sleep 時很方便,通常我用來進行 debug 和模擬網(wǎng)絡(luò)延時。

  • UrlQuerySanitizer——使用這個工具可以方便對 URL 進行檢查。

  • ActivityOptions ——方便的定義兩個Activity切換的動畫。 使用ActivityOptionsCompat 可以很好解決舊版本的兼容問題。

  • getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權(quán),誰用誰知道。

  • HandlerThread,代替不停new Thread開子線程的重復(fù)體力寫法。

  • IntentService,一個可以干完活后自己去死且不需要我們?nèi)ス芾碜泳€程的Service

  • Executors. newSingleThreadExecutor();這個是java的,之前不知道它,自己花很大功夫去研究了單線程順序執(zhí)行的任務(wù)隊列

  • android:animateLayoutChanges="true",LinearLayout中添加View的動畫的辦法,支持通過setLayoutTransition()自定義動畫。

  • AsyncQueryHandler,如果做系統(tǒng)工具類的開發(fā),比如聯(lián)系人短信輔助工具等,肯定免不了和ContentProvider打交道,如果數(shù)據(jù)量不是很大的情況下,隨便搞,如果數(shù)據(jù)量大的情況下,了解下這個類是很有必要的,需要注意的是,這玩意兒吃異常..

  • ViewFlipper,實現(xiàn)多個view的切換(循環(huán)),可自定義動畫效果,且可針對單個切換指定動畫。

  • android util包中的Pair類,可以方便的用來存儲一"組"數(shù)據(jù)。注意不是key value

  • android:descendantFocusability,ListView的item中CheckBox等元素搶焦點導(dǎo)致item點擊事件無法響應(yīng)時,除了給對應(yīng)的元素設(shè)置 focusable,更簡單的是在item根布局加上android:descendantFocusability=”blocksDescendants”

  • includeFontPadding="false",TextView默認上下是有一定的padding的,有時候我們可能不需要上下這部分留白,加上它即可。

  • Messenger,面試的時候通常都會被問到進程間通信,一般情況下大家都是開始背書,AIDL巴拉巴拉。。有一天在鴻神的博客看到這個,嗯,如他所說,又可以裝一下了。

  • EditTxt.setImeOptions, 使用EditText彈出軟鍵盤時,修改回車鍵的顯示內(nèi)容(一直很討厭用回車鍵來交互,所以之前一直不知道這玩意兒)

  • java8中新增的LocalDate和LocalTime接口,Date雖然是個萬能接口,但是它真的不好用,有了這倆,終于可以愉快的處理日期時間了。

  • WeakHashMap,直接使用HashMap有時候會帶來內(nèi)存溢出的風(fēng)險,使用WaekHashMap實例化Map。當(dāng)使用者不再有對象引用的時候,WeakHashMap將自動被移除對應(yīng)Key值的對象。

  • 使用SnackBar的時候,不要使用view.getRootView()作為snackbar的view,華為榮耀7 會出問題。

  • 設(shè)置TextView單行顯示的時候不要用Lines=1,而要用singleLine="true" ,因為魅族部分手機在設(shè)置Lines=1的時候,然后TextView的值全為數(shù)字的時候, 你就會懵逼了.

  • TouchDelegate可用于更改View的觸摸區(qū)域。場景:比如在RecyclerView的ItemView里包含了CheckBox組件, 然后想實現(xiàn)點擊ItemView的時候,也可以觸發(fā)CheckBox,就可以使用此類

  • ArgbEvaluator可用于計算不同顏色值之間的插值,配合ValueAnimator.ofObject或者ViewPager.PageTransformer使用,可以實現(xiàn)不同顏色之間的平滑過渡。

  • Palette可用于提取一張圖片的顏色。

  • ViewDragHelper,做過自定義ViewGroup的童鞋都應(yīng)該知道這個東西吧,用來處理觸摸事件的神器,媽媽再也不用擔(dān)心我自定義控件了。

  • PageTransformer用于定義ViewPager頁面切換時的動畫效果(淡入淡出,放大縮小神馬的…)官方有例子,直接看吧。

  • Formatter.formatFileSize() 這個方法會格式化數(shù)據(jù)的大小,根據(jù)輸入的字節(jié)大小,返回 B KB MB GB 等等(最大支持到 PB)。當(dāng)然要注意的是輸入的最大值是 Long.MAX_VALUE.

  • Activity.recreate重新創(chuàng)建Activity。有什么用呢?可以在程序更換主題后,立馬刷新當(dāng)前Activity,而不會有明顯的重啟Activity的動畫。

  • View.getContext顧名思義,就不用解釋了吧…以前在寫RecyclerView的Adapter的時候,為了使用LayoutInflater,經(jīng)常傻乎乎地在構(gòu)造函數(shù)中傳入一個外部的context….是不是只有我不知道而已(笑cry臉)

  • View.post方便在非UI線程對界面進行修改,與Handler的作用類似。并且由于post的Runnable會保證在該View繪制完成的前提下才調(diào)用,所以一般也可以用于獲取View的寬高。

  • Activity.runOnUiThread與View.post類似,方便在非UI線程中對界面進行修改。

  • Fragment在配合PagerAdapter使用的時候可以重寫setUserVisibleHintFragment()方法,然后根據(jù)參數(shù)的布爾值(true的話表示當(dāng)前Fragment對用戶可見),來執(zhí)行一些邏輯。

  • android:animateLayoutChanges 這是一個非??犰诺膶傩?。在父布局加上 android:animateLayoutChanges="true" 后,如果觸發(fā)了layout方法(比如它的子View設(shè)置為GONE),系統(tǒng)就會自動幫你加上布局改變時的動畫特效?。?/p>

  • android:clipToPadding 設(shè)置父view是否允許其子view在它的padding(這里指的是父View的padding)中繪制。是不是有點繞?舉個實際場景吧:假如有個ListView,我們想要在初始位置時,第一項Item離頂部有10dp的距離,就可以在ListView的布局中加入android:clipToPadding="false" android:paddingTop="10dp"即可。是不是很方便呢?

  • rv 的 Layoutmanager 可以直接申明在 xml 中,具體代碼可查看RecyclerView.createLayoutManager 方法.

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:stackFromEnd="true"
        app:layoutManager="LinearLayoutManager"/>
<declare-styleable name="RecyclerView">
        <attr name="layoutManager" format="string"/>
        <attr name="android:orientation"/>
        <attr name="spanCount" format="integer"/>
        <attr name="reverseLayout" format="boolean"/>
        <attr name="stackFromEnd" format="boolean"/>
</declare-styleable>
public static Properties getProperties(Context context, AttributeSet attrs,
                int defStyleAttr, int defStyleRes) {
            Properties properties = new Properties();
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RecyclerView,
                    defStyleAttr, defStyleRes);
            properties.orientation = a.getInt(R.styleable.RecyclerView_android_orientation,
                    VERTICAL);
            properties.spanCount = a.getInt(R.styleable.RecyclerView_spanCount, 1);
            properties.reverseLayout = a.getBoolean(R.styleable.RecyclerView_reverseLayout, false);
            properties.stackFromEnd = a.getBoolean(R.styleable.RecyclerView_stackFromEnd, false);
            a.recycle();
            return properties;
        }
  • RecyclerView在23.2.+的版本中新增了自動測量的功能,由于新增了自動測量,那么它的item的根布局在需要測量的方向上就不能寫match_parent了,需要改成wrap_content

  • getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權(quán),誰用誰知道。

  • Canvas中clipRect、clipPath和clipRegion剪切區(qū)域的API。

  • GradientDrawable 有個陰影效果還不錯,以為是切的圖片,一看代碼,什么鬼= =!

  • 有朋友提到了在自定義View時有些方法在開啟硬件加速的時候沒有效果的問題,在API16之后確實有很多方法不支持硬件加速,通常我們關(guān)閉硬件加速都是在清單文件中通過<application android:hardwareAccelerated="false" ...>,其實android也提供了針對特定View關(guān)閉硬件加速的方法,調(diào)用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可。

  • PointF,graphics包中的一個類,我們經(jīng)常見到在處理Touch事件的時候分別定義一個downX,一個downY用來存儲一個坐標(biāo),如果坐標(biāo)少還好,如果要記錄的坐標(biāo)過多那代碼就不好看了。用PointF(float x, float y);來描述一個坐標(biāo)點會清楚很多。

  • StateListDrawable,定義Selector通常的辦法都是xml文件,但是有的時候我們的圖片資源可能是從服務(wù)器動態(tài)獲取的,比如很多app所謂的皮膚,這種時候就只能通StateListDrawable來完成了,各種addState即可。

  • android:duplicateParentState="true",讓子View跟隨其Parent的狀態(tài),如pressed等。常見的使用場景是某些時候一個按鈕很小,我們想要擴大其點擊區(qū)域的時候通常會再給其包裹一層布局,將點擊事件寫到Parent上,這時候如果希望被包裹按鈕的點擊效果對應(yīng)的Selector繼續(xù)生效的話,這時候duplicateParentState就派上用場了。

  • ViewConfiguration.getScaledTouchSlop();觸發(fā)移動事件的最小距離,自定義View處理touch事件的時候,有的時候需要判斷用戶是否真的存在movie,系統(tǒng)提供了這樣的方法。

  • ViewStub,有的時候一塊區(qū)域需要根據(jù)情況顯示不同的布局,通常我們都會通過setVisibility的方法來顯示和隱藏不同的布局,但是這樣默認是全部加載的,用ViewStub可以更好的提升性能。

  • onTrimMemory,在Activity中重寫此方法,會在內(nèi)存緊張的時候回調(diào)(支持多個級別),便于我們主動的進行資源釋放,避免OOM。

  • TextView.setCompoundDrawablePadding,代碼設(shè)置TextView的drawable padding。

  • ImageSwitcher,可以用來做圖片切換的一個類,類似于幻燈片。

  • 在自定義控件的時候,能用drawable來繪制圓,或者其他樣式的時候,盡量用drawable,因為drawable的效果要遠勝于canvas.drawXXX().

  • 如果想要自定義View支持SwipeRefreshLayout,只需要聲明并實現(xiàn)ScrollingView接口即可,RecyclerView和NestedScrollView已經(jīng)實現(xiàn)此接口。

  • AtomicFile——通過使用備份文件進行文件的原子化操作。這個知識點之前我也寫過,不過最好還是有出一個官方的版本比較好。

  • DatabaseUtils——一個包含各種數(shù)據(jù)庫操作的使用工具。

  • Activity.isChangingConfigurations ()——如果在 Activity 中 configuration 會經(jīng)常改變的話,使用這個方法就可以不用手動做保存狀態(tài)的工作了。

  • SearchRecentSuggestionsProvider——可以創(chuàng)建最近提示效果的 provider,是一個簡單快速的方法。

  • 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)的時候,可以定義它展示前的淡入淡出效果。

  • Log.wtf()的意思是What a Terrible Failure,而不是What The Fuck!

  • 使用RenderScript虛化圖片效果。如果你的app的minSDK為16或者更低,你需要使用support模式,因為很多方法都是在API 17之后添加的。renderscriptTargetApi最高到23,但是你應(yīng)該把它設(shè)置到能保持腳本中使用到的功能完整的最低API。如果你想在support模式下target API 21+你必須使用gradle-plugin 2.1.0 和 buildToolsVersion “23.0.3” 或者以上。需要在gradle中添加renderscriptTargetApi 18,renderscriptSupportModeEnabled true 這兩句話

public static Bitmap blurBitmap(Context context, Bitmap src, int radius) {
        Bitmap dest = src.copy(src.getConfig(), true);
        RenderScript rs = RenderScript.create(context);
        Allocation allocation = Allocation.createFromBitmap(rs, src);
        Type t = allocation.getType();
        Allocation blurredAllocation = Allocation.createTyped(rs, t);
        ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        blurScript.setRadius(radius);
        blurScript.setInput(allocation);
        blurScript.forEach(blurredAllocation);
        blurredAllocation.copyTo(dest);
        allocation.destroy();
        blurredAllocation.destroy();
        blurScript.destroy();
        t.destroy();
        rs.destroy();
        return dest;
    }
  • 如果想把一個view保存為Bitmap,正常情況下用第一種方法就可以了,但是如果是ScrollView,則必須采用第二種方法。
public static Bitmap createBitmap(View v){
        v.setDrawingCacheEnabled(true);
        v.buildDrawingCache();
        Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache());
        v.setDrawingCacheEnabled(false);
        return bitmap;
    }
public static Bitmap createBitmap(ScrollView v){
        int width = 0 ,height = 0;
        for (int i = 0; i < v.getChildCount(); i++){
            width += v.getChildAt(i).getWidth();
            height += v.getChildAt(i).getHeight();
        }
        Bitmap bitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        v.draw(canvas);
        return bitmap;
    }
  • 當(dāng)Activity LauncherMode 為singleTask singleInstance時,使用startActivityForResult會立馬返回,不能正常調(diào)用。具體請看http://www.360doc.com/content/15/0123/14/12928831_443085580.shtml

  • 當(dāng)PopupWindow中有EditText控件時,因為Popupwindow 默認沒有獲取到焦點,需要手動設(shè)置焦點,這樣子view才能獲取到事件的監(jiān)聽。所以你需要在創(chuàng)建完popwindow后設(shè)置他的焦點,popupWindow.setFocusable(true);就可以讓EditText獲取焦點。

  • PopupWindow默認點擊外部的時候不消失,需要對PopupWindow 設(shè)置一個背景圖popWindow.setBackgroundDrawable(new BitmapDrawable());要創(chuàng)建一個空對象,設(shè)置為null是不行的,或者就創(chuàng)建一個全透明的背景圖。

  • android中的序列化官方推薦Parceble,其實Parceble最好用于內(nèi)存之間數(shù)據(jù)的交換,如果要把數(shù)據(jù)寫入硬盤的話,推薦實現(xiàn)Serializable

  • tools標(biāo)簽可以很好的幫助開發(fā)者實時預(yù)覽xml的效果,通過tools:background可以預(yù)覽控件所占的控件,tools:visibility可以把一個gone的控件在預(yù)覽的時候展示出來,并且運行以后tools標(biāo)簽的內(nèi)容不會展示出來.例如:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:background="#FF00FF"
    tools:visibility="visible"
    tools:text="這段話只在預(yù)覽時能看到,運行以后就看不到了" />
  • android studio 2.1起已經(jīng)支持jdk8了,使用的時候要在gradle中加上,需要把buildToolsVersion更新到24以上的版本
android {
    defaultConfig {
    ...
            jackOptions {
                enabled true
            }
        }
   ...
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}
  • 6.0之后getResources().getColor()方法被廢棄了,大家可以用ContextCompat.getColor(context, R.color.color_name)替換,ContextCompat 是 v4 包里的,請放心使用,另外還有g(shù)etDrawable()等方法

  • 圖片的資源文件官方推薦只把launcher放在mipmap文件夾下面,而app用到的資源文件建議放在drawable下面。

  • SharedPreference.Editor的apply是異步操作,不會返回成功的狀態(tài),而commit是同步操作,因此,在多個并發(fā)的提交commit的時候,他們會等待正在處理的commit保存到磁盤后再操作下一個數(shù)據(jù),從而降低了效率。

  • 如果你在 manifest 中把一個 activity 設(shè)置成 android:windowSoftInputMode="adjustResize",那么 ScrollView(或者其它可伸縮的 ViewGroups)會縮小,從而為軟鍵盤騰出空間。但是,如果你在 activity 的主題中設(shè)置了 android:windowFullscreen="true",那么 ScrollView 不會縮小。這是因為該屬性強制 ScrollView 全屏顯示。然而在主題中設(shè)置 android:fitsSystemWindows="false" 也會導(dǎo)致 adjustResize 不起作用

  • 在Android 4.0以后,在Manifest.xml中靜態(tài)注冊的廣播,程序安裝后必須啟動一次才能接收到廣播,比如你的應(yīng)用監(jiān)聽開機啟動的廣播,必須要你的程序被運行過才能監(jiān)聽到

  • Activity的onDestory方法調(diào)用時機是不確定的(有時候離開界面很久之后才會調(diào)用onDestory方法),應(yīng)該避免指望通過onDestory方法去釋放與Activity相關(guān)的資源,否則會導(dǎo)致一些隨機bug

  • 2.X時代Bitmap對象雖然存儲在堆內(nèi)存中,但是用了一個byte數(shù)組存儲其像素信息。通過計數(shù)器來記錄該像素信息被引用的個數(shù)。有人認為這個byte數(shù)組在native堆中,但事實上它也在堆中。只有在使用者調(diào)用recycle()后,Bitmap對象才會釋放像素信息,才會在失去引用后被垃圾回收機制銷毀。再加上DVM的heap size有嚴(yán)格的閥值,所以在使用大量圖片資源的時候,及其容易發(fā)生OOM。解決辦法一般都是,用一個哈希表存儲Bitmap對象的軟引用,作為內(nèi)存緩存,并在適當(dāng)時機掉用其recycle()。3.0以上版本Bitmap對象可以通過垃圾回收機制完全銷毀,理論上不用再調(diào)用recycle()。

  • .gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經(jīng)被納入了版本管理中,則修改.gitignore是無效的。那么解決方法就是先把本地緩存刪除(改變成未track狀態(tài)),然后再提交:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'
  • 時間戳請使用long或者String類型接收,遇到的坑,由于項目中的model好多都是通過GsonFormat生成的,服務(wù)器給的json中的時間戳都是10位的,導(dǎo)致了GsonFormat自動解析成了int, 當(dāng)測試人員選擇時間為2100年的時候時間戳是4開頭的十位 用int類型接收越界了,導(dǎo)致報錯

  • 為你的app添加默認布局樣式,比如:每一個控件都需要寫width和height屬性,然而很多的控件的寬高屬性都是wrap_content,那么我們可以通過在style文件添加如下樣式:

<style name="Theme.YourApp" parent="android:style/Theme.Light">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>

這樣,控件的寬高默認都是wrap_content樣式啦。

  • 在style中寫的樣式通過視同parent標(biāo)簽來擴展你的樣式,這樣更高效,這里官方的建議是,只有Android自帶的style才用parent標(biāo)簽,如果是自定義的style,直接用.符號來連接就行。如Fill.Height。
<style name="Fill">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">fill_parent</item>
</style>
<style name="Fill.Height" >
    <item name="android:orientation">vertical</item>
</style>
  • Android上的應(yīng)用切換按鈕列出的其實不是應(yīng)用而是Task,所以你會看到有的應(yīng)用在切換視圖里有多個任務(wù)。如果你的應(yīng)用中有邏輯上相互獨立的部分,或者想在多窗口環(huán)境下并排顯示應(yīng)用的兩個不同部分,這種情況就適合多任務(wù)了。使用manifest屬性(靜態(tài))或者 intent flags(動態(tài))可以實現(xiàn)這一點,詳見視頻: http://v.youku.com/v_show/id_XMTU2ODk4NDg2NA==.html?f=26587294
  • 當(dāng)app的theme用的是NoActionBar,但是在layout中仍然用到toolbar的時候,不要在style文件中加fitsSystemWindows屬性,而是在用到toolbar的layout最外層加fitsSystemWindows,否則當(dāng)你使用EditText,在小米手機上長按EditText調(diào)出系統(tǒng)粘貼功能的時候,粘貼的layout的布局會錯位.

  • 當(dāng)WebView與ScrollView嵌套使用,并且WebView有字體放大縮小的功能時,當(dāng)切換webview的字體后,webview的高度并不能很好的計算出來,這時候可以通過注入的方式,讓js算出高度,經(jīng)測試,這樣是最可靠的,代碼地址:http://blog.csdn.net/jys1115/article/details/43525979

  • Context類中的createPackageContext(packageName, flags)方法,可用來獲取指定包名應(yīng)用程序的Context對象。

  • TextView類的setKeyListener(KeyListener)方法;
    其中DigitsKeyListener類,使用getInstance(String accepted)方法即可指定EditText可輸入字符集;

  • View類中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法,獲取View在窗口/屏幕中的位置;

  • Context.getCacheDir() - 可以獲取到app默認的緩存路徑。

  • StaticLayout 在自定義控件繪制文本的時候很有用。

  • Android中的四大組件千萬不要通過new的方式創(chuàng)建出來。

  • 測試app的時候,我們大都想要將debug和release版本同時安裝到手機里,可以通過在gradle中修改applicationid來實現(xiàn):

android {
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            versionNameSuffix '-DEBUG'
        }
        release {
            //...
        }
    }
}
  • 在大多數(shù)的登陸界面中,都提供了用戶是否讓密碼可見的選項,Support Library 24.2.0 提供了官方的實現(xiàn),TextInputLayout 中添加了 passwordToggleEnabled 屬性來開啟此功能,并且可以通過 passwordToggleDrawable 設(shè)置圖標(biāo)。(摘自:Android筆記的微博)

  • 同樣,在Support Library 24.2.0中增加RecyclerView 在快速滾動時的回調(diào)接口,SnapHelper是官方的一個實現(xiàn)OnFlingListener 的 一個抽象類,LinearSnapHelper 則是一個完整的實現(xiàn).LinearSnapHelper默認實現(xiàn)的功能是類似ViewPager,在滾動結(jié)束后,會選擇列表某一條居中展示(這里有開始位置展示,或者結(jié)束位置顯示點我).例如:

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(linearLayoutManager);
    LinearSnapHelper snapHelper = new LinearSnapHelper();
    snapHelper.attachToRecyclerView(recyclerView);
  • Android中推薦使用的數(shù)據(jù)結(jié)構(gòu) :
ArrayMap<K,V> in place of HashMap<K,V> 
ArraySet<K,V> in place of HashSet<K,V> 
SparseArray<V> in place of HashMap<Integer,V> 
SparseBooleanArray in place of HashMap<Integer,Boolean> 
SparseIntArray in place of HashMap<Integer,Integer>  
SparseLongArray in place of HashMap<Integer,Long>  
LongSparseArray<V> in place of HashMap<Long,V>
  • 生成GUID(由于java中只能生成UUID,所以這里要轉(zhuǎn)換一下):
    return UUID.randomUUID().toString().toUpperCase().replaceAll("-", "");
  • 業(yè)務(wù)場景:需要定時后臺掃描數(shù)據(jù)庫,上傳本地照片至云端,定時任務(wù)采用何種模式:
    1.Handler或者Timer定時一般為秒級別的任務(wù),Timer會啟動額外線程,而Handler可以不用。
    2.無論是Handler還是Timer都需要依賴于進程存活
    3.利用Handler實現(xiàn)定時任務(wù)的類:HandlerTimer
    4.如果時間較長,則需要使用AlarmManager
    5.另外,我們對于這種業(yè)務(wù)應(yīng)該優(yōu)先考慮是否可以基于事件通知。
    6.如果是加入媒體庫的文件,我們可以使用registerContentObserver監(jiān)聽媒體庫文件變化。

  • 把Activity作為參數(shù)傳給一個靜態(tài)方法,會影響這個Activity的正常銷毀嗎?
    1.內(nèi)存泄露與方法是否是靜態(tài)與否無關(guān),與內(nèi)部的方法體實現(xiàn)有關(guān)系。
    2.內(nèi)存泄露可以簡單理解成:生命周期長的對象不正確持有了持有了生命周期短的對象,導(dǎo)致生命周期短的對象無法回收。
    3.比如Activity實例被Application對象持有,Activity實例被靜態(tài)變量持有。

  • 在assert文件夾下存放單個文件的大小不能超過1M,如果讀取超過1M的文件會報 "Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)" 的IOException。如果一定要存儲,可以分割文件,再去合并文件

  • 在Android library中不能使用switch-case語句訪問資源ID,因為case分支后面跟的參數(shù)必須是常數(shù),而library中的每一個資源ID都沒有被聲明為final。

  • 當(dāng)前Activity的onPause方法執(zhí)行結(jié)束后才會執(zhí)行下一個Activity的onCreate方法,所以在onPause方法中不適合做耗時較長的工作,這會影響到頁面之間的跳轉(zhuǎn)效率;

  • 不要通過Bundle傳遞大塊的數(shù)據(jù),否則會報TransactionTooLargeException異常

  • (AnimationDrawable在Android5.0及以上的版本已有明顯的優(yōu)化)盡量不要使用AnimationDrawable,它在初始化的時候就將所有圖片加載到內(nèi)存中,特別占內(nèi)存,并且還不能釋放,釋放之后下次進入再次加載時會報錯;

  • .9圖不能通過tinypng壓縮,不然會有問題;

  • genymotion模擬器快是因為它是基于x86架構(gòu)的,如果你的應(yīng)用中用到了so,但沒有x86架構(gòu)的so,只能放棄使用它;Android Studio的模擬器也一樣;

  • 使用Toast時,建議定義一個全局的Toast對象,這樣可以避免連續(xù)顯示Toast時不能取消上一次Toast消息的情況(如果你有連續(xù)彈出Toast的情況,避免使用Toast.makeText);

  • 盡量避免給window和Activity同時都設(shè)置了背景,這樣會造成過渡繪制,可以通過在給Activity設(shè)置主題時,去掉windowBackground背景的方式減少一層過渡繪制,有時候為了避免進入Activity時會黑屏或者白屏(和主題有關(guān)),會在給Activity設(shè)置主題的時候給window設(shè)置背景,如果這種情況下給Activity也設(shè)置了背景,是會增加一倍內(nèi)存的:

<item name="android:windowBackground">@null</item>
  • 設(shè)置中更改字體為特大之類的會影響到app的字體樣式,解決方法有: 1.將所有字體使用的單位換成dp,不再使用sp.這樣不是很靠譜,并不是所有人都能做到。
 Configuration configuration = getResources().getConfiguration();
  configuration.fontScale = (float) 1; 
  //0.85 小, 1 標(biāo)準(zhǔn)大小, 1.15 大,1.3 超大 ,1.45 特大 
  DisplayMetrics metrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(metrics); 
  metrics.scaledDensity = configuration.fontScale * metrics.density;
  getBaseContext().getResources().updateConfiguration(configuration, metrics); 
  //(ps:dialog popupwindow 除外,這兩種需要在控件中重新設(shè)置fontScale)
  • Android中新引入的替代枚舉的注解有IntDef和StringDef,這里以IntDef做例子說明一下.
public class Colors {
    @IntDef({RED, GREEN, YELLOW})
    //聲明必要的int常量,使用@IntDef修飾LightColors,參數(shù)設(shè)置為待枚舉的集合
    @Retention(RetentionPolicy.SOURCE)
    //使用@Retention(RetentionPolicy.SOURCE)指定注解僅存在與源碼中,不加入到class文件中
    public @interface LightColors{}
    //聲明一個注解為LightColors
    public static final int RED = 0;
    public static final int GREEN = 1;
    public static final int YELLOW = 2;
}
//用法
private void setColor(@Colors.LightColors int color) {
        Log.d("MainActivity", "setColor color=" + color);
}
//調(diào)用的該方法的時候
setColor(Colors.GREEN);
  • PathInterpolatorCompat 很方便的使用它來創(chuàng)建各種插值曲線,舉個非常簡單的例子:
Path path = new Path();
path.cubicTo(0.2f, 0f, 0.1f, 1f, 0.5f, 1f);
path.lineTo(1f, 1f);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.TRANSLATION_X, 500);
animator.setInterpolator(PathInterpolatorCompat.create(path));
animator.start();
  • 檢測當(dāng)前網(wǎng)絡(luò)能否訪問遠程服務(wù)器(國內(nèi)通過ping百度來檢測)
public static boolean isNetWorkAvailable(final Context context) {
        try {
            Runtime runtime = Runtime.getRuntime();
            Process pingProcess = runtime.exec("/system/bin/ping -c 1 www.baidu.com");
            int exitCode = pingProcess.waitFor(); //0 代表連通,2代表不通
            return (exitCode == 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
  • 攔截系統(tǒng)返回鍵(onBackPressed()),使App不退出,而是進入后臺運行
@Override
  public void onBackPressed() {
    moveTaskToBack(false);
  }
  • view.performClick() 自動調(diào)用 View 點擊事件。通常按鈕等控件只有在用戶點擊時才能觸發(fā)其點擊事件,該方法可以由某些特殊條件觸發(fā)模擬用戶點擊行為。類似的還有 performLongClick() 方法。

  • Linkify.addLinks() 通過 android:autoLink 屬性可以為其添加諸如 web、phone 等固定模版的超鏈接點擊事件。但畢竟系統(tǒng)模版有限,而利用 Linkify.addLinks() 方法可以添加一些應(yīng)用內(nèi)自定義模版,比如新浪微博中的 "@XXX" 格式的超鏈接跳轉(zhuǎn)等,都可以通過自定義正則表達式來匹配處理。

  • getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE) 設(shè)置安全窗口,禁用系統(tǒng)截屏。防止 App 中的一些界面被截屏,并顯示在其他設(shè)備中造成信息泄漏。(常見手機設(shè)備系統(tǒng)截屏操作方式為:同時按下電源鍵和音量鍵。)

  • activity生命周期(Ref Link)

  • RecyclerView 調(diào)用notifyItem()的時候會有默認的動畫,可以通過調(diào)用((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);來去掉默認動畫.以防止出現(xiàn)閃屏的問題

  • Toolbar 使用的主題如果 parent="ThemeOverlay.AppCompat.Light",只要改一下 <item name="colorControlNormal">@color/white</item> 就可以使 OverflowButton 變?yōu)榘咨?,同時點擊它展開的菜單背景也可以是白的

  • Android View的生命周期示例圖樣。

  • 當(dāng)需要從資源文件中獲取 html 并展示時,使用 Resource#getText() 而不是 Resource#getString()。當(dāng)需要動態(tài)顯示 HTML 時,使用 Html.fromHtml() 請看這里

  • JAVA中時間String轉(zhuǎn)Timestamp

try {
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    format.setLenient(false);
    //要轉(zhuǎn)換字符串 str_test  自定義的格式為 yyyy-mm-dd,可以改成你需要的格式
    String str_test ="2011-04-24";
    Timestamp ts = new Timestamp(format.parse(str_test).getTime());
    System.out.println(ts.toString());
} catch (ParseException e) {
e.printStackTrace();
}
  • 當(dāng)Activity 繼承 FragmentActivity的時候,調(diào)用startActivityForResult方法中傳遞的requestCode范圍應(yīng)該在0-65535范圍內(nèi),否則會報"Can only use lower 16 bits for requestCode"異常。

  • Android有一個隱藏的類可以判斷文本輸入框內(nèi)輸入的是不是表情,這個類就是 android.text.Emoji類,它的isEmoji(int codePoint)方法可以直接判斷出來是不是表情。這個類是隱藏的,如果要用到則需要將它拷貝出來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容