葡京在线开户Android开发经历说-很少有人会告知您的Android开发基本常识

起段时间从没创新#VSTS日志#了,最近小编太忙碌,全国各地飞来飞去给各种不同之团体实施高效,今天镇不负一看押,呀!TFS
2015 Update 2 RC2都曾公布了。里面好东西不丢掉,列有几个被大家见。

正文介绍Android开发过程中的部分基本常识,大多是一些流程、专业术语和缓解问题的道等。

采取TFS Web来创造同去团队项目

因此了TFS的食指犹知道,要受TFS创建项目那是须要装对顶版本的Visual
Studio的,不管你是故微软开发技术还是用微软开发技术,反正就是你是干Java的,也得作。随便装一个极其小的,也要5只G,就到底硬盘不是题材,时间吧是问题。现在好了,打开浏览器就是折腾定了,上图:

葡京在线开户 1

当,权限还是如有的,不然怎么为企业产品吗!删除也是可以滴。

葡京在线开户 2

软件开发流程

一个完全的软件开发流程离开不起头策划、交互、视觉、软件、测试、维护及营业这七只环节,这七独环节并无是孤立的,它们是开同款款成功产品的前提,但各一样码也都得以形成一个科目,是一个独立的岗位,随着高效开发之兴,以及来了感受呢帝的一世,现代软件开发更多的凡厚效率及高效,而无是奉公守法的比如这些开销流程,比如软件开发的职务不再只是独技术岗位,它要去与前期的统筹以及评审、可以在视觉和互方面提出自己之见识,在出的长河遭到待自测程序尽快缓解现存问题,运营及保安的进程中吗亟需软件之助。可见现代软件开发对开发者的综合素质(这并无是facebook所说的全栈工程师)越来越大,自称为码农或者程序猿显然是免成立的,因为此进程是头脑累与体力脑动并存,称呼自己也工程师显得越来越合理。

  • 策划:求收集(通过用户调研、灰度发布、大数量解析、竞品分析、领导打首等方式取得需求)、需求整理(将需分类、划分优先级等)、将需要变换成为解决方案(输出设计文档);

  • 交互:从心理学(利用性的缺点)、人性化(心智)、个性化的角度将缓解方案转换成为可彼此的效用以及界面(需要输出交互文档),比如加载等待、消息提示、页面布局、页面内与页面间的互动逻辑、页面切换动画等等,这个历程遭到貌似会以Axure或者PowerPoint来制造交互文档;

  • 视觉:冲交互图,使用PhotoShop来举行视觉效果,在Android上之图片格式大多是png和jpg,对于需要屏幕适配,程序同时符合做屏幕适配的地方得采用九图,格式为*.9.png。

  • 软件:基于视觉及互动作用将要求转向为现实的贯彻,在落实的历程遭到恐会见盖急需、交互或者视觉的更改造成软件实现之改变,因为策划、交互、视觉这列一个环都可能会见生出消息失真的情景,或者是由于市场环境的成形、获取信息不敷规范、领导打首等等情况导致软件始终处在被动状态,所以现在会提倡迅猛开发、结对编程、次第设计、同行评审、单元测试来增长程序的油滑与安静;

  • 测试:软件及而交互的专业后,需要拿可彼此的次第提供测试,其中灰度发布(用户测试)、自测(开发自测)、SQA(品质保证)都算是测试;

  • 保护和营业:透过测试程序上稳定标准后,软件就可上线了,软件上线后,需要去保护,用户举报的题目如立马缓解、用户发生问题要立刻解答;根据后台统计信息、抓住可运营的纪念日、民族文化用做运营来增强用户使用产品的粘度,让更多之用户知道、使用产品还是营业该举行的。

注:

  • 可以查阅这答案了解一个APP从创意到上线的切实流程,支付一个APP有差不多麻烦?

  • 足查阅笔戈科技之就篇稿子了解一个部手机(平板或其它电子产品也大多)的出世需要什么样环节,一个手机的诞生过程

采用TFS Web来创造发布管道

自从2013本,TFS中虽有一个Release
Management,用来治本发布管道。可以以付出-测试-生产条件做管道,进行管制,完成机关宣布,自动化测试,审批一类似的且并未问题。就是很界面是于是匪咋地,WPF做的哈,慢的无是相似的蛋疼。要因此之语,还得单独安排一个Server才会打起来。没办法,收购的成品,集成需要时,产品组如是说。

