Android开发时你遇到过什么相见恨晚的工具或网站?
问题描述如下:
对于很多Android/ios/wp个人移动开发者来说,开发一个具有网络功能的应用不是一件容易的事,不仅需要购买/租赁服务器,还必须掌握一门诸如Java/.net/php这类的服务器开发语言,每开发一款移动应用程序,就必须开发维护对应的服务器程序。这一切对于移动开发者来说,都是一个冗长的噩梦。今天发现现在有这样的云平台可以让开发者只需注册一个帐号,成功后申请创建任意多个数据库,获得对应的Key,下载对应版本的SDK并将其嵌入到移动应用中,便可以调用存取API,进行数据的任意操作。这样就无需关注后台,专注于客户端开发就行了。不知道大家有没有遇到过类似的相见恨晚的网站或工具?
参考答案如下:
在接手一个项目的时候每次都会看到一大堆工具类,其实在字符串处理方面,android.text.TextUtils这个类就能胜任绝任多数的工作,比如:
- public static boolean isEmpty(@Nullable CharSequence str) 这个方法判断字符串非null且非空,在对字符串进行判断时可以不必if(str !=null && str.length() > 0)这样判断。
- public static CharSequence concat(CharSequence... text) 字符串连接。有很多字符串,你还在用+拼接或自己new 一个StringBufferStringBuilder么?其实这个方法已经帮我们做好了,用StringBuilder实现,进行字符串拼接时可以考虑使用这个方法。而且支持SpannableString。
- public static boolean isDigitsOnly(CharSequence str)
- public static boolean equals(CharSequence a, CharSequence b) 判断两个字符串对象的内容是否相等,内部进行了非null判断
- public static String htmlEncode(String s) 将html代码中的特殊字符进行转码处理

android.text.format.DateUtils 这个类是Android提供的格式化日期的工具类。相对于我们经常使用的SimpleDateFormat类来说,DateUtils已经处理好国际化相关的问题,而且还封装了一些很简便的方法。
public static String formatDateTime(Context context, long millis, int flags); 这个方法可以格式化日期和时间,接收三个参数,其中第三个参数flags决定输出后的格式,如果只输出日期的话:
DateUtils.formatDateTime(context,millis,DateUtils.FORMAT_SHOW_DATE)
如果想输出年或月等等格式的话,就在DateUtils找对应的flags就可以。但是如果想输出年、月、日、星期、日期等多重的结果的组合,可以通过|操作符来运算。
DateUtils.formatDateTime(context, millis, DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_TIME);
输出的结果:2016年1月16日星期五 12:40
public static boolean isToday(long when) 判断日期是否是今天
public static CharSequence getRelativeTimeSpanString(long startTime) 返回与当前的相对时间的字符串。这样说有些抽象,比如微信的聊天列表上显示的上一条信息的时间,如果是今天就显示今天的时间,是昨天的就显示昨天,再久远一点的就显示日期(但是这个方法的最大只能精确到天,不能像微信那样显示到几秒前,几分钟前)。
- 还有tools schemas在新建Activity时IDE都会在xml的根节点默认加上tools的命名空间。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="net.gzw1993.androidtips.DateUtilsActivity" tools:showIn="@layout/activity_date_utils"> <Button android:id="@+id/btn_select_date" android:layout_width="match_parent" android:layout_height="wrap_content" tools:text="点击选择日期" /></LinearLayout>
这里介绍一种tools的简单用法。在写布局的时候经常会写一些无用的字符串用来预览布局,但是这些数据一般会在完成后删除,有时候在维护时为了方便预览再写上。这时可以使用tools的命名空间,比如tools:text="点击选择日期"tools仅仅可以预览,在运行的状态下解析布局文件时就会忽略过这条属性。这非常适合用于预览布局。
- 不会偷懒的程序员不是好程序员~,Studio1.5以上的版本鼠标放在http://R.layout.xxx右键-Generator可以看到View Variables和View Fields,可以帮你初始化资源文件中有id的view,可以再也不用findViewById了(没有的话请安装JetBrains Plugin Repository :: Android Studio Prettify,2.0以上默认没有,谢Alex Wang提醒)。

