Android开发中,那些让你相见恨晚的方法、类或接口(第二弹,神总结)

Part 1:

Activity.startActivities() 常用于在应用程序中间启动其他的Activity。

TextUtils.isEmpty() 简单的工具类,用于检测是否为空。

Html.fromHtml() 用于生成一个Html,参数可以是一个字符串.个人认为它不是很快,所以我不怎么经常去用.(我说不经常用它是为了重点突出这句话:请多手动构建 Spannable 来替换 Html.fromHtml),但是它对渲染从 web 上获取的文字还是很不错的。

TextView.setError() 在验证用户输入的时候很棒。

Build.VERSION_CODES 这个标明了当前的版本号,在处理兼容性问题的时候经常会用到.点进去可以看到各个版本的不同特性。

Log.getStackTraceString() 方便的日志类工具,方法Log.v()、Log.d()、Log.i()、Log.w()和Log.e()都是将信息打印到LogCat中,有时候需要将出错的信息插入到数据库或一个自定义的日志文件中,那么这种情况就需要将出错的信息以字符串的形式返回来,也就是使用static String getStackTraceString(Throwable tr)方法的时候。

LayoutInflater.from() 顾名思义,用于Inflate一个layout,参数是layout的id.这个经常写Adapter的人会用的比较多。

ViewConfiguration.getScaledTouchSlop()使用 ViewConfiguration 中提供的值以保证所有触摸的交互都是统一的。这个方法获取的值表示:用户的手滑动这个距离后,才判定为正在进行滑动.当然这个值也可以自己来决定.但是为了一致性,还是使用标准的值较好。

PhoneNumberUtils.convertKeypadLettersToDigits 顾名思义.将字母转换为数字,类似于T9输入法,

Context.getCacheDir()  获取缓存数据文件夹的路径,很简单但是知道的人不多,这个路径通常在SD卡上(这里的SD卡指的是广义上的SD卡,包括外部存储和内部存储)Adnroid/data/您的应用程序包名/cache/  下面.测试的时候,可以去这里面看是否缓存成功.缓存在这里的好处是:不用自己再去手动创建文件夹,不用担心用户把自己创建的文件夹删掉,在应用程序卸载的时候,这里会被清空,使用第三方的清理工具的时候,这里也会被清空。

ArgbEvaluator 用于处理颜色的渐变。就像 Chris Banes 说的一样,这个类会进行很多自动装箱的操作,所以最好还是去掉它的逻辑自己去实现它。这个没用过,不明其所以然,回头再补充.

ContextThemeWrapper 方便在运行的时候修改主题。

Space space是Android 4.0中新增的一个控件,它实际上可以用来分隔不同的控件,其中形成一个空白的区域.这是一个轻量级的视图组件,它可以跳过Draw,对于需要占位符的任何场景来说都是很棒的。

ValueAnimator.reverse() 这个方法可以很顺利地取消正在运行的动画。


Part 2:

DateUtils.formatDateTime() 用来进行区域格式化工作,输出格式化和本地化的时间或者日期。