本吓了,直接以浏览器中皆将定了。说实话,这个作用于15年11月便都冒出在线版上了,现在铺面为得就此了,不用另外付费哈,打包的,微软一定的做法。

葡京在线开户 3

哪怕跟方一样,你的TFS里面会多起一个RELEASE的页面,进去以后就是得创建发布管道了。

葡京在线开户 4

接下来为?然后就从未有过然后了,你的出品就是得一键上线了,当然不止集成配置,自动化测试脚本,自动化部署下论及之尚是使你写的。基本上你DevOps了!

葡京在线开户 5

提问的灵性

多数工作且是为结果吗导向的,特别是软件开发这个事情,绩效考核、KPI这些还是当考核你工作之结晶,所以做事还多地是急需您解决问题之力,至于上之事情,还是当办事外的时错开开吧。对于增进解决问题能力我发生有限单建议:

  • 学会读书与琢磨:学学之进程被如果广度与深度并存,Android应用开发自己对技术基础的求未强(因为不少底的事物还为google、框架、开源代码给封装起来了,多数时光你独自待看ReadMe或者API知道怎么用就好了),更多地是以公相逢题目的时候知道这个题目能透过什么艺术与章程来缓解。书而看,但差不多逛逛论坛、QQ群、Github、StackOverflow、CSDN博客专栏对协调都是利之。

  • 学会提问:汝身边有广大资源,比如同事、StackOverflow、QQ技术交流群、搜索引擎,当您遇见问题之时光了好运用身边的资源来化解遇到的问题,如果一个题材在一个小时以内自己还未克化解它们,我哪怕会通过寻找引擎、Github、QQ技术交流群、同事、StackOverflow(以上排序是据事先级列的)来缓解它们。如果您得好之答案而就算待发好之发问,特别是在QQ群或者论坛,在发问的进程遭到要反映出公的沉思,能够透过寻找引擎解决之问题坚决不问别人,这是针对他人的偏重,在这边推荐几单链接,认真看会针对您来惊人的相助:

什么样用好 Google
等搜寻引擎?

程序员应该怎么提问?

叩问的智慧

Smart
Questions

可装插件了

VSTS在线版的插件市场既达到线前行半年了,也该轮到公司版了,Update
2就允许而于公司版上设置插件了。基本上你想做个温馨的定制化看板,复杂的表,或者日历啥的都足以打定了;要集聚成个店家OA啥的把需要导入进来吧非会见那么违和感了。

葡京在线开户 6

介绍几个老有因此底插件吧,装了update 2这些就是是装机必备了。

解决bug的方法

为写这无异于项我专门以知乎上取过一个题目:

公发哪解决bug的技艺?

每当明什么快速化解bug之前,你要明白呀是bug。没有做到策划、交互、视觉要求的机能,这不深受bug,这让功能缺陷;一个力量就后非能够健康下啊无让bug,因为其向尚无达标而测试的标准。我看当你的先后及而测试标准之后察觉的问题才叫bug。综合我要好解决bug的阅历以及知乎上的作答,总结常见的缓解bug的方式来(你想使高速解决bug的前提是公可知快速稳定及缺陷所于的职,所以以下办法多数叙的是哪些迅速定位问题,至于真的解决bug,需要而自己修改程序才行):

  • 断点调试:

以Eclipse为例:

1、打断点:

(1)打断点:

葡京在线开户 7

打断点

(2)清除断点:

葡京在线开户 8

解除断点

2、启动调试模式的少种植方式:

(1)通过debug as启动调试程序:右键工程名–>Debug AS –>Android
Application –>模拟器或者确实时弹出……watching for the
debugger……的提示框,不要点击等待其机动消失 –>
此时就入调试模式,操作程序到达打断点的地方。

(2)在程序运行过程被,在DDMS视图下选中一旦调节之次第,启动调试模式:

葡京在线开户 9

DDMS视图进入调试模式

3、调试:请自行尝试F5、F6、F7、F8这几只调剂的快捷键;

4、watch成员变量:在调试之经过被,比如在履for、while、do
while循环、递归、系统回调等主次时方可由此watch来考察成员变量或者措施返回值的变迁情况,watch的法子:

葡京在线开户 10

watch

注:重多关于以Eclipse IDE中调试Android程序的学识要参见:Android
eclipse中程序调试

  • 打印:

打印调试的道对循环、异步加载、递归、JNI等代码段很有因此,特别是在循环中,在循环次数非常充分时,通过打断点调试显然是千篇一律码吃力的事情,这时候打印就亮又“智能”了,我一般会通过下封装的打印调试类来输出打印信息,这个仿佛可打印print、log、行号、文件称、StrictMode等消息,当不待打印信息时,只需要以DEBUG_MODE改为false就足以了:

    import android.content.Context;
    import android.os.StrictMode;
    import android.util.Log;
    import android.widget.Toast;

    /**
     * 调试打印类
     * 
     * */
    public class DebugUtils{
        private DebugUtils( ){

        }

        public static void println( String printInfo ){
            if( Debug.DEBUG_MODE && null != printInfo ){
                System.out.println( printInfo );
            }
        }

        public static void print( String printInfo ){
            if( Debug.DEBUG_MODE && null != printInfo ){
                System.out.print( printInfo );
            }
        }

        public static void printLogI( String logInfo ){
            printLogI( TAG, logInfo );
        }

        public static void printLogI( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.i( tag, logInfo );
            }
        }

        public static void printLogE( String logInfo ){
            printLogE( TAG, logInfo );
        }

        public static void printLogE( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.e( tag, logInfo );
            }
        }

        public static void printLogW( String logInfo ){
            printLogW( TAG, logInfo );
        }

        public static void printLogW( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.w( tag, logInfo );
            }
        }

        public static void printLogD( String logInfo ){
            printLogD( TAG, logInfo );
        }

        public static void printLogD( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.d( tag, logInfo );
            }
        }

        public static void printLogV( String logInfo ){
            printLogV( TAG, logInfo );
        }

        public static void printLogV( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag || null != logInfo ){
                Log.v( tag, logInfo );
            }
        }

        public static void printLogWtf( String logInfo ){
            printLogWtf( TAG, logInfo );
        }

        public static void printLogWtf( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.wtf( tag, logInfo );
            }
        }

        public static void showToast( Context context, String toastInfo ){
            if( null != context && null != toastInfo ){
                Toast.makeText( context, toastInfo, Toast.LENGTH_LONG ).show( );
            }
        }

        public static void showToast( Context context, String toastInfo, int timeLen ){
            if( null != context && null != toastInfo && ( timeLen > 0 ) ){
                Toast.makeText( context, toastInfo, timeLen ).show( );
            }
        }

        public static void printBaseInfo( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; class:" ).append( stackTrace[ 1 ].getClassName( ) )
                        .append( "; method:" ).append( stackTrace[ 1 ].getMethodName( ) )
                        .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) )
                        .append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static void printFileNameAndLinerNumber( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) )
                        .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static int printLineNumber( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) );

                println( strBuffer.toString( ) );
                return stackTrace[ 1 ].getLineNumber( );
            }else{
                return 0;
            }
        }

        public static void printMethod( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; number:" ).append( stackTrace[ 1 ].getMethodName( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static void printFileNameAndLinerNumber( String printInfo ){
            if( null == printInfo || !Debug.DEBUG_MODE ){
                return;
            }
            StringBuffer strBuffer = new StringBuffer( );
            StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

            strBuffer.append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) )
                    .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) ).append( "\n" )
                    .append( ( null != printInfo ) ? printInfo : "" );

            println( strBuffer.toString( ) );
        }

        public static void showStrictMode( ) {
            if (DebugUtils.Debug.DEBUG_MODE) {
                StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                        .detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
                StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                        .detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
            }
        }

        public static void d(String tag, String msg){
            if(DebugUtils.Debug.DEBUG_MODE){
                Log.d(tag, msg);
            }
        }

        public class Debug{
            public static final boolean DEBUG_MODE = true;
        }

        public static final String TAG = "Debug";
    }
  • 目视法:

立可为code
review,但是不顶依仗谱,因为人的活力毕竟有限,有时候你差不多敲一个分号,缩进不对都生或造成程序出现问题,但以代码量较少时是一个胜过效率的方法。

  • 自动化测试:

Android的自动化测试(分白盒测试与黑盒测试)工具有:monkey、Robotium、Appium、云端测试(比如testin),具体用法而参见:

android实用测试方法之Monkey与MonkeyRunner

Robotium

Testin

Appium中文课

  • 排除法:

调剂、打印、目视这三种方式可吃得复现的问题,对于随意问题(实际上不存在任意问题,只是问题无那么爱复现而已),比如以线程、音频播放、AnsynTask、Timer切换或者终止时刚好开了对应地人为操作导致出现灵异现象。这时候可以经过排除法来排查问题,具体的方是率先大概定位及起问题之岗位,然后拿代码一段落同样段落地诠释,观察程序现象,逐步缩小出现问题的克。

