民族

Android开发经验谈-很少有人会报告您的Android开发基本常识

7 2月 , 2019  

正文介绍Android开发进度中的一些基本常识,大多是一对流水线、专业术语和化解难题的主意等。

图片 1

软件开发流程

一个完整的软件开发流程离不开策划、交互、视觉、软件、测试、维护和运营那三个环节,这八个环节并不是孤立的,它们是支付一款成功产品的前提,但每一项也都足以形成一个课程,是一个独门的地点,随着高效开发的风行,以及来到了体验为王的一代,现代软件开发越来越多的是重视效能和便捷,而不是规矩的根据这个支出流程,比如软件开发的地点不再仅仅是个技巧职责,它必要去加入先前时期的安顿性和评审、可以在视觉和相互方面提出自己的见识,在付出的经过中必要自测程序尽快缓解现存难点,运营和爱惜的长河中也要求软件的帮衬。可知现代软件开发对开发者的汇总素质(那并不是facebook所讲的全栈工程师)越来越高,自称为码农或者程序猿鲜明是不创建的,因为那些进度是头脑劳动和体力脑动并存,称呼自己为工程师显得愈发合理。

  • 策划:要求收集(通过用户调研、灰度揭橥、大数据解析、竞品分析、领导拍脑袋等艺术赢得须要)、须要整理(将须要分类、划分优先级等)、将要求转换成解决方案(输出设计文档);

  • 交互:从心境学(利用人性的短处)、人性化(心智)、个性化的角度将解决方案转换成可交互的成效和界面(必要输出交互文档),比如加载等待、音讯提醒、页面布局、页面内和页面间的交互逻辑、页面切换动画等等,这么些进度中貌似会采纳Axure或者PowerPoint来制作交互文档;

  • 视觉:据悉交互图,使用PhotoShop来做视觉效果,在Android上的图片格式大多是png和jpg,对于须要屏幕适配,程序又顺应做屏幕适配的地点能够使用九图,格式为*.9.png

  • 软件:基于视觉和互相功能将须要转向为具体的落到实处,在完毕的进程中或许会因为急需、交互或者视觉的变更造成软件完成的更动,因为策划、交互、视觉那每一个环节都可能会有信息失真的场景,或者是出于市场条件的变更、获取音信不够标准、领导拍脑袋等等情状导致软件始终高居力倦神疲状态,所以现在会提倡高速开发结对编程先后设计同行评审单元测试来进步程序的油滑和来宾久安;

  • 测试:软件达到可交互的业内后,须求将可互相的顺序提供测试,其中灰度发表(用户测试)、自测(开发自测)、SQA(质量保险)都算是测试;

  • 保安和营业:经过测试程序达到稳定标准后,软件就可以上线了,软件上线后,须要去维护,用户反映的标题要霎时化解、用户有难题要立刻解答;依照后台计算音信、抓住可运营的节日、民族文化须要做运营来增进用户使用产品的粘度,让愈多的用户知道、使用产品都是营业应该做的。

注:

1、 前希腊共和国(The Republic of Greece)史的简述及工学形成的尺度:

咨询的小聪明

大部干活都是以结果为导向的,尤其是软件开发那个工作,绩效考核、KPI这几个都是在考核你工作的硕果,所以工作越来越多地是亟需您解决难题的能力,至于学习那几个工作,仍旧在劳作之外的时日去做呢。对于拉长解决难点能力我有多个提议:

  • 学会读书和揣摩:学学的长河中要广度和纵深并存,Android应用开发自己对技术基础的渴求不高(因为众多底层的东西都被google、框架、开源代码给封装起来了,多数时候你只需求看ReadMe或者API知道怎么用就可以了),越多地是在您赶上难题的时候知道那几个题材能够通过哪些方法和办法来化解。书要看,但多逛逛论坛、QQ群、Github、StackOverflow、CSDN博客专栏对协调都是便民的。

  • 学会提问:您身边有过多资源,比似乎事、StackOverflow、QQ技术调换群、搜索引擎,当你遇见难题的时候完全可以行使身边的资源来化解蒙受的标题,假诺一个难题在一个钟头之内自己都无法解决它,我就会通过搜索引擎、Github、QQ技术互换群、同事、StackOverflow(以上排序是按事先级排列的)来缓解它。如若您必要好的答案你就要求有好的问话,越发是在QQ群或者论坛,在提问的长河中须要反映出你的合计,可以通过搜寻引擎解决的标题坚决不问旁人,那是对别人的爱护,在此地推荐多少个链接,认真看会对您有莫大的帮带:

何以用好 谷歌等搜索引擎?

程序员应该如何提问?

提问的灵气

Smart
Questions

(前古希腊共和国(The Republic of Greece)史,比如克里特一时与迈锡尼时期对古希腊共和国(Ελληνική Δημοκρατία)的熏陶,从神话构思到理论思想的变型的背景简述,前古希腊共和国(The Republic of Greece)史的基本点在于,古希腊共和国(Ελληνική Δημοκρατία)法学的出世土壤根植于宗教神话之中,所以没有对前古希腊共和国(The Republic of Greece)史的阐释,就很难知晓农学诞生的实际上意况,也很难去了然军事学所指出的说理根源。背景的打听有助于理学思想的明白程度的深化。)

解决bug的方法

为了写这一项我更加在博客园上提过一个难题:

您有如何解决bug的技能?

在明亮怎么高效化解bug此前,你须求知道怎样是bug。没有马到成功策划、交互、视觉要求的功力,那不叫bug,那叫功效缺陷;一个效应完结后不可能正常使用也不叫bug,因为它根本还没达标可测试的业内。我觉得当您的顺序达到可测试标准之后察觉的标题才叫bug。综合我要好解决bug的阅历和天涯论坛上的回应,计算常见的解决bug的点子有(你想要高效解决bug的前提是您可见高效稳定到缺陷所在的职位,所以以下办法多数讲的是何等飞快定位难点,至于真的解决bug,须要你自己修改程序才行):

  • 断点调试:

以Eclipse为例:

1、打断点:

(1)打断点:

图片 2

打断点

(2)清除断点:

图片 3

免去断点

2、启动调试方式的三种方式:

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

(2)在程序运行进程中,在DDMS视图下选中要调节的次序,启动调试形式:

图片 4

DDMS视图进入调试方式

3、调试:请自行尝试F5、F6、F7、F8这多少个调剂的火速键;

4、watch成员变量:在调试的经过中,比如在实施for、while、do
while循环、递归、系统回调等程序时方可经过watch来观望成员变量或者措施再次来到值的变化景况,watch的措施:

图片 5

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、提姆er切换或者终止时正好做了对应地人为操作造成出现灵异现象。那时候能够透过排除法来排查难题,具体的艺术是首先大约定位到出现难题的职位,然后将代码一段一段地诠释,观看程序现象,逐步收缩出现难点的界定。

(一)、古希腊语(Greece)当然社会的简单表达:古希腊共和国(Ελληνική Δημοκρατία)的地区大约包蕴:主体的希腊语(Greece)半岛、小亚细亚西头沿海、罗斯海小岛、克里特岛。希腊(Ελλάδα)区域紧要的当然条件是山地,贫乏平原与耕地。

本子管理介绍

在较大的软件开发进程中,可能有四个软件工程师同时费用一个品类的情景,比如有担当读取数据、获取网络数据等API封装的,有负担程序架构的,有负责上层界面完毕的,为了可以最终编译一个完事的次序出来,需要将代码整合,这几个时候最有利于的点子就是使用版本管理工具,固定时间上传(比如每一日、没改变一个功力等等),那样可以实时保险服务器上的代码是最完好、最新的,也足以幸免由于自然灾难、电脑至极导致本地电脑挂掉损失掉代码的标题。

常见的本子管理工具有SVN和Git,我也使用过CVS,关于版本管理工具的牵线参见:

