Android+Java知识点

转载:http://blog.csdn.net/woshizisezise/article/details/52403692php

知识点1
从activityA打开跳转到activityB,生命周期先执行的是activityA的onPause()方法,而后才走的activityB的onCreate()、onStart()、onResume()方法,最后才走的activityA的onStop()、onDestroy()方法;java

知识点2. 
若是为一个activity设置了launchMode为SingleTask模式的话,重复启动它并不会每次执行onCreate()方法(第一次除外),可是会每次执行onPause()、onNewIntent()、onResume()方法;mysql

知识点3 
线程和进程的区别是什么? 
线程:CPU调度的最小单元,是一种有限的系统资源; 
进程:通常指一个执行单元,在PC和移动设备上指一个程序或一个应用;android

进程和线程是包含与被包含的关系,一个进程中能够有一个线程(主线程)也能够有多个线程(多线程);程序员

知识点4 
Android中开启多进程只有一种方法,那就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidManifest.xml中指定android:process属性;web

知识点5 
使用多进程可能会形成如下问题: 
1.静态成员和单例模式彻底失效; 
2.线程同步彻底失效; 
3.SharedPreferences可靠性降低; 
4.Application会屡次建立;算法

知识点6 
Serializable和Parcelable的区别: 
Serializable:是Java中的序列化接口,使用简单可是开销大; 
Parcelable:是Android中的序列化方式,虽然使用起来麻烦一点,可是效率很高;sql

所以咱们首选Parcelable方式实现序列化;docker

知识点7 
RelativeLayout和LinearLayout绘制问题: 
RelativeLayout绘制时间比LinearLayout绘制时间稍长,由于RelativeLayout会进行两次的绘制工做,一次横向,一次纵向,而LinearLayout在没有设置weight属性的状况下只进行一次绘制,只有当设置了weight属性的状况下才会进行两次绘制,因此在绘制时间上,LinearLayout稍快。数据库

知识点8 
static只能用来修饰成员变量,不能修饰局部变量,编译时会报错,例以下列代码会报错:

public class Student{ public void study(){ static int num = 10; } }

知识点9 
java中四种访问控制级别: 
1.private(类访问级别):若是类的成员被private访问控制符修饰,则这个成员只能被该类的其它成员访问,其余类没法直接访问。类的良好封装性就是经过private关键字来实现的。 
2.default(包访问级别):若是一个类或者类的成员不使用任何访问控制修饰符,则称它为默认访问控制级别,这个类或者类的成员只能被本包中的其余类访问。 
3.protected(子类访问级别):若是一个类的成员被protected访问控制符修饰,那么这个成员既能被同一包下的其余类访问,也能被不一样包下该类的子类访问。 
4.public(公共访问级别):这是一个最宽松的访问控制级别,若是一个类或者类的成员被public访问控制符修饰,那么这个类或者类的成员能被全部的类访问,无论访问类与被访问类是否在同一个包中。

访问范围 private default protected public
同一类中 ☑️ ☑️ ☑️ ☑️
同一包中   ☑️ ☑️ ☑️
子类中     ☑️ ☑️
全局范围       ☑️

知识点10 
Collection有两个重要的子接口,分别是List和Set,其中List的特色是元素有序,元素可重复。Set的特色是元素无序且不可重复。List接口的主要实现类有ArrayList和LinkedList,Set接口的主要实现类有HashSet和TreeSet。

知识点11 
因为ArrayList集合的底层是使用一个数组来保存元素,在增长或删除指定位置的元素时,会致使建立新的数组,效率比较低,所以不适合作大量的增删操做。可是这种数组的结构容许程序经过索引的方式来访问元素,所以使用ArrayList集合查找元素和便捷。

知识点12 
LinkedList集合内部维护了一个双向循环列表,链表中的每个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而能够将全部的元素彼此连接起来。当插入一个新元素时,只须要修改元素之间的这种引用关系便可,删除一个节点也是如此。正由于这样的存储结构,因此LinkedList集合对于元素的增删操做具备很高的效率。

知识点13 
常见的内存泄漏 : 
1.查询数据库没有关闭Cursor。 
2.使用BaseAdapter做为适配器时没有复用convertView。 
3.bitmap没有回收。 
4.注册对象后没有反注册,好比Broadcast Receiver等。 
5.handler问题,若是handler是非静态的,会致使Activity或者Service不被回收,因此应当注册为静态内部类,同时在onDestroy时中止线程:mThread.getLooper().quit()。 
6.Activity被静态引用,特别是缓存bitmap时,解决方法能够考虑使用Application的context代替Activity的context。 
7.View在callback中被引用,可能回调尚未结束,可是view处于引用状态,没法回收。 
8.WebView的泄露问题:在魅族上面发现webView打开再关闭就会内存泄露。目前使用的解决方法是在webview外面嵌套一层layout做为Container.在Activity的onDestroy中调用container.removeAllViews()方法。 
9.Dialog致使Window泄露,若是须要在dialog依附的Activity销毁前没有调用dialog.dismiss()会致使Activity泄露 。 
10.若是还有其余的,欢迎补充!