保险管理器 Package Management

针对华夏的顺序猿来说特别发因此,原因你懂的,我们巨大之防火墙把什么好东西坏东西全当成资本主义垃圾了,想给程序上加个bootstrap都tmd得FQ。这不是坑猿嘛!所以重重人便好把管拷贝回来了,现在你得为此包管理器来干是了!

葡京在线开户 11

地址:https://marketplace.visualstudio.com/items?itemName=ms.feed

本管理介绍

当较充分的软件开发过程被,可能产生差不多个软件工程师同时支付一个项目的情形,比如来负读取数据、获取网络数据等API封装的,有背程序架构的,有当上层界面实现的,为了能够最终编译一个完了的次序下,需要拿代码整合,这个时最利于之不二法门就是是行使本管理工具,固定时间上传(比如每天、没改变一个力量等等),这样能实时保证服务器上之代码是绝完整、最新的,也得避免由于自然灾害、电脑坏导致地方电脑挂掉损失掉代码的问题。

广阔的本子管理工具有SVN和Git,我吧利用过CVS,关于本管理工具的牵线参见:

版本控制

版本控制系统的选料的路

git教程

git简易指南

注:对此windows用户来说,建议用乌龟壳系列的版本控制客户端,使用github的爱人可使github
for windows客户端:

tortoisegit

tortoisecvs

tortoisesvn

github for
windows

做事起事关可视化 Work Item Visualization

需要,任务之各种父子关系,前后关系;可视化出来就是清楚多了,不用多说。看图!

葡京在线开户 12

立马卖还支持代码提交的可视化

葡京在线开户 13

地址:https://marketplace.visualstudio.com/items?itemName=ms-devlabs.WorkItemVisualization

编译

常见我们因此Eclipse或者Android
Studio开发android程序时,只待周转程序即使好当模拟器或者机器及运行程序了,但为保险代码的完整性、能够当服务器上编译,需要经编译工具将代码编译成apk,常见的编译工具有:ant、gradle,但迅即有限种编译工具都是索要经手动敲命令来形成编译功能(当然你为堪协调写脚本来实现编译自动化),jenkins举凡一个连发集成的家伙,通过它好代码克隆、编译和程序加密自动化,其实它们吧是透过批处理来落实之,ant、gradle和jenkins的切切实实用法机关谷歌,使用起来颇简单,目前android
studio和github上诸多力量还是透过gradle来编译的。

工时管理器 TFS TimeTracker

作主管怎么能够不亮堂程序猿干了多少活也?这个家伙应该是老板娘们都挺happy看到的!

葡京在线开户 14

尚好自动测算工时,本地要装一个跟踪器。虽然稍编讨厌这个家伙,但眼看是本人在被诸位业主介绍研发管理网不时于提问到最好多的问题(没有之一):那若可知自行跟踪开发的工时么?

葡京在线开户 15

地址:https://marketplace.visualstudio.com/items?itemName=Berichthaus.TfsTimetracker

专业术语介绍

以下解释了是自身的亮,详细分解可自行谷歌。

  • 本子迭代:遵照需求优先级,在承保基本功能OK后连连开发以及升级换代,这样能够降低软件开发的高风险,并且能即时化解用户反馈的问题,船小好掉头嘛;

  • 疾开发:稍微步快蒸发,大概意思就是是永不过度看重文档,要厚公开交流,能够在贯彻时高保真的还原用户的需状况,并且会高效地缓解用户的需要。

  • 单元测试:白盒测试的相同种,对中心措施通过写序来测试好的程序,单元测试的目的是叫您发出察觉地落程序中的耦合,保证各一个措施都是无限小单元,但当下对于测试程序逻辑是没有拉,这是本人要好的明亮。。。

  • 灰度发布:优先找找一片用户来使将发布的次序(这有些用户可是轻易抽取、制定年龄段、指定地方或通过某种方式了解他是生动活泼用户),在测试的历程遭到为跟用户一点利被用户写用户体验报告、反馈问题等方法来发现先后是的问题与短处;

  • DA统计:也于后台统计,通过在程序中埋点的法子,在产生网络的气象下将用户的操作行为跟多少上传到后台,将每个用户的信还达到污染回到就让大数量,通过建模对这些数量解析就是吃大数目解析。

  • 开放平台:本分享到QQ空间、分享到微信、讯飞语音、友盟的后台统计、天气、地图之类都叫作开放平台,它提供了一些开花的接口给开发者,方便开发者使用它们的劳务,开放平台多数劳务还是免费的,但偶尔为可能无稳定,比如用底食指少它本就活不下去了,然后就是没然后了。

  • 同行评审:汝的同行和公一起看您的代码,发现是否有题目;

  • 结对编程:每当形容代码的长河遭到,有只人口因为在你边或者您为于旁人干,编写边谈论,降低程序出现逻辑与初级错误的几率。

计划扑克 Estimate

受品种开预算神马的最麻烦人矣!现在好了,大家回去自己的工位上打圈麻将就抓定矣。这个是基于敏捷规划中之planning
poker的电子版实现,好不好用,用用就清楚了。

葡京在线开户 16

地址:https://marketplace.visualstudio.com/items?itemName=ms-devlabs.estimate

实践了,小编已经特别烦恼了!想看完整列表的通这里

https://www.visualstudio.com/news/tfs2015-update2-vs 

思念下载的扎这里

https://www.visualstudio.com/downloads/update2-prereleases#AdditionalPageSections_55


请求关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的音

葡京在线开户 17

Android开发资源

参见我的别样一样篇稿子:Android开发者网址导航

建议

  • 尽心尽力阅读官文档,这才是原汁原味、不失真的开支指导;

  • 就算你认为规划程序是浪费时间,你只是欣赏写程序,至少你吧得用心想导图理清思路,思维导图对于帮忙您掌握设计文档、理清思绪来坏酷之支援;

  • 绝不用Intent传递大量之多少,这起或致ANR或者报那个;

  • 于剥离页面后,系统不必然会马上实施onDestory方法,如果您在onDestory方法里举行关闭文件、释放内存的操作可能出现退出程序同时即进入时,由于用重新初始化这些信导致代码重入的不行;

  • 于改动JNI后,运行程序之前记得卸载掉就设置在模拟器或者真机上之拖欠次,如果直接运行,android不见面load最新编译的so,也便未可知及时看到修改后的意义;

  • 代码至少每天备份一不成,或者是健全一个效应就备份一坏,不要堆放后一次性备份,因为以你的代码有题目需回溯代码时您需要打服务器上更取代码,同时为可以避免代码不是时导致最终及其他人合并时不晓改了哪些地方;

  • 将打印信息封装成一个方式,用一个标志位控制是是法子的方法体是否要实施,这样以由debug版释放及release版本时,不待傻傻地一致履一行地失去丢代码,你独自待变更标志位的价值就是好了;

  • 对于发生返回值的JNI函数,即使你无回去外价值,用NDK编译JNI的时刻吧无会见报错,所以当写JNI代码的早晚,一定要是致密检查代码;

  • JNI频繁读写文件操作会影响程序的周转性能,可以设想一次性在内存中申请一片很内存作为缓存空间,用这种空间更换时间的方法可以大大提高程序的周转效率;

  • 并非指望类的finalize方法去处理要回收与销毁的干活,因为finalize是网回调的章程,调用时机不可预见,切记;

  • 使用文件流、Cursor时,使用完毕晚记得一定要是关闭,否则恐怕引致内存泄漏,严重的状况也许引发程序崩溃;

  • 先期采取Google搜索引擎(少用百度),如果非能够健康下Google搜索引擎建议通过代办、VPN、修改hosts文本等措施搭建梯子。这里提供一个免费之谷歌搜索引擎

  • 对此未待使用硬件加速的activity(没有动画效果、视频播放以及各种多媒体文件的操作都可以合硬件加速),在AndroidManifest.xml文件中经过“android:hardwareAccelerated=”false””关掉硬件加速可省下内存;

  • 于用横竖屏转换的运,又休思量在横竖屏切换的时候又跑onCreate方法,可以于AndroidManifest.xml文件被对应的Activity标签下调用“android:configChanges=”screenSize|orientation””;

  • 为了减轻应用程序主进程的内存压力,对于耗内存比较多的界面(比如视频播放界面、flash播放界面等),可以当AndroidManifest.xml文件被对应之Activity标签下调用“android:process=”.processname””单开一个进程,但每当离者界面的当儿一定要以拖欠界面的onDestory方法被调用System的kill方法来良掉该过程;

  • 在res/values/arrays.xml文件被定义之单个数组的要素个数不宜过十分,过大会导致加载数据时好缓慢,有时候你待使用数组资源时数产生或还尚未加载成功;

  • 一个Activity中不过耗费内存的凡activity的背景(多数情景如此,特别是对此分辨率很要命的机械,一个界面的背景竟下来还需好几兆内存),所以当程序界面较多时,可以设想以图纸转换成静态的drawable,然后多个activity共用就无异布置背景图;

  • 可透过为application、activity自定义主题的方法来关闭多沾触摸功能,只待在打定义的主题下上加这半独标签:

      <item name="android:windowEnableSplitTouch">false</item>
      <item name="android:splitMotionEvents">false</item>
    
  • 很多游乐上时,播放的片头动画多数凡是一个视频文件;

  • Android单个dex文件的艺术数不能够跳65536独,android使用多单dex能否避开65536办法数限制?

  • 使用模拟器genymotion代替android自带模拟器(它用虚拟机vituralbox的支持,不过官网已提供了一个合龙虚拟机的安装包了,直接下载下来安装即可),可以大大提高使用模拟器的心得(流畅、快),它也得坐插件的样式集成在Eclipse中,即时是视频教程

  • 让Application或者activity设置从定义主题时,最好不用设置为全透明,否则在activity按Home键回退到桌面的时力量好渣;

  • 要你要取消toast显示的机能,在一个好像中若一味需要实例化该类一坏(也就是说将Toast定义成一个大局的成员变量),这样您就是好调用mToast.cancel()了,我拿它们形容成了一个静态类:

      public class ToastUtils {
          private ToastUtils( ){
    
          }
    
          public static void showToast( Context context, String toast ){
              if( null == mToast ){
                  mToast = Toast.makeText( context, toast, Toast.LENGTH_LONG );
              }else{
                  mToast.setText( toast );
              }
    
              mToast.show( );
          }
    
          public static void cancel( ){
              if( null != mToast ){
                  mToast.cancel( );
              }
          }
    
          public static Toast mToast = null;
      }
    
  • 卿可以定义一个静态类来促成防止按钮被还点击导致更执行同样段落代码的题目:

      /**
       * 按钮重复点击
       * 
       * */
      public class BtnClickUtils {
          private BtnClickUtils( ){
    
          }           
    
          public static boolean isFastDoubleClick() {
              long time = System.currentTimeMillis();
              long timeD = time - mLastClickTime;
              if ( 0 < timeD && timeD < 1000) {   
                  return true;   
              }
    
              mLastClickTime = time;
    
              return false;   
          }
    
          private static long mLastClickTime = 0;
      }
    
  • 置身apk的assets或者raw目录下之数据文件最好做加密处理,在得利用的早晚才解密,这样可以避免以apk被他人破解时数也让破解的题材;

  • 极致不要再activity的onCreate方法中调用popupwindow的show方法,有或由activity没有了初始化导致程序非常(android.view.WindowManager$BadTokenException:
    Unable to add window — token null is not
    valid
    ),如果无要是当一进activity就展示popupwindow,建议就此handler.post、View.postDelay来拍卖;

  • 对自定义View,在构造方法里面是收获不至视图的富足高之(此时收获丰富宽都为0),需要在onMeasure方法被要跑了onMeasure方法后才会收获到视图的红火高,不过你可透过以构造方法里面强制测量视图的松高来实现在构造方法里取得视图的方便高信息,具体表现MeasureSpec介绍及采取详解

  • 如果你道在安装Eclipse后尚欲配置android开发环境异常辛苦,你可一直用ADT
    Bundle,它是一个懒人套餐,下载下来便好为此了,可以以这里下载。

  • 发生时间探望阿里技巧嘉年华、InfoQ演讲和访谈、Google
    IO视频,可以学学到有的缓解问题、做生项目之经验。

  • 当使用被卡通比较多,并且动画都是通过图形来切换的时节,可以设想借用Cocos的快表单想,这样便可以避图片命名的苦恼。

工具推荐

  • 代码对比:Beyond
    compare

  • 屏幕取色:ColorPix

  • 梯子:红杏

  • 沉凝导图:
    mindmanager

  • 在线工具:在线工具

Android应用开发第三在解决方案

产图为Android应用开发第三正解决方案汇总,有些可以依靠第三方平台搞定的即使玩命不要自己搞,一是得节省成本,二凡是您没有人家专业,原文链接:Android应用开发第三方解决方案

葡京在线开户 18

老三正值解决方案