个人整理2017.6

1.屏幕适配相关, sw820dp 表示最小宽度820或以上时使用,屏幕旋转后则算旋转后的宽度 s820dp 表示最小宽度820或以上时使用,跟屏幕旋转无关,算的是短的那条边 h820dp 表示最小宽度820或以上时使用,跟屏幕旋转无关,算的是长的那条边


2./t相当于键盘的Tab键,/n换行New Line,/r回车Carriage Return,基本的概念应该是回车表示回到最前面,换行表示换一行。 操作系统的不同,换行符操也不同: /r Mac /n Unix/Linux /r/n Windows
3.(byte)0xff 是-1,0xff 是255 因为byte的值域是-128~127
4.原型模式中的拷贝分为”浅拷贝”和”深拷贝”: 浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象. 深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
5.学习调用系统的主题中的字体颜色等
6.一直以来,Dalvik虚拟机背负着Android应用卡顿的罪名,原因则是应用在运行的过程中,虚拟机Dalvik通过一个叫JIT(Just-in-time)的解释器动态的进行编译并执行,这一过程也拖慢了运行效率。而在5.0版本中,原有的Dalvik虚拟机被新的ART虚拟机代替。 Android Runtime(缩写为 ART),是一种在Android操作系统上的运行环境,由Google公司研发。ART能够把应用程序的字节码转换为机器码,是Android所使用的一种新的虚拟机。它与Dalvik的主要不同在于:Dalvik采用的是JIT技术,而ART采用Ahead-of-time(AOT)技术,也就是预编译技术,安装应用的时候,代码中的字节码将被编译成机器码。而由于有了机器码,下次打开的时候就不需要再编译了,这就提高了运行效率,APP启动速度明显加快。ART同时也改善了性能、垃圾回收(Garbage Collection)、提高续航能力、应用程序除错以及性能分析。
7.模板是指施工时浇筑混凝土用的成组模型板,或者是铸造时放模型和砂箱用的底板,一般是实体性。 模版比较虚体的,比如网页,而这个工作报告就是这类型的,所以应该用模版
8.相比于if-else结构,switch的效率绝对是要高很多的,但是switch使用查找表的方式决定了case的条件必须是一个连续的常量或字符串。而if-else则可以灵活的多。 switch的效率与分支数无关。当只有分支比较少的时候,if效率比switch高(因为switch有跳转表)。分支比较多,那当然是使用switch。
9.反射虽然很灵活,能够使得写的代码,变的大幅精简,所以在用的时候,一定要注意具体的应用场景,反射的优缺点如下:
优点
能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
与Java动态编译相结合,可以实现无比强大的功能
缺点
使用反射的性能较低
使用反射相对来说不安全
破坏了类的封装性,可以通过反射获取这个类的私有方法和属性
10\
接口回调, 是Java 多态的一种体现, 可以把使用某一接口的实现类创建的对象的引用, 赋给该接口声明的接口变量中, 那么该接口变量就可以调用被实现的接口中的方法, 当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法.
观察者模式, 是将观察者和被观察的对象分离开, 当被观察的对象产生一定变化的时候, 观察者就会根据哪里产生的变化, 产生了变化, 而进行相应的处理. 大部分观察着模式是用接口回调的方法来实现的.
前者是一种体现, 后者是一种用前者实现的模式, 相当于后者调用前者, 他们两个没有可以比较的地方
11.fragment默认是api11(Android3.0)以上才支持的,v4包可以兼容api4~12的
12.static变量是不会被回收的(Java垃圾回收的意思是回收内存,是内存不再被引用。一是按被引用方式来回收,一是按可达性来回收),就算手动=null,也不会回收,因为内存仍被引用,只是内存存储的对象为null而已
13.ACM PAT要研究
14.背7000单词约可理解90%英语内容
15\
String 字符串常量(线程安全,或者说不涉及安全问题,因为返回的是new Sting)
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
比如拼接字符串频繁的操作 如读取网页数据,就推荐用StringBuilder,因为用String会创建很多String对象,对资源浪费。 而StringBuilder只会创建一个对象,所有的拼接操作都是在一个对象里完成了,节省内存
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的: String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”); 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个 String S1 = “This is only a” + “ simple” + “test”; 其实就是: String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如: String S2 = “This is only a”; String S3 = “ simple”; String S4 = “ test”; String S1 = S2 +S3 + S4; 这时候 JVM 会规规矩矩的按照原来的方式去做
在大部分情况下 StringBuffer > String
16.几种解析技术的比较与总结: 对于Android的移动设备而言,因为设备的资源比较宝贵,内存是有限的,所以我们需要选择适合的技术来解析XML,这样有利于提高访问的速度。 DOM在处理XML文件时,将XML文件解析成树状结构并放入内存中进行处理。当XML文件较小时,我们可以选DOM,因为它简单、直观。 SAX则是以事件作为解析XML文件的模式,它将XML文件转化成一系列的事件,由不同的事件处理器来决定如何处理。XML文件较大时,选择SAX技术是比较合理的。虽然代码量有些大,但是它不需要将所有的XML文件加载到内存中。这样对于有限的Android内存更有效,而且Android提供了一种传统的SAX使用方法以及一个便捷的SAX包装器。 使用Android.util.Xml类,从示例中可以看出,会比使用 SAX来得简单。 XML pull解析并未像SAX解析那样监听元素的结束,而是在开始处完成了大部分处理。这有利于提早读取XML文件,可以极大的减少解析时间,这种优化对于连接速度较漫的移动设备而言尤为重要。对于XML文档较大但只需要文档的一部分时,XML Pull解析器则是更为有效的方法。
17.关于Dalvik虚拟机和ART虚拟机。Dalvik是当我们安装apk时,将Java字节码存储在手机中,而每次新运行软件时,会将Java字节码再翻译成机器码(二进制01)来运行,所以启动软件较慢,而ART虚拟机时安装应用的时候,就会将字节码翻译成二进制码保存到手机中,所以每次新运行的时候都是直接运行二进制,省去了翻译的过程,所以启动软件很快。但缺点缺点时安装时比较慢(因为多了一个Java字节码翻译成机器码的过程),还有占用手机内存空间相对要大一些(相同的代码用二进制表示的字符串要比十六进制?大一些) Java字节码是十六进制?
18.可以看到Android上层的Application和ApplicationFramework都是使用Java编写, 底层包括系统和使用众多的Libraries都是C/C++编写的。 Android底层是Linux内核驱动层,往上是Android运行库层,包括ART虚拟机,媒体库数据库等运行库。再往上是应用框架层,包括四大组件,View等, 最后就是我们的应用层了
19.搜索技巧,找指定域名下的,如谷歌没有 去bing baidu搜索试试 android主线程更新UI site:http://blog.csdn.net/
20.一.在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。 同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需要长时间运行的情况下使用线程。 二.如果任务占用CPU时间多,资源大的情况下,要使用线程。
既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。
举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。
21.IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务
22.我们要在内部重写需要的接口的方法,这样就new出了一个实现接口 方法的对象,但是这个对象的类名不可见,所以叫做匿名类。
23、目前,使用内容提供器是Android实现跨程序共享数据的标准方式。不同于文件存储和SharedPreferences存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不会有泄漏的风险。 内容提供器的用法一般有两种, 一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给应用程序的数据提供外部访问接口。
24.手机OTA升级是不需要连接电脑的,其英文Over-the-Air已经解释了,是不通过数据线连接的方式实现手机系统的升级的。用过iphone手机的朋友应该都操作过OTA升级,其实就是平时手机提醒你可以升级iOS系统时,你直接的手机无线升级。
25.targetSDK23及以上时,需要写动态申请权限的代码,否则用户没有给权限的话会报错。也可以把targetSDK写22就没事?建议还是要写好动态权限申请
26.android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。 一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中; 2.通过序列化对象在网络中传递对象; 3.通过序列化在进程间传递对象。
27 至于选取哪种可参考下面的原则:
在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
28、在android中最典型的MVC就是listview的显示 M:model指你要显示的数据,如封装数据的cursor,array等等 V:view:就是listView用来显示封装好的数据 C:controller:就是adaptor,用来控制数据如何向listview中显示,如arrayadaptor,cursoradaptor等等
29、final变量,表示该变量一旦被分配内存空间就必须初始化并且以后不可变; static 如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象
30、sharedPreference的edit下的提交方法apply和commit区别 这两个方法的区别在于:
apply没有返回值而commit返回boolean表明修改是否提交成功
apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
apply方法不会提示任何失败的提示。 由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要用commit的。
31、方法里面不能有方法,房子里面不能再建造房子。 类里面可以写方法。 如果方法里也能写方法,那么方法和类的区别在哪?方法里面不能在定义(嵌套)一个方法
32\在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。 具体作用: 1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入; 2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。?
33 总的来说: 面向对象是将事物高度抽象化。 面向过程是一种自顶向下的编程 面向对象必须先建立抽象模型,之后直接使用模型就行了。 面向对象和面向过程的比较   在我们将面向过程和面向对象讨论完后,会明显的感觉两者之间有着很大的区别。面向过程简单直接,易于入门理解,模块化程度较低。而面向对象相对于面向过程较为复杂,不易理解,模块化程度较高。可总结为下面三点: 都可以实现代码重用和模块化编程,但是面对对象的模块化更深,数据更封闭,也更安全!因为面向对象的封装性更强! 面对对象的思维方式更加贴近于现实生活,更容易解决大型的复杂的业务逻辑 从前期开发角度上来看,面对对象远比面向过程要复杂,但是从维护和扩展功能的角度上来看,面对对象远比面向过程要简单!
34、用Sublime Text编辑器可以直接查看java的.class字节码文件,十六进制的格式
35、java分32,64,但这是jvm的事,你在32或64上写的代码都通用,因为JVM所以我们的java程序有平台无关性
36、VCS:Version Control System ,常用的有SVN和Git, 在AS的VersionControl中 右上角+添加SVN即可(首先要安装SVN)
37、主题编辑器,在style右上角点击即可进入界面化编辑 38 那问题来了,一旦入门后,如何得到一个更有激励性质的正反馈呢? 依然是定一个目标,定一个你从未尝试或达到过的目标,让新的目标去刺激你的多巴胺和肾上腺素,让你对某一个东西、技术产生持续的亢奋,从而无形中成为终生学习者。 对于技术人来说,新的目标可以是做一个解决自己生活中遇到问题的小产品,努力做到 1000 日活,做一个开源项目,努力得到 1000 个 Star,做一个小工具,努力赚到 1000 人民币,做一个小社群,努力拥有 1000 个注册用户,或者开一篇博客,写一个公众号,努力做到 1000 阅读。

发表评论

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