- 在处理异常方面,UncaughtExceptionHandler可以对全局的异常进行捕获。测试崩溃可以使用Testin apm或bugly一些平台。
- 在Android中引用四大组件和Fragment这些重量级对象的时候要用WeakReference,常用的场景是static Handler持有Activity。
- 能用简单的布局就用简单的,特别是FrameLayout,它的layout_gravity属性非常好用。
- BuildConfig.Debug可以判断是不是debug版本,可以通过它来控制一些调试代码,比如debug版本下打日志和测试服务器,release下不打日志,用正式服务器。
- View可以getContext(),所以在设计方法的时候,参数中如果有View了就别搞Context这个参数了。View还可以post(),有view的时候就别new Handler().post()了。
- 在给Handler发送消息的时候没必要每次都new Message(),而是使用handler.obtainMessage(),它会先看看消息队列里面有没有没用的消息,如果有可以复用消息对象。
- 如果是在应用范围内的广播可以使用LocalBroadcastManager这个API(低版本用v4下的),更加安全高效,不必担心别的app伪造广播或收听你的广播做一些不好的事情。
- 可以找一找你常用的app里面的开源许可,里面可以看到使用了哪些具体的开源项目。android开发一般都使用什么框架? - gzw1993 的回答
- 最后,善用Google和StackOverFlow,比百度和CSDN靠谱多了,比如想查下如何从代码中设置TextView的drawLeft属性,google搜索“android textview drawableLeft programmatically”即可,这是搜索到的第一条里面的内容:
还用很多,推荐这个GitHub - jiang111/awesome-android-tips: Android tips 里面非常多,看了才知道相见恨晚~
参考答案如下:
- google/material-design-icons ,material官方图标,不会做图标又想写APP练手的同学的福音;
- ImageView的滤镜效果,详解Paint的setColorFilter(ColorFilter filter),一张纯白纯白图标蜕变为彩色和渐变色图标都不是事;
- 事件流编程,https://github.com/greenrobot/EventBus,一方面解耦各大组件之间的数据交互,再也不需要用AsyncTask这种上古时期的繁琐怪物了。而且在一些类型的应用中,事件流编程有着独一无二的优势,比如,我在做一个IM应用时,需要先打开Socket->发送登陆信令->服务端返回应用层ACK后开始启动心跳线程->发起交换私钥命令->交换成功后打开IM通道,如果用传统的回调函数来实现,很容易陷入多层花括号嵌套的困境,但使用事件流编程的思维后,我们只需要emit一个个的事件,在on中执行具体的业务,一个业务的结尾处emit下一个事件,你甚至可以直接再包装一层,组成下面这样子:EventModle.getInstance()->flow("event1","event2","event3","event4");
- GitHub - wasabeef/awesome-android-ui: A curated list of awesome Android UI/UX libraries,再也不用担心自己写界面没灵感了~
- http://pan.baidu.com/s/1qXdYqDY,我在Android Studio出来了一年后才从Eclipse中跳出来,Android Studio真是大大提高效率,谁用谁知道,真恨自己没早点摆脱懒惰用~;
- SurfaceView,http://developer.android.com/reference/android/view/SurfaceView.html,Android的动画机制进行伪3D变换时,卡顿的不行,但是在需要动画的地方,简单的覆盖一个透明的SurfaceView来做,极大的提升流畅性;
- arraycopy(src, srcPos, dest, destPos, length)方法,瞬间摆脱Low到家的for循环来拷贝数组
- 在Binder间传送序列化对象时,Bundle中不要用Parceble,要用Json序列化后的String!不然会有莫名其妙的bug
- 进行类的单例化时,用这个就OK:不用再考虑其他什么线程安全是一次同步还是两次同步。
public class myclass{ //some property.. // some mothod public static class HOLDER {public myclass instance = myclass();} public static myclass getInstance(){return HOLDER.instance;}}
- 但凡和线程池/线程/同步/锁等有关的实践问题,尽量不要用Android的解决方案,如AsyncTask,而要用Java中已经历经考验的实践方案 如FutureTask+ThreadPoolExecuters。
- 数组复制,请使用System.arrayCopy或Arrays.copyOf 实现,且在JAVA中后者基于前者实现。
- Android DataBinding,现在还没有完全的双向绑定,而且很多我们常用的属性的getter和setter也没有,需要我们手动wrapper,但我相信这些在未来都会有更便捷的方案的。
查看评论 回复