大话Android项目中的常用技巧

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)和密码一定要妥善保存啦!!!

由于时间关系,暂且写到这里啦!回头有时间再来更新吧,欢迎大家提出改正建议偶~~

时间: 2024-10-10 13:41:44

大话Android项目中的常用技巧的相关文章

Linux以及Android开发中的小技巧和长繁命令记录收集

不断更新收集中.... 2014071743 ssh以nx_guest的身份登录到172.24.221.137,然后在172.24.221.137与172.24.61.252的8080端口建立网络连接,同时创建端口为5678的本地代理服务 ssh -C -f -N -o 'TCPKeepAlive=yes' -L 5678:172.24.61.252:8080 [email protected] 反编译android下的二进制程序 ./prebuilts/gcc/linux-x86/arm/ar

Android项目中JNI技术生成并调用.so动态库实现详解

生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配置SWIG环境,有点麻烦了,所以往往大家不采用这个途径,参照博文http://my.oschina.net/liusicong/blog/314162. 第二种方式:javah的方式则通过shell指令就可以完成整个流程,该过程大概包括以下步骤: 编写 Java 代码.我们将从编写 Java 类开始

Android项目中如何用好构建神器Gradle?

摘要:本文作者贾吉鑫为大众点评Android工程师,在进行团队并行开发时,分库遇到的问题很多都要通过Gradle脚本解决.Gradle虽为构建神器,但学习曲线比较陡峭,要想在Android项目中用好Gradle必须要做到三点. Android Gradle实战 下面讲讲在Android Gradle实战中遇到的一些问题和经验,感觉还是蛮多干货的. productFlavors 这个东西基本上已经烂大街了,gradle的项目一般都会使用Product Flavor,看完美团的文章,你应该就懂了.

Android项目中使用类似菊花的Dialog

Android项目中使用类似菊花的Dialog 效果图一: 项目中使用的效果图二: 1.首先定义动画文件 <?xml version="1.0" encoding="utf-8"?> <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/loading2"

android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

1.下载工具 xstream 下载最新版本地址: https://nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/ 下载完成后 把jar包导入到自己的android项目中 2.asset 文件夹 下的 aa.xml 文件 <?xml version="1.0" encoding="UTF-8"?><product>    <name>

[转]数据库设计中的常用技巧

本文介绍了数据库设计中的14个技巧,这是许多人在大量的数据库分析与设计实践中,逐步总结出来的-- 下述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的.对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握.并逐步做到:在应用中发展,在发展中应用. 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个

Android第4坑:Android项目中使用lambda表达式

Android项目中使用lambda表达式或Java8新特性,需要在app/build.gradle中添加如下配置 android { ... defaultConfig { ... jackOptions.enabled = true } compileOptions{ sourceCompatibility org.gradle.api.JavaVersion.VERSION_1_8 targetCompatibility org.gradle.api.JavaVersion.VERSION

Android项目中自定义顶部标题栏

Android项目中自定义顶部标题栏 下面给大家详细介绍android中自定义顶部标题栏的思路及实现方式 先来图:     思路及实现步骤 1.定义标题栏布局 2.自定义TitleActivity控制标题栏按钮监听 3.在TitleActivity中实现标题栏以下内容切换 首先定义标题栏 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http:/

Android 项目中执行java的main方法

Android 项目中执行java的main方法 导语 今日,在android项目中写了一个工具类,为了简单测试一下输出,就只直接在类中加上了main方法,于是问题来了: 解决方法是网上找到了,已经解决了,在此记录一下. 右击项目名,调出Properties窗口,打开Run/Debug Settings 标签,右边即列出了这个项目中含有main方法的所有java类,双击你要允许的java类: