Android Tips

  1. 每次使用軟引用、弱引用(SoftReference、WeakReference)時對引用進行檢查判空
  2. 5.0+版本隱式啟動Service會拋出異常(intent must explict異常)
  3. 隱式Intent的運行時檢查保護PackageManager().resolveActivity(intent)、intent.resolveActivity(PMS)
  4. 需要被隱式啟動的Activity,則必須在其 <intent-filter>中加入"android.intent.category.DEFAULT"屬性,否則異常ActivityNotFoundException
  5. 在沒有任何其他Intent Flag組合和taskAffinity設(shè)置的情況下,不會在新的Task中創(chuàng)建實例
  6. Intent Flag并不能代替LaunchMode
  7. 通知欄使用TaskStackBuilder返回棧時候,點擊顯示后按Back鍵,會返回到指定的Activity(addParentStack()添加XML指定),而不是返回主界面
  8. 應(yīng)用UI是繪制在主線程中的,這個線程就是ActivityThread,它并沒有繼承自Thread,而是一個獨立的類,只是在其main方法中開了一個Looper循環(huán)消息,不斷接收處理發(fā)到主線程里面的消息
  9. ApplicationThread也不是一個Thread,是一個Binder,主要用于應(yīng)用進程和ActivityManagerService進程間通信的
  10. Fragment對臨時數(shù)據(jù)的保存,僅依靠onSaveInstanceState()是不行的,還要在onDestoryView()中進行相應(yīng)操作,持久性的數(shù)據(jù),應(yīng)在onPause()中保存
  11. FileFilter類,此類根據(jù)文件名的擴展名、文件名等是否為來篩選文件、文件夾
  12. "@":引用自定義資源、"@android:type":引用系統(tǒng)資源、"@*" :引用系統(tǒng)的非public資源、"?":引用系統(tǒng)主題屬性、"@+" :創(chuàng)建或引用資源
  13. 選擇器selelctor有ColorStateList和StateListDrawable
  14. android:allowTaskReparenting :用于設(shè)定Activity能夠從啟動它的任務(wù)中轉(zhuǎn)移到另一個與啟動它的任務(wù)有親緣關(guān)系的任務(wù)中,條件是在這個有親緣關(guān)系的任務(wù)被帶到前臺的時候并設(shè)置了true
  15. AdapterViewFlipper,StackView 類似于ListView顯示為View的一個組件
  16. android:adjustViewBounds :是否保持ImageView的長寬比,需要和maxWidth、maxHeight一起使用
  17. android:cropToPadding:是否截取指定的空白區(qū)域代替,單獨使用沒效果,需要和scrollY一起使用
  18. listView.setRecyclerListener監(jiān)聽當組件被放入回收站
  19. ScrollView滾動到頂部必須要用消息機制Handler或者直接post
  20. setImageResource、setImageBitmap、setBitmapDrawable設(shè)置圖片
  21. Intent.FLAG_ACTIVITY_NEW_DOCUMENT 系統(tǒng)就會將創(chuàng)建的Activity 作為一個新的Task顯示在 Overview Screen中
  22. setHasOptionsMenu(true)使Fragment可以點擊菜單onCreateOptionsMenu()生效
  23. 如果對View的寬高進行修改了,不要調(diào)用 super.onMeasure( widthMeasureSpec, heightMeasureSpec) 要調(diào)用 setMeasuredDimension( widthsize, heightsize);
  24. adb logcat | grep "TAG_NAME"& adb logcat -s "TAG_NAME" 終端查看log指定TagName
  25. AlarmManager取消提醒一定要再重新創(chuàng)建所有的對象包括:Intent,PendingIntent且AlarmManager對象對應(yīng)的action必須要一樣
  26. AsyncTask.executeOnExecutor(FULL_TASK_EXECUTOR) 參數(shù)表示使用自定義線程池
  27. <uses-permission android:name="android.permission.XXX" android:maxSdkVersion="18"/>表示只在API <= 18時,才申請該權(quán)限
  28. CardView里元素和CardView重疊了設(shè)置 app:cardPreventCornerOverlap="false",再處理元素背景、圖片圓角
  29. getBaseContext():If you want to access Context from another context within application you can access,ContextWrapper中的方法
  30. ResultReceiver用來接收其它進程回調(diào)結(jié)果的通用接口,使用直接實現(xiàn)該接口并實現(xiàn)onReceiveResult(int, bundle)
  31. Canvas方法根據(jù)功能來看大致分為:以drawXXX為主的繪制方法、以clipXXX為主的裁剪方法、以scale、skew、translate和rotate組成的Canvas變換方法、以saveXXX和restoreXXX構(gòu)成的畫布鎖定和還原
  32. saveLayerXXX()會將所有的操作存到一個新的Bitmap中而不影響當前Canvas的Bitmap,而save()則是在當前的Bitmap中進行操作,并且只能針對Bitmap的形變和裁剪進行操作
  33. Dagger2:Component在搜索到目標類中用Inject注解標注的屬性后,Component就會去Module中去查找用Provides標注的對應(yīng)的創(chuàng)建類實例方法
  34. setArguments()必須在fragment創(chuàng)建以后,添加給Activity前完成
  35. fragment能夠從Activity中接收返回結(jié)果,但是其自設(shè)無法產(chǎn)生返回結(jié)果,只有Activity擁有返回結(jié)果
  36. 使用Fragment時,通過setTargetFragment()onActivityResult()實現(xiàn)兩個fragment之間的數(shù)據(jù)傳遞
  37. Fragment在onPause()onStop()中提交事務(wù)會引發(fā)異常,如果要在可能丟失狀態(tài)的情況下提交事務(wù),請使用commitAllowingStateLoss()
  38. 如果在除onCreate()之外的其他Activity生命周期函數(shù)中提交transaction,你可以在FragmentActivity的onResumeFragments()onPostResume()中提交
  39. 通過getFragments()可以獲取到當前FragmentManager管理的棧內(nèi)所有Fragment
  40. 觀察者模式是一種一對多的關(guān)系,對于setXXXListener()是1對1的關(guān)系,應(yīng)該叫回調(diào)
  41. applyDimension(int unit, float value, DisplayMetrics metrics)參數(shù)分別單位、值大小、屏幕密度
  42. Paint.getTextBounds(text, 0, len, bounds)當你通過這個方法來獲取尺寸的時候,可以得到能夠包裹文字的最小矩形對象
  43. 多線程定時器中盡可能使用ScheduledExecutorService(JDK1.5以后)替代Timer
  44. android:fillViewport="true"讓ScrollView內(nèi)的view強行match_parent
  45. getMeasuredHeight()是實際View的大小與屏幕無關(guān),getHeight()則是屏幕顯示的大小,當超出屏幕后, getMeasuredHeight()等于 getHeight()加上屏幕之外的大小
  46. 使用靜態(tài)變量來緩存數(shù)據(jù)時,不管是在Application類還是其他類,都要注意因應(yīng)用重建而引發(fā)的問題
  47. android:clipToPadding="true" 默認true,ListView向上滑動時間距消失,對于父view padding所占的位置也繪制
  48. android:clipChildren="true"默認是true,這個屬性是讓子view不受父view大小的限制,可以超過父view的寬高,延伸到周圍view內(nèi)部
  49. getSupportFragmentManager()getChildFragmentManager() 嵌套Fragment區(qū)別
  50. ProcessBuilderRuntime.getRuntime().exec()執(zhí)行命令
  51. RemoteViewsService/RemoteViewsFactory:小控件ListView顯示需要用到的類
  52. StorageManager反射調(diào)用隱藏接口getVolumePaths(),實現(xiàn)獲取所有存儲器列表、getVolumeState判斷是否掛載
  53. 使用Class.forName()或者getClassLoader().loadClass(),其中的類名必須是從包名到類名的完整路徑
  54. onResumeFragments()、onPostResume() 執(zhí)行Fragment事務(wù)commit
  55. Messenger進程間傳遞數(shù)據(jù),如果通過bundle來攜帶數(shù)據(jù)則從另一個進程取出bundle時,需要bundle.setClassLoader(getClass().getClassLoader())來自己設(shè)置bundle的類加載器
  56. setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)View不隨SystemUI顯示/隱藏而移動
  57. 要獲取截圖先要通過setDrawingCacheEnable(true) ,然后再調(diào)用getDrawingCache()就可以獲得view的cache圖片
  58. View.setLayerType(View.LAYER_TYPE_HARDWARE, null)復(fù)雜動畫開啟硬件加載可以更平滑,動畫完畢需要釋放硬件加速
  59. 指定此屬性, 可以使子控件單獨獲取焦點, 不影響父元素
    android:descendantFocusability="blocksDescendants"
  60. View類的performClick()callOnclick()都可以實現(xiàn)不用手動點擊,直接觸發(fā)View的點擊事件
  61. public static interface ViewTreeObserver.OnPreDrawListener即將繪制視圖樹時執(zhí)行的回調(diào)函數(shù)定義的接口
  62. Activity的managedQuery()內(nèi)部調(diào)用getContentResolver().query(),它根據(jù)Activity的生命周期對Cursor對象進行管理,避免了一些因Cursor是否釋放引起的問題(注:此方法已經(jīng)過時,使用CursorLoader替代)
  63. getAction()& ACTION_POINTER_INDEX_MASK獲得pointer的id等同于getActionIndex(),getAction()& ACTION_MASK獲得pointer事件類型等同于getActionMasked ()
  64. 觀察Activity棧腳本
    adb shell dumpsys activity | sed -n -e '/Stack #/p' -e '/Running activities/,/Run #0/p'
  65. ListActivity中ListView的Id為固定不變的,為"@id/android/list"
  66. ListView的setSelectionFromTop()和RecyclerView中LayoutManager的scrollToPositionWithOffset()都是滑動到指定位置
  67. 調(diào)用saveLayer()之后,創(chuàng)建了一個透明的圖層,之后在調(diào)用restore()之前,都是在這個圖層上進行操作,而save()則是直接在原先的圖層上操作,那么對于某些操作,不希望原來圖層的狀態(tài)影響到它,那么我們應(yīng)該使用saveLayer()
  68. layout_width="wrap_content" (等同 "0dp"),代表的是控件要優(yōu)先盡可能的小
  69. 如果要 include 的子布局的根標簽是< Framelayout/>,那么最好替換為 <merge/>這樣可以減少嵌套
  70. 啟動的Activity的launch mode為SingleInstacneSignleTask,且不論是從Activity還是從Fragment啟動該Activity都會造成onActivityResult()被立即觸發(fā)
  71. 5.0去掉ListView最后Item的dividerandroid:footerDividersEnabled="false" android:overScrollFooter="@android:color/transparent"
  72. Android 3.2(API 13)以后,在設(shè)置Activity的android:configChanges="orientation|keyboardHidden"后,還是一樣會重新調(diào)用各個生命周期的,必須設(shè)置"ScreenSize"
  73. Fragments do not have an onRestoreInstanceState( ),You can achieve the same result in onActivityCreated( )
  74. resolveSizeAndState()getDefaultSize()多State標志位信息和AT_MOST的判斷
  75. DecorView是FramLayout的子類,DecorView的孩子節(jié)點就是一個LinearLayout,這個LinearLayout的孩子系節(jié)點就包括狀態(tài)欄和我們自己寫的布局(ContentView)
  76. android:duplicateParentState:可以使得子 View 可以復(fù)制父 View 的狀態(tài)
  77. android:digits:EditText只能用的字符
  78. RoundedBitmapDrawable:support.v4內(nèi)置的圓角圖片
  79. android:enterFadeDuration、android:exitFadeDuration:selector改變狀態(tài)時淡入淡出
  80. getResources().getDimension(R.dimen.xxx)獲取的值并不一定是dimens.xml中定義的,其值受屏幕密度影響
  81. Fragment instantiate():用給定的類名創(chuàng)建一個新的Fragment對象實例。它跟調(diào)用空的構(gòu)造器一樣
  82. 啟動頁面防止加載白屏設(shè)置activity的theme中的windowbackground="@null"
  83. 如果讓應(yīng)用生成的數(shù)據(jù)不被媒體庫掃描到,在生成數(shù)據(jù)的文件夾下創(chuàng)建一個名為".nomedia"的隱藏文件,避免出現(xiàn)一些無意義的文件也被媒體庫掃描到的情況
  84. Fragment本質(zhì)上是嵌入在Activity中一個ViewGroup的View,但是谷歌給這個View賦予了生命周期
  85. overridePendingTransition(0, 0):Activity過渡無動畫 ,start和finish后面調(diào)用
  86. MotionEvent中g(shù)etX() getRawX()區(qū)別:前者是相對于View左上角的X坐標,后者是相對于屏幕左上角的X坐標
  87. getLocationInWindow():控件在其父窗口中的坐標位置 、 getLocationOnScreen:控件在其整個屏幕上的坐標位置,onWindowFocusChanged ()之后才能使用
  88. getLocalVisibleRect():獲取View自身可見的坐標區(qū)域、getGlobalVisibleRect():獲取View在屏幕絕對坐標系中的可視區(qū)域,onWindowFocusChanged ()之后才能使用
  89. StartAnimation():立即開啟動畫效果、SetAnimation():開啟動畫效果需要其父類調(diào)用invalidate()
  90. setWillNotDraw(true):當自定義View繼承自 ViewGroup 、且本身并不具備任何繪制時,設(shè)置為 true 后,系統(tǒng)會進行相應(yīng)的優(yōu)化
  91. android:baselineAligned="false":當LinerLayout的子View都是ViewGroup(自定義控件除外)時,子View已經(jīng)不需要基準線對齊了,false可以提高性能
  92. invalidateOptionsMenu():在同一Activity不同F(xiàn)ragment需要顯示不同的Menu的,調(diào)用該方法刷新Menu
  93. setTranscripMode(): 設(shè)置只要ListView刷新就會滑動
  94. TextView設(shè)置了TextUtils.TruncateAt.MARQUEE,layout_height 不要設(shè)置MATCH_PARENT或者WRAP_CONTENT,否則焦點會有問題
  95. 監(jiān)聽USB插拔靜態(tài)廣播需要加改過濾 <data android:scheme="file"/>

最后編輯于
?著作權(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)容