總結Android 開發中一些很有用但你不知道的方法

vimxcy 7年前發布 | 6K 次閱讀 安卓開發 Android開發 移動開發

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Pair 這個類 可以用來存儲存儲一”組”數據。但不是key和value的關系。

  • SparseArray 目前有很多地方從性能優化方說使用SparseArray來替換hashMap,來節省內存,提高性能。

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

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

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

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

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

  • Handler機制有一個特點是不會隨著Activity、Service的生命周期結束而結束。也就是說,如果你Post了一個Delay的Runnable,然后在Runnable執行之前退出了Activity,Runnable到時間之后還是要執行的。如果Runnable里面包含更新View的操作,程序崩潰了。

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

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

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

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

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

  • getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);設置全屏方法一定要在setContentView之后

  • viewpager 的 setCurrentItem 一定要在 setAdapter 方法之后調用才會有效果.

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

  • 遍歷HashMap的最佳方法

public static void printMap(Map mp) {   
for (Map.Entry m : mp.entrySet()) {

   System.out.println(m.getKey() + ":" + m.getValue());</pre> 

   }
}
  • 使用Java在一個區間內產生隨機整數數

  • public static int randInt(int min, int max) { 
    
  • Random rand = new Random();   
       int randomNum = rand.nextInt((max - min) + 1) + min;    
       return randomNum;
    }
  • 如果子類實現Serializable接口而父類未實現時,父類不會被序列化,但此時父類必須有個無參構造方法,否則會拋InvalidClassException異常。

  • transient關鍵字修飾變量可以限制序列化。

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

  • 類繼承之間的調用順序 父類static成員 -> 子類static成員 -> 父類普通成員初始化和初始化塊 -> 父類構造方法 -> 子類普通成員初始化和初始化塊 -> 子類構造方法

  • 華為手機無法顯示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經常因為重啟之類的出現onStartCommand()中的Intent傳遞的參數為null, 通過在onStartCommand()中的返回值改成return super.onStartCommand(intent, Service.START_REDELIVER_INTENT, startId); 可以解決問題。下面介紹幾個flag的意思

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

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

 

來自:http://mp.weixin.qq.com/s/N7o12OwAbIjPmaHbm4greA

 

 本文由用戶 vimxcy 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!