版本控制

版本控制系统的精选之路

git教程

git简易指南

注:对此windows用户来说,提出选择海龟壳连串的版本控制客户端,使用github的恋人可以拔取github
for windows客户端:

tortoisegit

tortoisecvs

tortoisesvn

github for
windows

克里特文明—依据考古的已有资料可以得出如下结论一、在克里特半岛的前王宫时代与后王宫时代本土人经过漫长的开拓进取从象形文字到线形文字A的变化。二、王宫时代,私有制的产出与差距。首假如青铜制工具。到最终自然灾荒与群体迁移的缘由而结尾消逝。三、本土的佩拉司吉人与印欧语人中的分支阿该亚人南下希腊(Ελλάδα)半岛逐渐迁徙进度融合一部分歧为新生的伊奥尼亚人与埃俄格拉茨人。还有一对阿该亚人进去伯罗奔尼撒半岛,在阿哥瓦尔帕莱索地区里面囊括迈锡尼。四、另一部分阿该亚人进入克里特半岛的克诺索斯城邦,取代原来的本土人,建立城邦,直至终结。

编译

无独有偶大家用Eclipse或者Android
Studio开发android程序时,只必要周转程序就可以在模拟器或者机器上运行程序了,但为了有限支持代码的完整性、能够在服务器上编译,需求经过编译工具将代码编译成apk,常见的编译工具有:antgradle,但那三种编译工具都是内需经过手动敲命令来成功编译作用(当然你也足以协调写脚本来完成编译自动化),jenkins是一个持续集成的工具,通过它可以代码克隆、编译以及程序加密自动化,其实它也是通过批处理来落到实处的,ant、gradle和jenkins的切实用法机关谷歌,使用起来很简单,近来android
studio和github上很多效益都是由此gradle来编译的。

迈锡尼文明—希腊共和国半岛的阿该亚人开创迈锡尼文明,出现波兰语的线形文字B。阿咖农领导希腊共和国(Ελληνική Δημοκρατία)半岛的部落联军进献特洛伊城。那是希腊共和国(Ελληνική Δημοκρατία)存有记载以来的首先次联合军事行动,对希腊(Ελλάδα)民族意识的变异起到关键的效应。公元前1123年左右多立斯人摧毁了迈锡尼文明。却留下了盛名的荷马史诗《伊利昂纪》和《奥德修纪》。大家所说的“荷狗时期”与“乌黑时代”便是迈锡尼文明的一代。多立斯人的侵入导致了古希腊共和国(The Republic of Greece)太古文明的落后。

专业术语介绍

以下表明完全是自我的明亮,详细解释可活动谷歌(谷歌(Google))。

  • 本子迭代:循途守辙必要优先级,在承保基本成效OK后持续开发和升迁,那样可以下跌软件开发的高风险,并且可以即时化解用户反馈的难题,船小好掉头嘛;

  • 很快开发:小步快跑,大致意思就是决可是于讲究文档,要讲求公开调换,能够在贯彻时高保真的还原用户的要求处境,并且可以高效地缓解用户的急需。

  • 单元测试:白盒测试的一种,对焦点措施通过写程序来测试自己的次第,单元测试的目标是让你有发现地下落程序间的耦合,保障每一个措施都是纤维单元,但那对于测试程序逻辑是不曾援救,这是自身自己的知晓。。。

  • 灰度发表:先找一部分用户来选择即将发布的次第(这一部分用户可以是自由抽取、制定年龄段、指定地区依然经过某种情势驾驭她是生动活泼用户),在测试的长河中予以用户一点益处让用户写用户体验报告、反馈难题等办法来发现先后存在的题目和瑕疵;

  • DA统计:也叫后台统计,通过在先后中埋点的主意,在有互联网的事态下将用户的操作行为和数量上传到后台,将每个用户的音信都上传回来就叫大数额,通过建模对这几个数据解析就叫大数据解析。

  • 开放平台:例如分享到QQ空间、分享到微信、讯飞语音、友盟的后台计算、气候、地图之类都称为开放平台,它提供了有的绽放的接口给开发者,方便开发者使用它的服务,开放平台多数劳务都是免费的,但有时候也说不定不安定,比如用的人少它自然就活不下去了,然后就不曾然后了。

  • 同行评审:你的同行和你一起看看您的代码,发现是或不是有标题;

  • 结对编程:在写代码的经过中,有个人坐在你旁边或者您坐在旁人旁边,编写边谈论,下落程序现身逻辑和初级错误的几率。

