Android 开发时你遇到过什么相见恨晚的工具或网站?
119 个回答
我来好好谈谈我的看法和感悟。仔细看了楼主的问题(特别是详细描述),感觉题主的关心点是想知道什么现成的工具和平台可以简化Android App的开发,让其更轻更有效率迭代更快。我就从这个出发点上来回答:
首先是在后端上,推荐用企业服务,而不是自己搭后端。比如,使用
Parse,或者是国内的
LeanCloud。LeanCloud我好像听人吐槽bug多,但是如果自己团队来开发后台的话,照样bug也会一堆,而且还把别人踩过的坑又重新来踩一遍。我自己做过demo,发现使用Parse(Facebook自己也在用)或者LeanCloud,的确让 Android App 开发一下子快了一个级别。整个创业团队只需要把精力让在 App的交互和体验上即可,而且项目转型也可以很轻很快。如果实在LeanCloud无法满足,那么在创业初期,最好也租用云服务,比如阿里云,青云之类的,而不是买服务器自己从头开始搭起。
其次在App端的话,则大规模使用开源库(请站在巨人的肩膀上)。首先技术负责人把所有常用的Android开源库都理清一遍,然后选项目需要的库。另外在文档方面,推荐两个我自己筛选过的很好的文档给创业团队。(只推荐2个,因为Android文档现在是太多而不是太少。在这个信息爆炸的时代,我们需要的是优质的技术文档,同理还有能够专注的技术人员):
1. Android best practice:
futurice/android-best-practices · GitHub中文版:
android-best-practices/README.cn.md at master · futurice/android-best-practices · GitHub2. 对GitHub上的各大开源库的收录和分析:
Trinea/android-open-project · GitHub另外再推荐一个人:
JakeWharton (Jake Wharton) · GitHub(Jake Wharton:此人在Square,而Square也位列我之前所说的湾区四小龙之中)
最后一点,也是最重要的一点:能不做App就不做App。
我这一年来看了大量早期的创业项目,特别是技术不是很强的团队。他们普遍都急着想做一个app出来,感觉好像没有app就不能叫做创业公司,就没法出去和人打招呼一样。其实很多创业项目,微信公众号的功能就能满足。除非公众号提供不了你的主打功能,不一定非要急着上app。开发app一来成本很大,二来容易把整个团队精力消耗殆尽。所以还不如先用微信公众号试试水,吸引一批种子用户,看看用户反馈,然后快速改进;这样的模式更轻更快。
---- 题外话 ----
有时遥想当年,在Facebook做Android和iOS开发,由于毕竟是大公司,里面的自有工具,内部库还有技术大牛都很丰富,所以基本上除了使用少数几个经典开源库之外,其他大部分都是自己写,比如 Buck,FBNetworking,FBCache,FBImageLoader等等。这对于创业公司来说是完全不试用。一来没人手,二来很容易碰到一个技术难点就把整个公司给陷进去了。现在想想,当年在大公司真是身在福中不知福啊。。。
--- END ---
- Do have the faith in what you love
在接手一个项目的时候每次都会看到一大堆工具类,其实在字符串处理方面,android.text.TextUtils这个类就能胜任绝任多数的工作,比如:
- public static boolean isEmpty(@Nullable CharSequence str) 这个方法判断字符串非null且非空,在对字符串进行判断时可以不必if(str !=null && str.length() > 0)这样判断。
- public static CharSequence concat(CharSequence... text) 字符串连接。有很多字符串,你还在用+拼接或自己new 一个StringBuffer\StringBuilder么?其实这个方法已经帮我们做好了,用StringBuilder实现,进行字符串拼接时可以考虑使用这个方法。而且支持SpannableString。
- public static boolean isDigitsOnly(CharSequence str)
- public static boolean equals(CharSequence a, CharSequence b) 判断两个字符串对象的内容是否相等,内部进行了非null判断
- public static String htmlEncode(String s) 将html代码中的特殊字符进行转码处理
当判断一些常用的URI的时候,可以用android.webkit.URLUtil这个工具类
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 里面非常多,看了才知道相见恨晚~