- 每次使用软引用、弱引用(SoftReference、WeakReference)时对引用进行检查判空
- 5.0+版本隐式启动Service会抛出异常(intent must explict异常)
- 隐式Intent的运行时检查保护
PackageManager().resolveActivity(intent)
、intent.resolveActivity(PMS)
- 需要被隐式启动的Activity,则必须在其
<intent-filter>
中加入"android.intent.category.DEFAULT"
属性,否则异常ActivityNotFoundException
- 在没有任何其他Intent Flag组合和taskAffinity设置的情况下,不会在新的Task中创建实例
- Intent Flag并不能代替LaunchMode
- 通知栏使用TaskStackBuilder返回栈时候,点击显示后按Back键,会返回到指定的Activity(
addParentStack()
添加XML指定),而不是返回主界面 - 应用UI是绘制在主线程中的,这个线程就是ActivityThread,它并没有继承自Thread,而是一个独立的类,只是在其main方法中开了一个Looper循环消息,不断接收处理发到主线程里面的消息
- ApplicationThread也不是一个Thread,是一个Binder,主要用于应用进程和ActivityManagerService进程间通信的
- Fragment对临时数据的保存,仅依靠
onSaveInstanceState()
是不行的,还要在onDestoryView()
中进行相应操作,持久性的数据,应在onPause()
中保存 - FileFilter类,此类根据文件名的扩展名、文件名等是否为来筛选文件、文件夹
- "@":引用自定义资源、"@android:type":引用系统资源、"@*" :引用系统的非public资源、"?":引用系统主题属性、"@+" :创建或引用资源
- 选择器selelctor有ColorStateList和StateListDrawable
-
android:allowTaskReparenting
:用于设定Activity能够从启动它的任务中转移到另一个与启动它的任务有亲缘关系的任务中,条件是在这个有亲缘关系的任务被带到前台的时候并设置了true - AdapterViewFlipper,StackView 类似于ListView显示为View的一个组件
-
android:adjustViewBounds
:是否保持ImageView的长宽比,需要和maxWidth、maxHeight一起使用 -
android:cropToPadding
:是否截取指定的空白区域代替,单独使用没效果,需要和scrollY一起使用 -
listView.setRecyclerListener
监听当组件被放入回收站 - ScrollView滚动到顶部必须要用消息机制Handler或者直接post
-
setImageResource、setImageBitmap、setBitmapDrawable
设置图片 -
Intent.FLAG_ACTIVITY_NEW_DOCUMENT
系统就会将创建的Activity 作为一个新的Task显示在 Overview Screen中 -
setHasOptionsMenu(true)
使Fragment可以点击菜单onCreateOptionsMenu()
生效 - 如果对View的宽高进行修改了,不要调用
super.onMeasure( widthMeasureSpec, heightMeasureSpec)
要调用setMeasuredDimension( widthsize, heightsize)
; -
adb logcat | grep "TAG_NAME"
&adb logcat -s "TAG_NAME"
终端查看log指定TagName - AlarmManager取消提醒一定要再重新创建所有的对象包括:Intent,PendingIntent且AlarmManager对象对应的action必须要一样
-
AsyncTask.executeOnExecutor(FULL_TASK_EXECUTOR)
参数表示使用自定义线程池 -
<uses-permission android:name="android.permission.XXX" android:maxSdkVersion="18"/>
表示只在API <= 18时,才申请该权限 - CardView里元素和CardView重叠了设置
app:cardPreventCornerOverlap="false"
,再处理元素背景、图片圆角 -
getBaseContext()
:If you want to access Context from another context within application you can access,ContextWrapper中的方法 - ResultReceiver用来接收其它进程回调结果的通用接口,使用直接实现该接口并实现
onReceiveResult(int, bundle)
- Canvas方法根据功能来看大致分为:以drawXXX为主的绘制方法、以clipXXX为主的裁剪方法、以scale、skew、translate和rotate组成的Canvas变换方法、以saveXXX和restoreXXX构成的画布锁定和还原
-
saveLayerXXX()
会将所有的操作存到一个新的Bitmap中而不影响当前Canvas的Bitmap,而save()
则是在当前的Bitmap中进行操作,并且只能针对Bitmap的形变和裁剪进行操作 - Dagger2:Component在搜索到目标类中用Inject注解标注的属性后,Component就会去Module中去查找用Provides标注的对应的创建类实例方法
-
setArguments()
必须在fragment创建以后,添加给Activity前完成 - fragment能够从Activity中接收返回结果,但是其自设无法产生返回结果,只有Activity拥有返回结果
- 使用Fragment时,通过
setTargetFragment()
和onActivityResult()
实现两个fragment之间的数据传递 - Fragment在
onPause()
和onStop()
中提交事务会引发异常,如果要在可能丢失状态的情况下提交事务,请使用commitAllowingStateLoss()
- 如果在除
onCreate()
之外的其他Activity生命周期函数中提交transaction,你可以在FragmentActivity的onResumeFragments()
和onPostResume()
中提交 - 通过
getFragments()
可以获取到当前FragmentManager管理的栈内所有Fragment - 观察者模式是一种一对多的关系,对于
setXXXListener()
是1对1的关系,应该叫回调 -
applyDimension(int unit, float value, DisplayMetrics metrics)
参数分别单位、值大小、屏幕密度 -
Paint.getTextBounds(text, 0, len, bounds)
当你通过这个方法来获取尺寸的时候,可以得到能够包裹文字的最小矩形对象 - 多线程定时器中尽可能使用
ScheduledExecutorService
(JDK1.5以后)替代Timer -
android:fillViewport="true"
让ScrollView内的view强行match_parent -
getMeasuredHeight()
是实际View的大小与屏幕无关,getHeight()
则是屏幕显示的大小,当超出屏幕后,getMeasuredHeight()
等于getHeight()
加上屏幕之外的大小 - 使用静态变量来缓存数据时,不管是在Application类还是其他类,都要注意因应用重建而引发的问题
-
android:clipToPadding="true"
默认true,ListView向上滑动时间距消失,对于父view padding所占的位置也绘制 -
android:clipChildren="true"
默认是true,这个属性是让子view不受父view大小的限制,可以超过父view的宽高,延伸到周围view内部 -
getSupportFragmentManager()
和getChildFragmentManager()
嵌套Fragment区别 -
ProcessBuilder
和Runtime.getRuntime().exec()
执行命令 - RemoteViewsService/RemoteViewsFactory:小控件ListView显示需要用到的类
- StorageManager反射调用隐藏接口
getVolumePaths()
,实现获取所有存储器列表、getVolumeState判断是否挂载 - 使用
Class.forName()
或者getClassLoader().loadClass()
,其中的类名必须是从包名到类名的完整路径 -
onResumeFragments()、onPostResume()
执行Fragment事务commit - Messenger进程间传递数据,如果通过bundle来携带数据则从另一个进程取出bundle时,需要
bundle.setClassLoader(getClass().getClassLoader())
来自己设置bundle的类加载器 -
setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
View不随SystemUI显示/隐藏而移动 - 要获取截图先要通过
setDrawingCacheEnable(true)
,然后再调用getDrawingCache()
就可以获得view的cache图片 -
View.setLayerType(View.LAYER_TYPE_HARDWARE, null)
复杂动画开启硬件加载可以更平滑,动画完毕需要释放硬件加速 - 指定此属性, 可以使子控件单独获取焦点, 不影响父元素
android:descendantFocusability="blocksDescendants"
- View类的
performClick()
和callOnclick()
都可以实现不用手动点击,直接触发View的点击事件 -
public static interface ViewTreeObserver.OnPreDrawListener
为即将绘制视图树时执行的回调函数定义的接口 - Activity的
managedQuery()
内部调用getContentResolver().query()
,它根据Activity的生命周期对Cursor对象进行管理,避免了一些因Cursor是否释放引起的问题(注:此方法已经过时,使用CursorLoader替代) -
getAction()& ACTION_POINTER_INDEX_MASK
获得pointer的id等同于getActionIndex()
,getAction()& ACTION_MASK
获得pointer事件类型等同于getActionMasked ()
- 观察Activity栈脚本
adb shell dumpsys activity | sed -n -e '/Stack #/p' -e '/Running activities/,/Run #0/p'
- ListActivity中ListView的Id为固定不变的,为
"@id/android/list"
- ListView的
setSelectionFromTop()
和RecyclerView中LayoutManager的scrollToPositionWithOffset()
都是滑动到指定位置 - 调用
saveLayer()
之后,创建了一个透明的图层,之后在调用restore()
之前,都是在这个图层上进行操作,而save()
则是直接在原先的图层上操作,那么对于某些操作,不希望原来图层的状态影响到它,那么我们应该使用saveLayer()
-
layout_width="wrap_content"
(等同"0dp"
),代表的是控件要优先尽可能的小 - 如果要 include 的子布局的根标签是
< Framelayout/>
,那么最好替换为<merge/>
这样可以减少嵌套 - 启动的Activity的launch mode为
SingleInstacne
或SignleTask
,且不论是从Activity还是从Fragment启动该Activity都会造成onActivityResult()
被立即触发 - 5.0去掉ListView最后Item的divider
android:footerDividersEnabled="false" android:overScrollFooter="@android:color/transparent"
- Android 3.2(API 13)以后,在设置Activity的
android:configChanges="orientation|keyboardHidden"
后,还是一样会重新调用各个生命周期的,必须设置"ScreenSize"
- Fragments do not have an on
RestoreInstanceState( )
,You can achieve the same result inonActivityCreated( )
-
resolveSizeAndState()
比getDefaultSize()
多State标志位信息和AT_MOST的判断 - DecorView是FramLayout的子类,DecorView的孩子节点就是一个LinearLayout,这个LinearLayout的孩子系节点就包括状态栏和我们自己写的布局(ContentView)
-
android:duplicateParentState
:可以使得子 View 可以复制父 View 的状态 -
android:digits
:EditText只能用的字符 - RoundedBitmapDrawable:support.v4内置的圆角图片
-
android:enterFadeDuration、android:exitFadeDuration
:selector改变状态时淡入淡出 -
getResources().getDimension(R.dimen.xxx)
获取的值并不一定是dimens.xml
中定义的,其值受屏幕密度影响 -
Fragment instantiate()
:用给定的类名创建一个新的Fragment对象实例。它跟调用空的构造器一样 - 启动页面防止加载白屏设置activity的theme中的
windowbackground="@null"
- 如果让应用生成的数据不被媒体库扫描到,在生成数据的文件夹下创建一个名为".nomedia"的隐藏文件,避免出现一些无意义的文件也被媒体库扫描到的情况
- Fragment本质上是嵌入在Activity中一个ViewGroup的View,但是谷歌给这个View赋予了生命周期
-
overridePendingTransition(0, 0)
:Activity过渡无动画 ,start和finish后面调用 -
MotionEvent中getX() getRawX()区别
:前者是相对于View左上角的X坐标,后者是相对于屏幕左上角的X坐标 -
getLocationInWindow()
:控件在其父窗口中的坐标位置 、getLocationOnScreen
:控件在其整个屏幕上的坐标位置,onWindowFocusChanged ()
之后才能使用 -
getLocalVisibleRect()
:获取View自身可见的坐标区域、getGlobalVisibleRect()
:获取View在屏幕绝对坐标系中的可视区域,onWindowFocusChanged ()
之后才能使用 -
StartAnimation()
:立即开启动画效果、SetAnimation()
:开启动画效果需要其父类调用invalidate()
-
setWillNotDraw(true)
:当自定义View继承自 ViewGroup 、且本身并不具备任何绘制时,设置为 true 后,系统会进行相应的优化 -
android:baselineAligned="false"
:当LinerLayout的子View都是ViewGroup(自定义控件除外)时,子View已经不需要基准线对齐了,false可以提高性能 -
invalidateOptionsMenu()
:在同一Activity不同Fragment需要显示不同的Menu的,调用该方法刷新Menu -
setTranscripMode()
: 设置只要ListView刷新就会滑动 - TextView设置了
TextUtils.TruncateAt.MARQUEE
,layout_height 不要设置MATCH_PARENT
或者WRAP_CONTENT
,否则焦点会有问题 - 监听USB插拔静态广播需要加改过滤
<data android:scheme="file"/>
Android Tips
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...