前希腊(Ελλάδα)史时期的爱琴文明分为:克里特文明和迈锡尼文明。多个古希腊共和国(The Republic of Greece)史前的大方都是所有如下的几点特征:一、青铜制工具。二、粗糙的文字形成,未具系统。三、私有制的产出与贫富差别。四、商业与航海技术的强盛。五、
部分区域的氏族部落的定势居所的开始形成与氏族部落建制的初阶成型。六、古希腊语(Greece)民族意识尚未成型、处于朦胧(英文名:yú méng lóng)态。七、处于零散的群体分布以及搬迁的动静,部落易于受固有游牧民族的相撞,以及诸部落不断地融合的表征。八、形成最初的共有与私家划分的奴隶制。九、爱琴文明本身深受东方文明的熏陶。

Android开发资源

参见我的另一篇小说:Android开发者网址导航

在公元前九-八世纪,以阿该亚人为主的埃俄孟菲斯人与伊奥尼亚人和多立斯人三大民族在希腊(Ελλάδα)半岛、小亚细亚南边沿海、克利特海岛屿、克里特岛最终形成了最起头的“古希腊语(Greece)人”,但仍没有形成“古希腊共和国(The Republic of Greece)人”的民族意识。到公元前八-六世纪的城邦奴隶制的演进,逐渐打破氏族部落之间的区域界限,才末了逐步形成希腊共和国(Ελληνική Δημοκρατία)人的民族意识与认可感。

建议

  • 尽心尽力阅读合法文档,那才是原汁原味、不失真的付出率领;

  • 哪怕你认为规划程序是浪费时间,你只是欣赏写程序,至少你也得用思维导图理清思路,思维导图对于协理您通晓设计文档、理清思绪有很大的扶植;

  • 毫无用Intent传递大批量的数额,那有可能造成ANR或者报那一个;

  • 在脱离页面后,系统不自然会立马实施onDestory方法,假设你在onDestory方法里做关闭文件、释放内存的操作可能现身退出程序又及时进入时,由于必要再行起始化那一个新闻导致代码重入的百般;

  • 在改变JNI后,运行程序在此以前记得卸载掉已经设置在模拟器或者真机上的该程序,如果间接运行,android不会load最新编译的so,也就不可以及时看到修改后的职能;

  • 代码至少每一天备份四次,或者是无微不至一个效益就备份四遍,不要堆放之后五次性备份,因为在你的代码出标题亟需回溯代码时您必要从服务器上再一次取代码,同时也可以防止代码不是流行导致最后和其外人合并时不精晓改了哪些地点;

  • 将打印音讯封装成一个办法,用一个注解位控制这么些这些艺术的方法体是或不是须求履行,那样在由debug版释放到release版本时,不须要傻傻地一行一行地去掉代码,你只必要转移标志位的值就能够了;

  • 对于有再次来到值的JNI函数,即使你不回去任何值,用NDK编译JNI的时候也不会报错,所以在写JNI代码的时候,一定要过细检查代码;

  • JNI频仍读写文件操作会影响程序的运行质量,可以考虑三次性在内存中申请一块大内存作为缓存空间,用那种空间换时间的法门得以大大升高程序的运转作用;

  • 不要指望类的finalize方法去处理须求回收和销毁的工作,因为finalize是系统回调的方法,调用时机不可预知,切记;

  • 应用文件流、Cursor时,使用达成后记得一定要关闭,否则可能引致内存泄漏,严重的处境恐怕引发程序崩溃;

  • 先行利用谷歌搜索引擎(少用百度),若是不可能健康使用谷歌(Google)搜索引擎提出通过代办、VPN、修改hosts文件等措施搭建梯子。那里提供一个免费的谷歌(谷歌(Google))查寻引擎

  • 对于不要求采纳硬件加快的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的灵活表单合计,那样就可避防止图片命名的不快。

