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设置的情况下,不会在新的Task中创建实例
  6. Intent Flag并不能代替LaunchMode
  7. 通知栏使用TaskStackBuilder返回栈时候,点击显示后按Back键,会返回到指定的Activity(addParentStack()添加XML指定),而不是返回主界面
  8. 应用UI是绘制在主线程中的,这个线程就是ActivityThread,它并没有继承自Thread,而是一个独立的类,只是在其main方法中开了一个Looper循环消息,不断接收处理发到主线程里面的消息
  9. ApplicationThread也不是一个Thread,是一个Binder,主要用于应用进程和ActivityManagerService进程间通信的
  10. Fragment对临时数据的保存,仅依靠onSaveInstanceState()是不行的,还要在onDestoryView()中进行相应操作,持久性的数据,应在onPause()中保存
  11. FileFilter类,此类根据文件名的扩展名、文件名等是否为来筛选文件、文件夹
  12. "@":引用自定义资源、"@android:type":引用系统资源、"@*" :引用系统的非public资源、"?":引用系统主题属性、"@+" :创建或引用资源
  13. 选择器selelctor有ColorStateList和StateListDrawable
  14. android:allowTaskReparenting :用于设定Activity能够从启动它的任务中转移到另一个与启动它的任务有亲缘关系的任务中,条件是在这个有亲缘关系的任务被带到前台的时候并设置了true
  15. AdapterViewFlipper,StackView 类似于ListView显示为View的一个组件
  16. android:adjustViewBounds :是否保持ImageView的长宽比,需要和maxWidth、maxHeight一起使用
  17. android:cropToPadding:是否截取指定的空白区域代替,单独使用没效果,需要和scrollY一起使用
  18. listView.setRecyclerListener监听当组件被放入回收站
  19. ScrollView滚动到顶部必须要用消息机制Handler或者直接post
  20. setImageResource、setImageBitmap、setBitmapDrawable设置图片
  21. Intent.FLAG_ACTIVITY_NEW_DOCUMENT 系统就会将创建的Activity 作为一个新的Task显示在 Overview Screen中
  22. setHasOptionsMenu(true)使Fragment可以点击菜单onCreateOptionsMenu()生效
  23. 如果对View的宽高进行修改了,不要调用 super.onMeasure( widthMeasureSpec, heightMeasureSpec) 要调用 setMeasuredDimension( widthsize, heightsize);
  24. adb logcat | grep "TAG_NAME"& adb logcat -s "TAG_NAME" 终端查看log指定TagName
  25. AlarmManager取消提醒一定要再重新创建所有的对象包括:Intent,PendingIntent且AlarmManager对象对应的action必须要一样
  26. AsyncTask.executeOnExecutor(FULL_TASK_EXECUTOR) 参数表示使用自定义线程池
  27. <uses-permission android:name="android.permission.XXX" android:maxSdkVersion="18"/>表示只在API <= 18时,才申请该权限
  28. CardView里元素和CardView重叠了设置 app:cardPreventCornerOverlap="false",再处理元素背景、图片圆角
  29. getBaseContext():If you want to access Context from another context within application you can access,ContextWrapper中的方法
  30. ResultReceiver用来接收其它进程回调结果的通用接口,使用直接实现该接口并实现onReceiveResult(int, bundle)
  31. Canvas方法根据功能来看大致分为:以drawXXX为主的绘制方法、以clipXXX为主的裁剪方法、以scale、skew、translate和rotate组成的Canvas变换方法、以saveXXX和restoreXXX构成的画布锁定和还原
  32. saveLayerXXX()会将所有的操作存到一个新的Bitmap中而不影响当前Canvas的Bitmap,而save()则是在当前的Bitmap中进行操作,并且只能针对Bitmap的形变和裁剪进行操作
  33. Dagger2:Component在搜索到目标类中用Inject注解标注的属性后,Component就会去Module中去查找用Provides标注的对应的创建类实例方法
  34. setArguments()必须在fragment创建以后,添加给Activity前完成
  35. fragment能够从Activity中接收返回结果,但是其自设无法产生返回结果,只有Activity拥有返回结果
  36. 使用Fragment时,通过setTargetFragment()onActivityResult()实现两个fragment之间的数据传递
  37. Fragment在onPause()onStop()中提交事务会引发异常,如果要在可能丢失状态的情况下提交事务,请使用commitAllowingStateLoss()
  38. 如果在除onCreate()之外的其他Activity生命周期函数中提交transaction,你可以在FragmentActivity的onResumeFragments()onPostResume()中提交
  39. 通过getFragments()可以获取到当前FragmentManager管理的栈内所有Fragment
  40. 观察者模式是一种一对多的关系,对于setXXXListener()是1对1的关系,应该叫回调
  41. applyDimension(int unit, float value, DisplayMetrics metrics)参数分别单位、值大小、屏幕密度
  42. Paint.getTextBounds(text, 0, len, bounds)当你通过这个方法来获取尺寸的时候,可以得到能够包裹文字的最小矩形对象
  43. 多线程定时器中尽可能使用ScheduledExecutorService(JDK1.5以后)替代Timer
  44. android:fillViewport="true"让ScrollView内的view强行match_parent
  45. getMeasuredHeight()是实际View的大小与屏幕无关,getHeight()则是屏幕显示的大小,当超出屏幕后, getMeasuredHeight()等于 getHeight()加上屏幕之外的大小
  46. 使用静态变量来缓存数据时,不管是在Application类还是其他类,都要注意因应用重建而引发的问题
  47. android:clipToPadding="true" 默认true,ListView向上滑动时间距消失,对于父view padding所占的位置也绘制
  48. android:clipChildren="true"默认是true,这个属性是让子view不受父view大小的限制,可以超过父view的宽高,延伸到周围view内部
  49. getSupportFragmentManager()getChildFragmentManager() 嵌套Fragment区别
  50. ProcessBuilderRuntime.getRuntime().exec()执行命令
  51. RemoteViewsService/RemoteViewsFactory:小控件ListView显示需要用到的类
  52. StorageManager反射调用隐藏接口getVolumePaths(),实现获取所有存储器列表、getVolumeState判断是否挂载
  53. 使用Class.forName()或者getClassLoader().loadClass(),其中的类名必须是从包名到类名的完整路径
  54. onResumeFragments()、onPostResume() 执行Fragment事务commit
  55. Messenger进程间传递数据,如果通过bundle来携带数据则从另一个进程取出bundle时,需要bundle.setClassLoader(getClass().getClassLoader())来自己设置bundle的类加载器
  56. setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)View不随SystemUI显示/隐藏而移动
  57. 要获取截图先要通过setDrawingCacheEnable(true) ,然后再调用getDrawingCache()就可以获得view的cache图片
  58. View.setLayerType(View.LAYER_TYPE_HARDWARE, null)复杂动画开启硬件加载可以更平滑,动画完毕需要释放硬件加速
  59. 指定此属性, 可以使子控件单独获取焦点, 不影响父元素
    android:descendantFocusability="blocksDescendants"
  60. View类的performClick()callOnclick()都可以实现不用手动点击,直接触发View的点击事件
  61. public static interface ViewTreeObserver.OnPreDrawListener即将绘制视图树时执行的回调函数定义的接口
  62. Activity的managedQuery()内部调用getContentResolver().query(),它根据Activity的生命周期对Cursor对象进行管理,避免了一些因Cursor是否释放引起的问题(注:此方法已经过时,使用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. 调用saveLayer()之后,创建了一个透明的图层,之后在调用restore()之前,都是在这个图层上进行操作,而save()则是直接在原先的图层上操作,那么对于某些操作,不希望原来图层的状态影响到它,那么我们应该使用saveLayer()
  68. layout_width="wrap_content" (等同 "0dp"),代表的是控件要优先尽可能的小
  69. 如果要 include 的子布局的根标签是< Framelayout/>,那么最好替换为 <merge/>这样可以减少嵌套
  70. 启动的Activity的launch mode为SingleInstacneSignleTask,且不论是从Activity还是从Fragment启动该Activity都会造成onActivityResult()被立即触发
  71. 5.0去掉ListView最后Item的dividerandroid:footerDividersEnabled="false" android:overScrollFooter="@android:color/transparent"
  72. Android 3.2(API 13)以后,在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的,必须设置"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的孩子节点就是一个LinearLayout,这个LinearLayout的孩子系节点就包括状态栏和我们自己写的布局(ContentView)
  76. android:duplicateParentState:可以使得子 View 可以复制父 View 的状态
  77. android:digits:EditText只能用的字符
  78. RoundedBitmapDrawable:support.v4内置的圆角图片
  79. android:enterFadeDuration、android:exitFadeDuration:selector改变状态时淡入淡出
  80. getResources().getDimension(R.dimen.xxx)获取的值并不一定是dimens.xml中定义的,其值受屏幕密度影响
  81. Fragment instantiate():用给定的类名创建一个新的Fragment对象实例。它跟调用空的构造器一样
  82. 启动页面防止加载白屏设置activity的theme中的windowbackground="@null"
  83. 如果让应用生成的数据不被媒体库扫描到,在生成数据的文件夹下创建一个名为".nomedia"的隐藏文件,避免出现一些无意义的文件也被媒体库扫描到的情况
  84. Fragment本质上是嵌入在Activity中一个ViewGroup的View,但是谷歌给这个View赋予了生命周期
  85. overridePendingTransition(0, 0):Activity过渡无动画 ,start和finish后面调用
  86. MotionEvent中getX() getRawX()区别:前者是相对于View左上角的X坐标,后者是相对于屏幕左上角的X坐标
  87. getLocationInWindow():控件在其父窗口中的坐标位置 、 getLocationOnScreen:控件在其整个屏幕上的坐标位置,onWindowFocusChanged ()之后才能使用
  88. getLocalVisibleRect():获取View自身可见的坐标区域、getGlobalVisibleRect():获取View在屏幕绝对坐标系中的可视区域,onWindowFocusChanged ()之后才能使用
  89. StartAnimation():立即开启动画效果、SetAnimation():开启动画效果需要其父类调用invalidate()
  90. setWillNotDraw(true):当自定义View继承自 ViewGroup 、且本身并不具备任何绘制时,设置为 true 后,系统会进行相应的优化
  91. android:baselineAligned="false":当LinerLayout的子View都是ViewGroup(自定义控件除外)时,子View已经不需要基准线对齐了,false可以提高性能
  92. invalidateOptionsMenu():在同一Activity不同Fragment需要显示不同的Menu的,调用该方法刷新Menu
  93. setTranscripMode(): 设置只要ListView刷新就会滑动
  94. TextView设置了TextUtils.TruncateAt.MARQUEE,layout_height 不要设置MATCH_PARENT或者WRAP_CONTENT,否则焦点会有问题
  95. 监听USB插拔静态广播需要加改过滤 <data android:scheme="file"/>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,373评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,732评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,163评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,700评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,036评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,425评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,737评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,421评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,141评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,398评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,908评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,276评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,907评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,018评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,772评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,448评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,325评论 2 261

推荐阅读更多精彩内容