Android+Java知识点总结-持续更新中(为了更好的自己)

来源:互联网 发布:宁波淘宝开店培训机构 编辑:程序博客网 时间:2024/05/16 13:04

本文系原创,如需转载请联系作者并请注明出处:http://blog.csdn.net/woshizisezise/article/details/52403692

前言:大家好,最近不管是看书也好,看博客也好,看到许多自己曾经看过但是可能时间久了有点记得不太清的内容,于是乎就想以后要是这种情况,现在何不随手记录下来呢,方便自己以后阅读回顾,同时也可以给大家提供帮助,所以在很长的一段时间内,我都会简短但是清楚的说明一个知识点,考虑到如果每个知识点都写的非常详细的话,篇幅会很长,并且查找起来也非常费力,所以如果有关的重点,我会单独的抽取出来详细讲解,本篇博客只为重点,谢谢大家!

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

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

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

进程和线程是包含与被包含的关系,一个进程中可以有一个线程(主线程)也可以有多个线程(多线程);

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

知识点5
使用多进程可能会造成以下问题:
1.静态成员和单例模式完全失效;
2.线程同步完全失效;
3.SharedPreferences可靠性下降;
4.Application会多次创建;

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

因此我们首选Parcelable方式实现序列化;

知识点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表示单位是spss.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之前已经确定下来了

持续更新中,欢迎关注……


如果你觉得我的文章对你有帮助,并且希望帮助更多人,欢迎分享并关注我的微信公众号“Android开发的奥秘”,或扫描识别下方的二维码,我会不定期的分享给大家更多有用的资讯,谢谢!
这里写图片描述

10 1