古希腊(Ελλάδα)文明与爱琴文明之间的学问断层:一、文字传承的断裂:爱琴文明所创办的线形文字消失,并未对古希腊共和国(Ελληνική Δημοκρατία)文字爆发影响。古希腊语(Greece)人是从腓尼基人何地获得最开头的假名,举行改造形成自己的文字。二、大多数观念文化的断裂:爱琴文明其中政治制度并不曾一向被古希腊语(Greece)人所承受,其中的传说与情势经济学以隐瞒又曲折被传承下去。由新兴古希腊语(Greece)人从东方文明之中汲取最初的文静养料。仅存神话。

工具推荐

文化断层的分解:本人认为所谓的知识断层即作为一个国度方式的一体化文化观念包涵上层建筑与经济基础被摧毁,而错失了作为完全的内部社会运行体制与群体的内在稳态。文化的继承部分亦或任何收敛或者丧失了的操纵内部的预订力量,传统的政治经济文化以一种零碎而微弱的法门、或以一种直接隐秘的章程上的熏陶。

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

下图为Android应用开发第三方解决方案汇总,有些可以看重第三方平台搞定的就玩命不要自己搞,一是足以节省花费,二是您没人家专业,原文链接:Android应用开发第三方解决方案

图片 6

其三方解决方案

既是古希腊共和国(The Republic of Greece)文明并未直接从爱琴文明那里继承,那么为啥我们要求在读书古希腊语(Greece)历史学以前领会前希腊共和国史时期的野史呢?我个人提交如下几点理由:其一、前希腊(Ελλάδα)史时期的爱琴文明所享有的表征也是古希腊共和国文明诞生的着力造型。其二、爱琴文明时代的群体迁徙的争辩与融合的进程,本身是古希腊(Ελλάδα)文明演进的进度。其三、古希腊语(Greece)的神话是在爱琴文明时代逐步形成的,神话、艺术经济学观念被古希腊语(Greece)所承受。

(二)宗教神话时期的解说:

一、从原有社会的氏族部落间流行的图腾崇拜与拜物教中的原始观念,经过赫西奥德系统化,形成的“神谱”系。之后慢慢形成全希腊语(Greece)人所公认的民族神-Apollo神以及建立德尔菲神托所。图腾崇拜与拜物教的特色:具有幻想性质的宗派信仰、对自然力的惊惶失措与代表崇拜,并使自然物,化为本民族的绘画。

二、尼采的太阳神与酒神理论。依据尼采在《喜剧的落地》一书的阐释可以得出:以太阳公Apollo为表示的梦幻象征,以酒神狄奥尼索斯为代表的狂醉象征。两者所共构的格局的表明形式。太阳星君与酒神文化早期伴随着原始野性的翩翩起舞与音乐而存在。(尼拔取神话时期太阳星君与酒神来反对苏格拉底为代表的心劲主义的抽象概念的逻辑推导为特点的理学传统。)对《喜剧的出生》相关的讲述得出几点:幻想性质的感觉体验与原始野性的宗教仪式。

