Chapter1 准备工作
一、优化你的工作区间(磨刀不误砍柴功)
题外话:可能有很多人会认为,现在Google官方已经放弃了eclipse的支持了而改用Android Studio了,那么本节好像就没有意义了。其实不然,从哲学的角度来说:凡事都是有普遍规律性的!可能在AS上操作是不同的,但是我们要有这样的一个大体思路,那么通过Google我们照样可以找到对应的操作并且完成自己工作空间的定制,更何况我们是有着两年工作经验的Android开发人员呢!!!所以掌握ecipse刻不容缓啊!
1.定制自己的开发窗口
相信同学们对于这样一个开发窗口再熟悉不过了,具体每个窗口的功能我就不一一介绍了,我个人推荐把自己的开发窗口定制成这样,因为真的可以省下自己很多时间。完成了窗口定制的同志们肯定是不希望自己的工作空间会因为凌乱的操作变得乱七八糟。那么我们就要讲这种状态保存下来,方便以后复原了。看一看下面的操作,就可以轻松解决这个问题了。
1.1保存自己的开发窗口视图
我们可以保存窗口为Android,这样我们就可以在界面上看到自己保存的视图了。
1.2恢复自己的开发窗口
经过了上面的操作后,我们就再也不用担心自己的视图会被搞乱了。一旦窗口丢失,我们直接进行window->reset perspective操作就可以恢复到我们之前的开发界面了。当然,类似的方法咋们也可以用到Debug视图等。。。
二、定制自己的模板和工具类
怎么样还是挺简单的吧。有了这样的一个开发窗口,我们就可以在上面实现高效的开发了。如何做到高效开发咋们的应用呢?
定制开发模板《Code Templates》
打开 Windows->Preferences->Java->Editor->Templates
`
psfi:
public static final int i${cursor} = 0;
psfs:
public static final String s${cursor} = "s";
toastT:
Toast.makeText(this, "${cursor}", Toast.LENGTH_SHORT).show();
findT:
View view = findViewById(R.id.${cursor});
intentT:
Intent intent = new Intent(${cursor});
startT:
Intent intent = new Intent(this, ${cursor}.class);
startActivity(intent);
oncreateT:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.${cursor});
}
ViewHolderT:
static class ViewHolder {
ImageView icon;
TextView name;
}
convertViewT:
ViewHolder holder = null;
if (convertView == null) {
//初始化view
convertView = View.inflate(mContext, R.layout.item_${cursor},
null);
//初始化控件
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.item_icon);
holder.name = (TextView) convertView.findViewById(R.id.item_name);
//保存ViewHolder
convertView.setTag(holder);
} else {
//从复用View里获取ViewHolder
holder = (ViewHolder) convertView.getTag();
}
//绑定数据
Data data = mData.get(position);
holder.icon.setImageDrawable(data.getIcon());
holder.name.setText(data.getName());
return convertView;
`
有了这些模板,我们在输入这些常用代码的时候,可以直接按下Alt+/来完成自己的快速开发了。
定制备注模板
通过菜单 Window->Preference 打开参数设置面板,然后选择:Java -> Code Style -> Code Templates
`
Files:
/**
* 黑马程序员
* http://www.itheima.com/
*
* @date ${date}${time}
* @version V1.0
*/
Types:
/**
* @Description: ${todo}(这里用一句话描述这个类的作用)
* @author ${user}
* @date ${date} ${time}
*/`
这样我们无论在类中就可以方便的通过Alt+shift+J来添加自己的注释了,当然,更多的个性化注释可以参考:
http://chenzhou123520.iteye.com/blog/1625629
这样我们在团队开发的时候,大家就可以用同样的注释,也避免了很多个性化注释看不懂的问题了。
定制工具类
开发中我们避免不了会打印一些自己的日志,或者保存自己的内容到shared_pref中。那么我们很需要两个简便点的工具类来避免自己重复造轮子的工作
1.日志工具类
`package com.tzl.demo.utils;
import android.util.Log;
/**
*@Description 日志工具类,控制日志的打印
*@author JOHN
*@date 2016-4-12
*/
public class L {
/**
* 日志打印开关,可以在application的onCreate函数里面初始化 。
*/
public static boolean DEBUG = true;
//通用的标签名
public static final String TAG = "tag";
/**
* 避免外界及类中实例化
*/
private L(){
throw new UnsupportedOperationException("L can not be instantiated!");
}
public static void v(String tag,String msg){
if(DEBUG){
Log.v(tag, msg);
}
}
public static void v(String msg){
if(DEBUG){
Log.v(TAG, msg);
}
}
public static void d(String tag,String msg){
if(DEBUG){
Log.d(tag, msg);
}
}
public static void d(String msg){
if(DEBUG){
Log.d(TAG, msg);
}
}
public static void i(String tag,String msg){
if(DEBUG){
Log.i(tag, msg);
}
}
public static void i(String msg){
if(DEBUG){
Log.i(TAG, msg);
}
}
public static void w(String tag,String msg){
if(DEBUG){
Log.w(tag, msg);
}
}
public static void w(String msg){
if(DEBUG){
Log.w(TAG, msg);
}
}
public static void e(String tag,String msg){
if(DEBUG){
Log.e(tag, msg);
}
}
public static void e(String msg){
if(DEBUG){
Log.e(TAG, msg);
}
}
}
`
2.首选项工具类
`package com.tzl.demo.utils;
import android.content.Context;
import android.content.SharedPreferences;
/**
*@Description 首选项操作工具类
*@author JOHN
*@date 2016-5-5
*/
public class S {
private static final String FILE_NAME = "sp_config";
/**
* 避免外界及类中实例化
*/
private S(){
throw new UnsupportedOperationException("S can not be instantiated!");
}
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
* @param context
* @param key
* @param object
*/
public static void putParam(Context context , String key, Object object){
String type = object.getClass().getSimpleName();
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if(String.class.getSimpleName().equals(type)){
editor.putString(key, (String)object);
}
else if(Integer.class.getSimpleName().equals(type)){
editor.putInt(key, (Integer)object);
}
else if(Boolean.class.getSimpleName().equals(type)){
editor.putBoolean(key, (Boolean)object);
} else if(Float.class.getSimpleName().equals(type)){
editor.putFloat(key, (Float)object);
}
else if(Long.class.getSimpleName().equals(type)){
editor.putLong(key, (Long)object);
}
editor.commit();
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
* @param context
* @param key 关键字
* @param defaultObject 默认值
* @return
*/
public static Object getParam(Context context , String key, Object defaultObject){
String type = defaultObject.getClass().getSimpleName();
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
if(String.class.getSimpleName().equals(type)){
return sp.getString(key, (String)defaultObject);
}
else if(Integer.class.getSimpleName().equals(type)){
return sp.getInt(key, (Integer)defaultObject);
}
else if(Boolean.class.getSimpleName().equals(type)){
return sp.getBoolean(key, (Boolean)defaultObject);
}
else if(Float.class.getSimpleName().equals(type)){
return sp.getFloat(key, (Float)defaultObject);
}
else if(Long.class.getSimpleName().equals(type)){
return sp.getLong(key, (Long)defaultObject);
}
return null;
}
}
`
这两个工具类也是通过楠哥的指导写出来的。当然大家也可以多参考一些网上的写法,咋们可以一起把工具类改善下。
这里需要另外提一下:
1.对于上面的设置由于篇幅的原因,咋们暂且不能介绍的很全面,但是每个知识点我相信都是工作中非常实用的技巧。如果需要用到的时候咋们可以借助Google设置下就可以了。
2.也有一些同学可能会想,咋们辛辛苦苦设置了半天的工作空间,等咋们一切换工作区间就没了!当然啦,人家eclipse开发人员早就考虑到这个问题了,咋们只需要讲咋们的当前工作空间中的.metadata文件夹拷贝到新的工作空间然后重新启动你的eclipse就可以获得自己之前设置的内容了。
3.当然对于一些工具类的收集和机制的研究我会把它写在一个类似于apidemos的项目里面。这样以后在开发中需要使用的时候,咋们可以直接使用CV大法就搞定了。毕竟效率还是很重要的嘛~~~,这里希望有兴趣的同学可以通过QQ联系我,有句话说得好:众人拾柴火焰高!只有这样咋们的demo才能搜集的越快越好越全面嘛
4.对应自己没有完成的任务咋们一定要加上TODO..来加上标注,这样对咋们项目的开发也是很有好处的
5.*记住一些常用的快捷键,这个就不总结了,常用的记下就好了
6.上面的操作我相信在AS2.1中都会有的,大家没事可以按照类似规律寻找下,这里由于时间原因,我就不一一叙述啦,希望可以在以后的文章中我们共同学习下。
Chapter2 开启开发之路(王者之路)
在开发之前我们需要养成一个正确的意识:
1.api没你想象的那么重要(记住业务使用的核心类就好),重点把握业务逻辑和代码架构搞好,如果可能的话最好搞清楚内部的机制原理,撸一把源码,写一个自己的框架。
2.发生错误要学会自己解决(Debug+LogCat+文档),自己解决不了Google,Google不了整理下思路问身边比你牛B的人(最好给自己解决问题设置个时限,如果一个比较棘手的问题解决超过半个小时搞不定,那么暂且搁置下)。
3.***第三方框架不要慌,docs打开帮你忙。如果你还是学不会,只能怪你非人类***哈哈,这里开了个玩笑,我们要正确地掌握第三方库的两种导入源码的方法,有了源码和文档,相信我们学起第三方框架来应该会得心应手。
导入第三方框架观察源码
1.在lib同级目录下面添加properties文件,文件的名字就是需要导入的第三方库.jar.properties,记得重启自己的工程偶
2.直接讲第三方库的library文件作为工程导入自己的工作空间。
4.工欲善其事,必先利其器。积累一些常用的非常好的网站和工具(反编译工具等等),可以解决你的很多难题!
好站集锦:
1.在线json转化网站:http://www.bejson.com/,离线json转化工具:HiJson
2.源码查看网站:http://www.grepcode.com/ http://androidxref.com/(更吊)
3.github
4.友盟统计
5.有米广告
构建自己的项目
1.代码组织架构
按照功能和业务划分,这里个人认为可能混合使用对于一些比较大型的项目还是挺有好处的。
2.事先约定好项目中的命名法则
一般规则:功能模块_业务模块_类型_具体描述
例如:`selector_common_btn_ok`,个人认为我们应该在项目开始前定义好这些命名规范,这样开发起来可以有条不紊。
3.写一个JAVA工程,方便测试关于JAVA的一些工具
这个的好处当然是为了去测试一些jdk相关的API,比如我们做过的压缩工具类
4.版本控制工具的使用(Svn和Git)(TODO..)
Git的使用还是比较重要的,目前自己还不太熟悉,正在学习掌握中。而对于svn在javaee中比较常用,当然了作为昔日版本控制的王者,很多公司都是有使用的,所以为了融入一些比较传统的开发团队,我们还是有必要去掌握下的!
注:改变工作空间的编码集
调试项目:(TODO..)
1.测试类
2.debug
上线操作:
1.**异常捕获机制**
2.混淆代码(TODO..)
3.镶嵌广告
4.签名文件
5.打包上线
注意:签名文件(.keystore)和密码一定要妥善保存啦!!!
由于时间关系,暂且写到这里啦!回头有时间再来更新吧,欢迎大家提出改正建议偶~~