AlarmManager.setInexactRepeating 通过闹铃分组的方式省电,即使你只调用了一个闹钟,这也是一个好的选择,(可以确保在使用完毕时自动调用 AlarmManager.cancel ()。原文说的比较抽象,这里详细说一下:setInexactRepeating指的是设置非准确闹钟,使用方法:alarmManager.setInexactRepeating(AlarmManager.RTC, startTime,intervalL, pendingIntent),非准确闹钟只能保证大致的时间间隔,但是不一定准确,可能出现设置间隔为30分钟,但是实际上一次间隔20分钟,另一次间隔40分钟。它的最大的好处是可以合并闹钟事件,比如间隔设置每30分钟一次,不唤醒休眠,在休眠8小时后已经积累了16个闹钟事件,而在手机被唤醒的时候,非准时闹钟可以把16个事件合并为一个, 所以这么看来,非准时闹钟一般来说比较节约能源。

Formatter.formatFileSize() 一个区域化的文件大小格式化工具。通俗来说就是把大小转换为MB,G,KB之类的字符串。

ActionBar.hide()/.show() 顾名思义,隐藏和显示ActionBar,可以优雅地在全屏和带Actionbar之间转换。

Linkify.addLinks() 在Text上添加链接。很实用。

StaticLayout  在自定义 View 中渲染文字的时候很实用。

Activity.onBackPressed()很方便的管理back键的方法,有时候需要自己控制返回键的事件的时候,可以重写一下。比如加入 “点两下back键退出” 功能。

GestureDetector用来监听和相应对应的手势事件,比如点击,长按,慢滑动,快滑动,用起来很简单,比你自己实现要方便许多。

DrawFilter可以让你在不调用onDrew方法的情况下,操作canvas,比了个如,你可以在创建自定义 View 的时候设置一个 DrawFilter,给父 View 里面的所有 View 设置反别名。

ActivityManager.getMemoryClass()告诉你你的机器还有多少内存,在计算缓存大小的时候会比较有用。

ViewStub它是一个初始化不做任何事情的 View,但是之后可以载入一个布局文件。在慢加载 View 中很适合做占位符。唯一的缺点就是不支持标签,所以如果你不太小心的话,可能会在视图结构中加入不需要的嵌套。

SystemClock.sleep()这个方法在保证一定时间的 sleep 时很方便,通常我用来进行 debug 和模拟网络延时。

DisplayMetrics.density这个方法你可以获取设备像素密度,大部分时候最好让系统来自动进行缩放资源之类的操作,但是有时候控制的效果会更好一些.(尤其是在自定义View的时候)。

Pair.create()方便构建类和构造器的方法。


Part 3:

UrlQuerySanitizer——使用这个工具可以方便对 URL 进行检查。

Fragment.setArguments——因为在构建 Fragment 的时候不能加参数,所以这是个很好的东西,可以在创建 Fragment 之前设置参数(即使在 configuration 改变的时候仍然会导致销毁/重建)。

DialogFragment.setShowsDialog ()—— 这是一个很巧妙的方式,DialogFragment 可以作为正常的 Fragment 显示!这里可以让 Fragment 承担双重任务。我通常在创建 Fragment 的时候把 onCreateView ()和 onCreateDialog ()都加上,就可以创建一个具有双重目的的 Fragment。

FragmentManager.enableDebugLogging ()——在需要观察 Fragment 状态的时候会有帮助。

LocalBroadcastManager——这个会比全局的 broadcast 更加安全,简单,快速。像otto这样的 Event buses 机制对你的应用场景更加有用。

PhoneNumberUtils.formatNumber ()——顾名思义,这是对数字进行格式化操作的时候用的。

Region.op()——我发现在对比两个渲染之前的区域的时候很实用,如果你有两条路径,那么怎么知道它们是不是会重叠呢?使用这个方法就可以做到。

Application.registerActivityLifecycleCallbacks——虽然缺少官方文档解释,不过我想它就是注册 Activity 的生命周期的一些回调方法(顾名思义),就是一个方便的工具。

versionNameSuffix——这个 gradle 设置可以让你在基于不同构建类型的 manifest 中修改版本名这个属性,例如,如果需要在在 debug 版本中以”-SNAPSHOT”结尾,那么就可以轻松的看出当前是 debug 版还是 release 版。

CursorJoiner——如果你是只使用一个数据库的话,使用 SQL 中的 join 就可以了,但是如果收到的数据是来自两个独立的 ContentProvider,那么 CursorJoiner 就很实用了。

Genymotion——一个非常快的 Android 模拟器,本人一直在用。

-nodpi——在没有特别定义的情况下,很多修饰符(-mdpi,-hdpi,-xdpi等等)都会默认自动缩放 assets/dimensions,有时候我们需要保持显示一致,这种情况下就可以使用 -nodpi。

BroadcastRecevier.setDebugUnregister ()——又一个方便的调试工具。

Activity.recreate ()——强制让 Activity 重建。

PackageManager.checkSignatures ()——如果同时安装了两个 app 的话,可以用这个方法检查。如果不进行签名检查的话,其他人可以轻易通过使用一样的包名来模仿你的 app。


Part 4:

Activity.isChangingConfigurations ()——如果在 Activity 中 configuration 会经常改变的话,使用这个方法就可以不用手动做保存状态的工作了。

SearchRecentSuggestionsProvider——可以创建最近提示效果的 provider,是一个简单快速的方法。

ViewTreeObserver——这是一个很棒的工具。可以进入到 VIew 里面,并监控 View 结构的各种状态,通常我都用来做 View 的测量操作(自定义视图中经常用到)。

org.gradle.daemon=true——这句话可以帮助减少 Gradle 构建的时间,仅在命令行编译的时候用到,因为 Android Studio 已经这样使用了。

DatabaseUtils——一个包含各种数据库操作的使用工具。

android:weightSum (LinearLayout)——如果想使用 layout weights,但是却不想填充整个 LinearLayout 的话,就可以用 weightSum 来定义总的 weight 大小。

android:duplicateParentState (View)——此方法可以使得子 View 可以复制父 View 的状态。比如如果一个 ViewGroup 是可点击的,那么可以用这个方法在它被点击的时候让它的子 View 都改变状态。

android:clipChildren (ViewGroup)——如果此属性设置为不可用,那么 ViewGroup 的子 View 在绘制的时候会超出它的范围,在做动画的时候需要用到。

android:fillViewport (ScrollView)——在这片文章中有详细介绍文章链接,可以解决在 ScrollView 中当内容不足的时候填不满屏幕的问题。

android:tileMode (BitmapDrawable)——可以指定图片使用重复填充的模式。

android:enterFadeDuration/android:exitFadeDuration (Drawables)——此属性在 Drawable 具有多种状态的时候,可以定义它展示前的淡入淡出效果。

android:scaleType (ImageView)——定义在 ImageView 中怎么缩放/剪裁图片,一般用的比较多的是“centerCrop”和“centerInside”。

Merge——此标签可以在另一个布局文件中包含别的布局文件,而不用再新建一个 ViewGroup,对于自定义 ViewGroup 的时候也需要用到;可以通过载入一个带有标签的布局文件来自动定义它的子部件。

AtomicFile——通过使用备份文件进行文件的原子化操作。这个知识点之前我也写过,不过最好还是有出一个官方的版本比较好。


Part 5:

ViewDragHelper——视图拖动是一个比较复杂的问题。这个类可以帮助解决不少问题。如果你需要一个例子,DrawerLayout就是利用它实现扫滑。Flavient Laurent 还写了一些关于这方面的优秀文章

PopupWindow——Android到处都在使用PopupWindow ,甚至你都没有意识到(标题导航条ActionBar,自动补全AutoComplete,编辑框错误提醒Edittext Errors)。这个类是创建浮层内容的主要方法。

Actionbar.getThemrContext()——导航栏的主题化是很复杂的(不同于Activity其他部分的主题化)。你可以得到一个上下文(Context),用这个上下文创建的自定义组件可以得到正确的主题。

ThumbnailUtils——帮助创建缩略图。通常我都是用现有的图片加载库(比如,Picasso 或者 Volley),不过这个ThumbnaiUtils可以创建视频缩略图。译者注:该API从V8才开始支持。

Context.getExternalFilesDir()———— 申请了SD卡写权限后,你可以在SD的任何地方写数据,把你的数据写在设计好的合适位置会更加有礼貌。这样数据可以及时被清理,也会有更好的用户体验。此外,Android 4.0 Kitkat中在这个文件夹下写数据是不需要权限的,每个用户有自己的独立的数据存储路径。译者注:该API从V8才开始支持。

SparseArray——Map的高效优化版本。推荐了解姐妹类SparseBooleanArray、SparseIntArray和SparseLongArray。

PackageManager.setComponentEnabledSetting()——可以用来启动或者禁用程序清单中的组件。对于关闭不需要的功能组件是非常赞的,比如关掉一个当前不用的广播接收器。

SQLiteDatabase.yieldIfContendedSafely()——让你暂时停止一个数据库事务, 这样你可以就不会占用太多的系统资源。

Environment.getExternalStoragePublicDirectory()——还是那句话,用户期望在SD卡上得到统一的用户体验。用这个方法可以获得在用户设备上放置指定类型文件(音乐、图片等)的正确目录。

View.generateViewId()——每次我都想要推荐动态生成控件的ID。需要注意的是,不要和已经存在的控件ID或者其他已经生成的控件ID重复。

ActivityManager.clearApplicationUserData()—— 一键清理你的app产生的用户数据,可能是做用户退出登录功能,有史以来最简单的方式了。

Context.createConfigurationContext()——自定义你的配置环境信息。我通常会遇到这样的问题:强制让一部分显示在某个特定的环境下(倒不是我一直这样瞎整,说来话长,你很难理解)。用这个实现起来可以稍微简单一点。

ActivityOptions——方便的定义两个Activity切换的动画。 使用ActivityOptionsCompat可以很好解决旧版本的兼容问题。

AdapterViewFlipper.fyiWillBeAdvancedByHostKThx()——仅仅因为很好玩,没有其他原因。在整个安卓开源项目中(AOSP the Android ——pen Source Project Android开放源代码项目)中还有其他很有意思的东西(比如

GRAVITY_DEATH_STAR_I)。不过,都不像这个这样,这个确实有用

ViewParent.requestDisallowInterceptTouchEvent()——Android系统触摸事件机制大多时候能够默认处理,不过有时候你需要使用这个方法来剥夺父级控件的控制权。


1、android:clipChildren 和 android:clipToPadding:clipToPadding就是说控件的绘制区域是否在padding里面的,true的情况下如果你设置了padding那么绘制的区域就往里 缩,clipChildren是指子控件是否超过padding区域,这两个属性默认是true的,所以在设置了padding情况下,默认滚动是在 padding内部的,要达到上面的效果主要把这两个属性设置了false那么这样子控件就能画到padding的区域了。使用场景如:ActionBar(透明)下显示Listview而第一项要在actionbar下。参见android:clipToPadding和android:clipChildren

2、Fragment 的 setUserVisibleHint 方法,可实现 fragment 对用户可见时才加载资源(延迟加载)。

3、自定义 View 时重写 hasOverlappingRendering 方法指定 View 是否有 Overlapping 的情况,提高渲染性能。

4、AutoScrollHelper,在可滚动视图中长按边缘实现滚动,Android View.OnTouchListener 的子类

5、TouchSlop,系统所能识别出的被认为是最小的滑动距。离,ViewConfiguration.get(context).getScaledTouchSlop()。

6、VelocityTracker,可用于 View 滑动事件速度跟踪。

7、AlphabetIndexer,字母索引辅助类。

8、Messenger,AIDL 实现的封装,比手写 AIDL 更方便。

9、ArrayMap,比 HashMap 更高的内存效率,但比 HashMap 慢,不适合有大量数据的场景。

10、Property,抽象类,封装出对象中的一个易变的属性值,使用场景如在使用属性动画时对动画属性的操作。

11、SortedList,v7 包中,见名知意。


HandlerThread 单一线程 + 任务队列 处理轻量的异步任务  详见详解 Android 中的 HandlerThread

Proguard assumenosideeffects 编译器屏蔽日志  详见关于Android Log的一些思考

Android性能调优利器StrictMode

Android中线程优先级控制   android.os.Process.setThreadPriority  详见剖析Android中进程与线程调度之nice

Android Lint 一个静态分析工具  详见使用Android lint发现并解决高版本API问题

(更新) 使用UncaughtExceptionHandler 处理应用崩溃,收集信息甚至可以不显示崩溃对话框  详细:Android处理崩溃的一些实践


1、getParent().requestDisallowInterceptTouchEvent(true);剥夺父view对touch事件的处理权,谁用谁知道。

2、ArgbEvaluator.evaluate(float fraction,ObjectstartValue,ObjectendValue);用于根据一个起始颜色值和一个结束颜色值以及一个偏移量生成一个新的颜色,分分钟实现类似于微信底部栏滑动颜色渐变。

3、Canvas中clipRect、clipPath和clipRegion剪切区域的API。

4、Bitmap.extractAlpha ();返回一个新的Bitmap,capture原始图片的alpha值。有的时候我们需要动态的修改一个元素的背景图片又不希望使用多张图片的时候,通过这个方法,结合Canvas和Paint可以动态的修改一个纯色Bitmap的颜色。

5、HandlerThread,代替不停new Thread开子线程的重复体力写法。

6、IntentService,一个可以干完活后自己去死且不需要我们去管理子线程的Service。

7、Palette,5.0加入的可以提取一个Bitmap中突出颜色的类,结合上面的Bitmap.extractAlpha,你懂的。

8、Executors.newSingleThreadExecutor();这个是java的,之前不知道它,自己花很大功夫去研究了单线程顺序执行的任务队列。。

9、android:animateLayoutChanges="true",LinearLayout中添加View的动画的办法,支持通过setLayoutTransition()自定义动画。

10、ViewDragHelper,自定义ViewGroup处理各种事件很累吧,嗯? what the fuck!!

11、GradientDrawable,之前接手公司的项目,发现有个阴影效果还不错,以为是切的图片,一看代码,什么鬼= =!

12、AsyncQueryHandler,如果做系统工具类的开发,比如联系人短信辅助工具等,肯定免不了和ContentProvider打交道,如果数据量不是很大的情况下,随便搞,如果数据量大的情况下,了解下这个类是很有必要的,需要注意的是,这玩意儿吃异常..

13、ViewFlipper,实现多个view的切换(循环),可自定义动画效果,且可针对单个切换指定动画。

14、有朋友提到了在自定义View时有些方法在开启硬件加速的时候没有效果的问题,在API16之后确实有很多方法不支持硬件加速,通常我们关闭硬件加速都是在清单文件中通过,其实android也提供了针对特定View关闭硬件加速的方法,调用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可。

15、android util包中的Pair类,可以方便的用来存储一"组"数据。注意不是key value。

16、PointF,graphics包中的一个类,我们经常见到在处理Touch事件的时候分别定义一个downX,一个downY用来存储一个坐标,如果坐标少还好,如果要记录的坐标过多那代码就不好看了。用PointF(float x, float y);来描述一个坐标点会清楚很多。

17、StateListDrawable,定义Selector通常的办法都是xml文件,但是有的时候我们的图片资源可能是从服务器动态获取的,比如很多app所谓的皮肤,这种时候就只能通StateListDrawable

来完成了,各种addState即可。

18、android:descendantFocusability,ListView的item中CheckBox等元素抢焦点导致item点击事件无法响应时,除了给对应的元素设置 focusable,更简单的是在item根布局加上android:descendantFocusability=”blocksDescendants”

19android:duplicateParentState="true",让子View跟随其Parent的状态,如pressed等。常见的使用场景是某些时候一个按钮很小,我们想要扩大其点击区域的时候通常会再给其包裹一层布局,将点击事件写到Parent上,这时候如果希望被包裹按钮的点击效果对应的Selector继续生效的话,这时候duplicateParentState就派上用场了。

20、includeFontPadding="false",TextView默认上下是有一定的padding的,有时候我们可能不需要上下这部分留白,加上它即可。

21、Messenger,面试的时候通常都会被问到进程间通信,一般情况下大家都是开始背书,AIDL巴拉巴拉。。有一天在鸿神的博客看到这个,嗯,如他所说,又可以装一下了。

22、TextView.setError();用于验证用户输入。

23、ViewConfiguration.getScaledTouchSlop();触发移动事件的最小距离,自定义View处理touch事件的时候,有的时候需要判断用户是否真的存在movie,系统提供了这样的方法。

24、ValueAnimator.reverse(); 顺畅的取消动画效果。

25、ViewStub,有的时候一块区域需要根据情况显示不同的布局,通常我们都会通过setVisibility的方法来显示和隐藏不同的布局,但是这样默认是全部加载的,用ViewStub可以更好的提升性能。

26、onTrimMemory,在Activity中重写此方法,会在内存紧张的时候回调(支持多个级别),便于我们主动的进行资源释放,避免OOM。

27、EditTxt.setImeOptions, 使用EditText弹出软键盘时,修改回车键的显示内容(一直很讨厌用回车键来交互,所以之前一直不知道这玩意儿)

28、TextView.setCompoundDrawablePadding,代码设置TextView的drawable padding。

29、ImageSwitcher,可以用来做图片切换的一个类,类似于幻灯片。

30、java8中新增的LocalDate和LocalTime接口,Date虽然是个万能接口,但是它真的不好用,有了这俩,终于可以愉快的处理日期时间了。

31、WeakHashMap,直接使用HashMap有时候会带来内存溢出的风险,使用WaekHashMap实例化Map。当使用者不再有对象引用的时候,WeakHashMap将自动被移除对应Key值的对象。


清除画布上的内容:canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

在自定义View的onDetachedFromWindow方法中清理与View相关的资源;

Fragment在onAttach方法中接收回调:

@Override

public void onAttach(Activityactivity) {

super.onAttach(activity);

try{

mPageSelectedListener = (PageSelectedListener) activity;

mMenuBtnOnclickListener = (MenuBtnOnClickListener) activity;

mCommitBtnOnClickListener = (CommitBtnOnClickListener) activity;

}catch(ClassCastExceptione) {

thrownewClassCastException(activity.toString() +"must implements listener");

}

}

使用ClipDrawable实现进度条功能;

自定义view中的getContext(),再也不需要专门创建一个mContext全局对象了;

自定义手写view的时候,在手指移动的过程中通过MotionEvent | Android Developers对象的getHistorySize()获得缓存的历史点,绘制出来的曲线要平滑很多。

复写Activity的onUserLeaveHint方法,确保用户离开界面时能够立即暂停界面中的一些任务,关于onUserLeaveHint的更多作用可以谷歌:android - Google 搜索

值得借鉴的点击两次退出应用的实现:Android关于双击退出应用的问题

Lollipop Dialer 接通画面里面那些酷炫的动画其实只有一行:android:animateLayoutChanges="true" 然后 setVisibility 就可以了

LocalBroadcastManager 可以在App的范围内发广播和收广播,不会被global的receiver收到,对数据比较敏感且不用共享的可以用这个。


1. 通过 WindowManager.addView 在其他app界面添加一个view时,经常会无法显示,特别在miui,emui固件上,需要指定type为LayoutParams.TYPE_TOAST。

2. View.getLocationOnScreen(new int[]),获取view在屏幕上的位置

3. Paint.setXfermode(porterDuffXfermode),在ApiDemo里面有专门的介绍,实现了穿透,叠加,覆盖等多种绘制效果,非常实用

4. IBinder binder = ServiceManager.getService("wallpaper");

IWallpaperManager wm = IWallpaperManager.Stub.asInterface(binder);

Bundle params = new Bundle();

ParcelFileDescriptor fd = wm.getWallpaper(stub, params);

直接获取当前系统壁纸的fd,避免壁纸过大造成oom问题。这种方式有适配问题,需注意。

5. 通过View.getDrawingCache()可以获取截图,但是需要setDrawingCacheEnabled(true)频繁使用可能会oom,还有一种方法直接用canvas

Bitmap bm = Bitmap.createBitmap((int) (w * scale), (int) (h*scale), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas();

canvas.setBitmap(bm);

View.draw(canvas);

return bm;

北京卓为科技有限公司(www.draway.com)是一家专业的信息技术服务提供商。我们始终秉承“追求卓越,大有作为”的理念,专注于为客户提供专业的信息技术服务,为职员提供优越的工作条件,为社会提供力所能及的贡献!

公司创始人拥有清华大学工商管理硕士学位,曾经留学美国,后回国创业。公司核心团队拥有丰富的互联网、移动互联网及智能设备研发经验,技术能力涵盖手机端、服务端、大数据、云计算、物联网、车联网、虚拟现实VR/AR等。

公司成立于2012年,目前技术团队拥有软硬件开发、测试工程师50余人,核心管理团队拥有近10年的软件技术服务经验。公司是阿里巴巴、小米科技、阳光保险、天宇手机、CNTV等多家知名客户的签约技术服务供应商,并获得高新企业和“双软”资格认证。

梦想是要有的,万一实现了呢?可是,光有梦想是不行的,更要有行动!如果你对人生充满梦想,对自己的能力充满信心,而且愿意脚踏实地、不辞辛劳地为自己的梦想付出努力!那么欢迎你来卓为试试!

简历请发送:hr@draway.com

电话:010-62974030

邮箱:contact@draway.com

地址:北京市海淀区上地科实大厦D座8层

免费获取报价

姓名

联系方式

产品介绍

注:提交后,我方客户经理会与您电话联系,并提供初步报价
提交成功

提交成功,我们将尽快与您联系!