三、马克思的争鸣:“我们领略,希腊共和国(Ελληνική Δημοκρατία)神话不只是希腊共和国(Ελληνική Δημοκρατία)办法的武库,而且是它的泥土。····任何神话都是用想象和凭借想象以战胜自然力,支配自然力,把自然力加以形象化;因此随着这个自然力之实际上被决定,神话也就消失了,···希腊共和国(Ελληνική Δημοκρατία)艺术前提是希腊共和国神话,也就是经过公民的幻想用一种不自觉的点子方法加工过的当然与社会方式本身。那是希腊共和国(The Republic of Greece)方式的材料。”依照马克思的论述可以汲取:一、古希腊共和国(The Republic of Greece)的教育学艺术最初素材来自希腊(Ελλάδα)神话。二、神话具有幻想性质。三、神话是对自然力的主宰与印象拟人化。(神谱)除此之外在《Marx恩格斯选集》第4卷第219-220页中的描述,得出如下几点:一、早期由于人类自己的局限性,不能认识灵魂与身体之间的涉嫌,而揣测灵魂不死。二、通过对自然力的形象化以及人格化,爆发多神思想,再经过抽象思维暴发最终的一神思想。

四、荷马史诗与《神谱》:通过对两部史诗的读书得出,一、对自然(自然力、自然物)与性欲的貌似显象的映像拟人化以一种小说格律的吟唱形式表明出来。

宗教神话时期的总特征:一、传说的拟人形象化、感性人格化所共构世界最后形成“神人同型论”的社会风气。二、在神话世界观中,已经形成宇宙生成循环世界观的表达系统。三、人神处于共构共存的世界特色。四、宗教神话构思具有幻想性质和原始的野性的宗教体验倾向。

(三)、古希腊共和国(The Republic of Greece)工学的多变标准:

1、
本土的当然社会经济条件:希腊共和国(Ελληνική Δημοκρατία)区域主要的本来条件是山地,贫乏平原与耕地。依照古希腊语(Greece)历思想家希罗多德的阐释,可以得出,古希腊共和国(Ελληνική Δημοκρατία)的伊奥尼亚地区独具最佳的气象条件,古希腊共和国(Ελληνική Δημοκρατία)人最早在伊奥尼亚地区树立了十二个城邦,其中米利都、爱菲索、萨摩斯商业与航海技术最为发达,那样给予古希腊共和国(Ελληνική Δημοκρατία)文明进化的自然条件,也是为啥米利都最头阵展出教育学最头阵的优势。(自然条件与经济基础确实是管理学思想诞生的前提条件,但在分外规的时代与气象下,却有啥落后地区的第一发出文学思想。比如早期古希腊共和国文明低于东方文明。除此之外,在少数景况下,经济政治发达地区的思维高度却低于经济政治落后的地面,比如启蒙运动时期的英法在一段时间内低于德意志联邦共和国。所以自己说“先发优势”泰勒斯、阿那克西曼德、阿这克西美尼、赫拉克利特四位最早的当然史学家便是出自伊奥尼亚地区。自然条件的因由造成古希腊共和国(The Republic of Greece)人紧要透过国外贸易来满意内部的食物必要。那样也助长了古希腊共和国(The Republic of Greece)城邦的工商业与航海技术的上扬,打破原来地面,向外拓展国外殖民贸易。

2、
教派神话条件;诗歌体现:荷马史诗的《安慕希昂纪》和《奥德修纪》与赫西奥德《神谱》。宗教团体突显:埃硫西斯教、奥菲斯教、锡罗丝的斐瑞居德的神话构思、赫西奥德《神谱》说俄刻阿诺是海洋之神。荷马在《长富昂纪》说“俄刻阿诺是诸神的小叔,忒提斯是诸神之母。”还说“我正在到俄刻阿诺的深水伟流那里,的确流出了整个江湖,全体大洋和任何溪泉。”从最初自然文学家的合计中得以窥见神话史诗中的知识。神话史诗丰裕浮现了教育学从前的“传说构思”特征。古希腊(Ελλάδα)的神话是在爱琴文明时代逐步形成的,宗教神话、艺术法学观念由神话史诗的传播被古希腊(Ελλάδα)所承受。(伊多特蒙德特、奥德修)

3、
外来的东面文明传播的原则:数学(毕达哥拉斯)、天经济学、历史学、宗教从北部湾以东的东方文明,通过战争、商业贸易、民族迁徙大批量涌入希腊(Ελλάδα)地区。(简略)

图片 7


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图