知识点14 
安卓xml绘制虚线:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line"> <!-- 显示一条虚线,破折线的宽度为dashWith,破折线之间的空隙的宽度为dashGap,当dashGap=0dp时,为实线 --> <stroke android:width="1dp" android:color="#D5D5D5" android:dashWidth="2dp" android:dashGap="3dp" /> <!-- 虚线的高度 --> <size android:height="2dp" /> </shape> 

知识点15 
ExpandableListView 的子列表不能点击(禁用)要把 Adapter 的 isChildSelectable 方法返回 true。

知识点16 
什么叫垃圾回收机制? 
垃圾回收是一种动态存储管理技术,它自动地释放再也不被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。当一个对象再也不被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用,以避免形成内存泄露。

知识点17 
java的垃圾回收有什么特色? 
JAVA语言不容许程序员直接控制内存空间的使用。内存空间的分配和回收都是由JRE负责在后台自动进行的,尤为是无用内存空间的回收操做(garbagecollection,也称垃圾回收),只能由运行环境提供的一个超级线程进行监测和控制。

知识点18 
垃圾回收器何时会运行? 
通常是在CPU空闲或空间不足时自动进行垃圾回收,而程序员没法精确控制垃圾回收的时机和顺序等。

知识点19 
垃圾回收器是怎样工做的? 
垃圾回收器如发现一个对象不能被任何活线程访问时,他将认为该对象符合删除条件,就将其加入回收队列,但不是当即销毁对象,什么时候销毁并释放内存是没法预知的。垃圾回收不能强制执行,然而Java提供了一些方法(如:System.gc()方法),容许你请求JVM执行垃圾回收,而不是要求,虚拟机会尽其所能知足请求,可是不能保证JVM从内存中删除全部不用的对象。

知识点20 
如何显示的使对象符合垃圾回收条件? 
1.空引用:当对象没有对他可到达引用时,他就符合垃圾回收的条件。也就是说若是没有对他的引用,删除对象的引用就能够达到目的,所以咱们能够把引用变量设置为null,来符合垃圾回收的条件。

StringBuffer sb = new StringBuffer("hello"); System.out.println(sb); sb=null;

2.从新为引用变量赋值:能够经过设置引用变量引用另外一个对象来解除该引用变量与一个对象间的引用关系。

StringBuffer sb1 = new StringBuffer("hello"); StringBuffer sb2 = new StringBuffer("goodbye"); System.out.println(sb1); sb1=sb2;//此时"hello"符合回收条件 

3.方法内建立的对象:所建立的局部变量仅在该方法的做用期间内存在。一旦该方法返回,在这个方法内建立的对象就符合垃圾收集条件。有一种明显的例外状况,就是方法的返回对象。

public static void main(String[] args) { Date d = getDate(); System.out.println("d = " + d); } private static Date getDate() { Date d2 = new Date(); StringBuffer now = new StringBuffer(d2.toString()); System.out.println(now); return d2; }

4.隔离引用:这种状况中,被回收的对象仍具备引用,这种状况称做隔离岛。若存在这两个实例,他们互相引用,而且这两个对象的全部其余引用都删除,其余任何线程没法访问这两个对象中的任意一个。也能够符合垃圾回收条件。

public class Island { Island i; public static void main(String[] args) { Island i2 = new Island(); Island i3 = new Island(); Island i4 = new Island(); i2.i=i3; i3.i=i4; i4.i=i2; i2=null; i3=null; i4=null; } }

知识点21 
垃圾收集前进行清理——finalize()方法 java提供了一种机制,使你可以在对象刚要被垃圾回收以前运行一些代码。这段代码位于名为finalize()的方法内,全部类从Object类继承这个方法。因为不能保证垃圾回收器会删除某个对象。所以放在finalize()中的代码没法保证运行。所以建议不要重写finalize()。

知识点22 
定义字符串应该尽可能使用 String str=”hello”; 的形式 ,避免使用String str = new String(“hello”); 的形式。由于要使用内容相同的字符串,没必要每次都new一个String。 
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,而且没有意义,由于String对象不可改变,因此对于内容相同的字符串,只要一个String对象来表示就能够了。也就说,屡次调用上面的构造器建立多个对象,他们的String类型属性s都指向同一个对象。

知识点23 
尽可能避免在类的构造函数里建立、初始化大量的对象 ,防止在调用其自身类的构造器时形成没必要要的内存资源浪费,尤为是大对象,JVM会忽然须要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,并且申请数量还极大。

知识点24 
碰到一个需求,EditText默认的hint文字大小为12sp,当有文字填写时,文字大小变为18sp,在xml文件中没法实现,只能经过下列java代码实现:

etPhone = (EditText) findViewById(R.id.msg_phone);
SpannableString ss = new SpannableString("请填写已经注册的手机号码");//定义hint的值 AbsoluteSizeSpan ass = new AbsoluteSizeSpan(12, true);//设置字体大小 true表示单位是sp ss.setSpan(ass, 0, ss.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); etPhone.setHint(new SpannedString(ss));

知识点25 
关于Toast的优化: 
若是每次都使用Toast.makeText(context,content,Toast.LENGTH_SHORT).show();来给出吐司提示的话,当你在短期内不断点击,中止点击后会发现吐司会停留很长的一段时间,这是由于每次点击都是从新建立了一个Toast,因此这种作法会给用户形成较差的用户体验,那么正确的作法应该以下:

public class ToastUtils { private static Toast toast; public static void toast(Context cxt, String str) { if (toast == null) { toast = Toast.makeText(cxt, str, Toast.LENGTH_SHORT); } else { toast.setText(str); } toast.show(); } }

知识点26 
OkHttp和Volley的有什么区别?

  • OkHttp

1.占用储存空间

使用OkHttp须要 okio.jar (80k), okhttp.jar(330k)这2个jar包,总大小差很少400k,加上本身的封装,差很少得410k。

2.功能介绍

Square 公司开源的 OkHttp 是一个专一于链接效率的 HTTP 客户端。OkHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了链接池,GZIP 压缩和 HTTP 响应缓存功能。

3.优势

支持http请求,https请求。

支持文件下载。

使用的是HttpURLConnection,不要担忧android版本的变换。(至少目前是都支持的)。

支持get,post请求。

基于Http的文件上传。

加载图片。

4.缺点

好比callback回来是在线程里面, 不能刷新UI,须要咱们手动处理。封装比较麻烦。

  • Volley

1.占用储存空间

使用Volley 须要Volley.jar(120k),加上本身的封装最多140k。

2.功能介绍

Volley是Goole在2013年Google I/O大会上推出了一个新的网络通讯框架,它是开源的。Volley 的特色:特别适合数据量小,通讯频繁的网络操做。

3.优势

很是适合进行数据量不大,但通讯频繁的网络操做。

内部分装了异步线程。

支持get,post网络请求。

图片下载。

可直接在主线程调用服务端并处理返回结果。

能够取消请求,容易扩展,面向接口编程。

4.缺点

对大文件下载 Volley的表现很是糟糕。

只支持http请求。

在BasicNetwork中判断了statusCode(statusCode < 200 || statusCode > 
299),若是符合条件直

接图片加载,性能通常。

使用的是httpclient,HttpURLConnection。不过在android 
6.0不支持httpclient了,若是想支持得添加org.apache.http.legacy.jar。

  • 总结

在咱们平时的项目使用volley就能够了,相对okhttp,volley很是稳定。Okhttp通常混合来用,可以胜任相对复杂的需求。现在,在AndroidStudio中,网络请求仍是推荐使用Retrofit2+okhttp。

知识点27 
Toast能够经过如下方法改变显示的位置:

Toast toast = Toast.makeText(MainActivity.this,"Bottom Right",Toast.LENGTH_SHORT); toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT,0,0); toast.show();

知识点28 
在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式。

SAX: 是事件驱动型XML解析的一个标准接口,简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数作相应动做,而后继续一样的扫描,直至文档结束。

DOM:即对象文档模型,它是将整个XML文档载入内存(因此效率较低,不推荐使用),使用DOM API遍历XML树、检索所需的数据,每个节点当作一个对象。

Pull:运行方式与 SAX 解析器类似。它提供了相似的事件,SAX解析器的工做方式是自动将事件推入事件处理器进行处理,所以你不能控制事件的处理主动结束;而Pull解析器的工做方式为容许你的应用程序代码主动从解析器中获取事件,正由于是主动获取事件,所以能够在知足了须要的条件后再也不获取事件,结束解析。pull是一个while循环,随时能够跳出,而sax是只要解析了,就必须解析完成。

知识点29 
try catch finally,try里有return,finally还执行么?

Condition 1: 若是try中没有异常且try中有return (执行顺序)

try —- finally — return

Condition 2: 若是try中有异常而且try中有return

try—-catch—finally— return

总之 finally 永远执行!

Condition 3: try中有异常,try-catch-finally里都没有return ,finally 以后有个return

try—-catch—finally

try中有异常之后,根据java的异常机制先执行catch后执行finally,此时错误异常已经抛出,程序因异常而终止,因此你的return是不会执行的

Condition 4: 当 try和finally中都有return时,finally中的return会覆盖掉其它位置的return(多个return会报unreachable code,编译不会经过)。

Condition 5: 当finally中不存在return,而catch中存在return,但finally中要修改catch中return 的变量值时

int ret = 0; try{ throw new Exception(); } catch(Exception e) { ret = 1; return ret; } finally{ ret = 2; } 

最后返回值是1,由于return的值在执行finally以前已经肯定下来了

相关文章
相关标签/搜索