前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >笔记——Android零碎知识摘录(一)

笔记——Android零碎知识摘录(一)

作者头像
木溪bo
发布2018-12-27 10:05:20
3650
发布2018-12-27 10:05:20
举报

《个人平时笔记,看到的同学欢迎指正错误》

1、android:exported属性:主要作用是:是否支持其它应用调用当前组件。默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。虽然说加了这个属性,能使其他的程序不能调用。但是,需要注意的是,如果两个程序的userid是一样的话,exported=”false“就没有用了。

2、Java中的简单类型从概念上分为四种:实数、整数、字符、布尔值。但是有一点需要说明的是,Java里面只有八种原始类型,其列表如下:

实数:double、float

整数:byte、short、int、long

字符:char

布尔值:boolean

复杂类型(对象类型)基本类型的内存模型本质上是不一样的,简单数据类型的存储原理是这样的:所有的简单数据类型不存在“引用”的概念,简单数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面只有这八种数据类型是这种存储模型;而其他的只要是继承于Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,基本类型是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。

Integer是int的封装类,里面有很多进行处理的静态方法

Integer是对象而int不是,内存的分配位置也不一样

Integer的属性和其他类一样的,在方法里都是引用传递;而基本类型int是值传递!

基本数据类型由于长度固定,且需要空间比较少,所以直接存储在栈中;而对象比较大,所以栈中只存储一个4btye的引用地址(逻辑地址)。

栈内存和堆内存区别:

>1.当定义一个变量时,java虚拟机就会在栈中为该变量分配内存空间,当该变量作用域结束后(使用完)后就会马上释放被系统分配给新的变量使用。 >2.如果java中是new的方式创建一个变量对象,就会在栈内存中存放对象的引用地址,对象值则存放于堆中,即使对象的作用域结束也不会立刻释放,直到系统GC回收

3、java反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。即:java在运行状态中反射知道一个类里面的所有方法和属性;通过反射获得对象后,能够调用对象的任意属性和方法。

java内省:内省基于反射实现,主要用于操作JavaBean,通过内省 可以获取bean的getter/setter,只要看到有getter或者setter就认为这个类有那么一个字段,比如看到getName() 内省就会认为这个类中有name字段,但事实上并不一定会有name。

java反射.png

4、并发与并行是基于硬件而言的。

并发,指的是多个事情,在同一时间段内同时发生了。指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。

并行,指的是多个事情,在同一时间点上同时发生了。指在同一时刻,有多条指令在多个处理器上同时执行。

并发的多个任务之间是互相抢占资源的->单cpu

并行的多个任务之间是不互相抢占资源的->多cpu

只有在多CPU的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。

并发与并行.png

5、Handler消息机制(深入探讨Android异步精髓Handler https://blog.csdn.net/lfdfhl/article/details/53332936#commentBox):每一个handler的创建都必须有Looper.prepare()->new Handler()->sendMessage()->MessageQueue->Looper.loop()->handlerMessage(),但是在UI线程是主线程中,系统会自动调用Looper.prepareMainLooper()方法创建主线程的Looper(Looper.prepare()与Looper.loop())和消息队列MessageQueue。

>1、Looper.prepare():在其内部源代码中,为每一个Looper.prepare()初始化一个消息集MessageQueue队列和一个线程Thread,这也是为什么很多人说的一个Handler只能持有一个MessageQueue的原因。并且由源码可知一个线程对应一个Looper也只有一个Looper.prepare(),否则会抛出异常。在prepare()内会调用sThreadLocal.set(new Looper(quitAllowed)),至于Looper,它在Android的消息机制中担负着消息轮询的职责,它会不间断地查看MessageQueue中是否有新的未处理的消息;若有则立刻处理,若无则进入阻塞

>2、sendMessage():调用handler.sendMessage()等方法发送消息,在其内部源码中都会调用enqueueMessage(MessageQueue queue, Message msg,long uptimeMillis)方法,并在其方法内部处理后调用queue.enqueueMessage(msg, uptimeMillis)方法将消息挤入消息集MessageQueue队列中,并且MessageQueue队列是遵从先进先出的原则。但是有个例外,如果调用handler.sendMessageAtFrontOfQueue()方法会直接将uptimeMillis入队列的延迟时间设置为0,所以会直接将Msg插入到消息插列头部。待取出消息时优先头部取出的。如果说为什么调用sendMessage()能够准确的发送到对应的handlerMessage()接收,那是因为在enqueueMessage(MessageQueue queue, Message msg,long uptimeMillis)方法内部已经为每一个msg指定了target标签,原文“msg.target =this;”。

>3、queue.enqueueMessage(msg, uptimeMillis):将消息发送到MessageQueue消息队列中,uptimeMillis是发送的延迟时间。

>4、Looper.loop():消息的出队执行者,在loop()内部会发起一个死循环不断遍历MessageQueue内部轮询,取出操作Message msg = queue.next(),直到消息不为空时,才调用msg.target.dispatchMessage(msg)将消息发送到熟悉的handleMessage(msg)中接收。在需要的时候调用quit()方法停止消息的轮询,此时next()会返回null,然后loop()方法也跟着退出。

>5、Handler在哪个线程创建,也就是运行于哪个线程,当handler发送消息到达Queue则此时也就切换了线程。

小结:

1.一个线程对应一个Looper 2.一个Looper对应一个消息队列 3.一个线程对应一个消息队列 4.线程,Looper,消息队列三者一一对应

6、泛型:

“ ? ”是通配符,泛指所有类型:一般用于定义一个引用变量,这么做的好处是,如下所示,定义一个sup的引用变量,就可以指向多个对象。

SuperClass<?> sup = new SuperClass<String>("lisi");       sup = new SuperClass<People>(new People());       sup = new SuperClass<Animal>(new Animal()); 若不用?,用固定的类型的话,则:  SuperClass<String> sup1 = new SuperClass<String>("lisi"); SuperClass<People> sup2 = new SuperClass<People>("lisi"); SuperClass<Animal> sup3 = new SuperClass<Animal>("lisi");

这就是?通配符的好处。

? extends T, ?是指T类型或T的子类型

? super T  ,?是指T类型或T的父类型

这个两个一般也是和?一样用在定义引用变量中,但是传值范围不一样

T和?运用的地方有点不同,?是定义在引用变量上,T是类上或方法上;如果有泛型方法和非泛型方法,都满足条件,会执行非泛型方法。

带不同泛型的ArrayList在编译后生成的Class是相同的!也就是说,泛型在编译生成字节码文件时会被”擦除”;不管ArrayList<E>带什么泛型,在编译后都是ArrayList所对应的字节码文件。

eg:

泛型擦除.png

7、Activity生命周期

activity.png

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档