Android 相关重难点知识整理
[原文]
集合
- 对
HashMap
进行排序:HashMap
本身无序,但其子类LinkedHashMap
使用链表结构,实现了有序。通过HashMap#entrySet()
方法可以将Map
转为Set<Entry>
,再在ArrayList
的构造函数中可以传入Collections
,正好Set
和List
的父类就是Collections
,这样就可以调用Collections.sort(list, comparator)
进行排序了。排序好后,使用for
遍历加入LinkedHashMap
。
引用类型
引用类型
强引用
String str = "abc";
- 1
- 1
软引用
SoftReference<String> soft = new SoftReference<String>(str);
- 1
- 1
弱引用
WeakReference<String> wek = new WeakReference<String>(str);
- 1
- 1
虚引用
PhantomReference
- 1
- 1
// 注意
String str = "abc"; // 常量池中
String str = new String("abc"); // 堆内存中- 1
- 2
- 3
- 1
- 2
- 3
对象可及性
强可及对象: 除非虚拟机OOM
,否则永远不会被回收
软可及对象: 系统内存不足时,被回收
弱可及对象: 当系统GC
发现发现该对象,就被回收
线程池
控制一个方法的并发数量限制
方法一,使用信号量
Semaphore
信号量,构造函数传入允许个数。Semaphore#acquire()
取得锁,Semaphore#release()
释放锁。方法二,使用线程池
Excutors.newFixedThreadPool(num);
- 1
- 1
手动实现线程池
new ThreadPoolExecutor(
int corePoolSize, // 核心池大小: 建议 CPU 个数+1
int maximumPoolSize, // 线程池最大容量
long keepAliveTime, // 任务执行完毕后释放延时
TimeUnit unit, // 时间的单位
BlockingQueue<Runnable> workQueue, // 工作队列
ThreadFactory threadFactory, // 将 Runnable 包装成线程的工厂
RejectedExecutionHandler handler)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 线程数总大小为 最大池大小(Thread)+队列(Runnable)
- 接口
BlockingQueue
是单端队列,BlockingDueue
是双端队列。对于单端队列,其子类有Array
和Linked
等,对于此处频繁增删的需求,使用LinkedBlockingQueue
更佳。 - 对于
i++
,要使用线程安全的AtomInteger#getAndIncrement()
方法
IOC (DI)
- IOC(DI) 概念
Inverse Of Controller,控制反转; Dependency Inject 依赖注入。 - ViewUtils框架,XUtils中的四大部分之一,使用到就是 IOC
- 自定义注解
- Target,注解类作用的对象,如FILED、METHOD等
- Retention,生命周期,SOURCE(源码中存在,编译成字节码被清除)、CLASS(字节码中存在,运行时被清除)、RUNTIME(运行期运行期有效,会被加载到虚拟机中)
- 定义体中,
value
作为默认变量名,如@XXX("abc")
- 反射
getFiled()
只能获取public
修饰的字段,通常使用getDeclaredFileld()
获取申明的字段- 设置字段的值先通过
DeclaredFiled#setAccessible(true)
暴力取得权限,再通过DeclaredField#set(user, name)
设置
Handler 机制
Handler
通常用于子线程给主线程发送消息Looper.prepare()
,创建Looper
,创建MessageQueue
,通过ThreadLocal
将Looper
与主线程绑定new Handler()
,从ThreadLocal
中取得Looper
,从Looper
中取得MessageQueue
的引用handler#sendMeessage()
,消息中添加msg.target=this
,然后放入MessageQueue
Looper#loop()
,循环取消息池,调用dispatchMessage()
Looper
需要调用Looper#quit()
终止
Fragment
Fragment
切换使用Fragment#hide()
和Fragment#show()
效率最高手动实现回退栈
- 每次替换
Fragment
的时候添加到List
if(list.contains(fragment)){
list.remove(fragment);
list.add(fragment);
}else {
list.add(fragment);
}- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
- 监听返回按钮
if(list.size() > 1){
list.remove(list.size()-1);
transcation
.hide(...)
.show(list.get(list.size()-1))
.commit();
}else {
finish();
}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 每次替换
图片处理
- ImageLoader
年限久,用户量大 - Glide
官方推荐使用,功能强大 - Picasso
热门,受欢迎 - Fresco
三级缓存,不能使用原生的控件
序列化
Serializable
是Java SE
实现的用于对象序列化的接口,Parcelable
是Android
推出的用于序列化的接口。Serializable
实现更简单,但性能不如Parcelable
transient
关键字用于保留字段不被序列化
Activity 保存
onSaveInstanceState()
是会在onStop()
前调用,用于保存Activity
的状态- 调用时机: 横竖屏切换、HOME键后台等,但按返回键将不会调用
自定义权限
- 在清单文件中
Activity
可设置属性permission
来自定义启用该活动所需要的权限,可以任意命名 - 自定义权限在使用的时候要先声明再使用:
// 声明权限
<permission android:name="com.xxx.xxx.AAA" />
// 使用权限
<use-permission android:name="com.xxx.xxx.AAA" />
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 四大组件都是可以声明自定义权限的
- 在广播接收者中,调用
sendBroadcast(intent, String permission)
指定权限,但仍然需要在清单文件中申明与使用,广播的自定义权限主要用于友方相互唤醒
Service
startService()
方式启动,Service
就一直在后台运行,与其他组件的生命周期无关,bindService()
方式启动,Activity
销毁时该Service
也同时销毁IntentService
用于执行较耗时的后台任务,执行完成后自动销毁
7.0 新特性
JIT
编译器: 安装速度提升75%
,并减少50%
的应用程序编译代码,并在同等CPU
性能从30%
提高到600%
,使用JIT
可以让用户安装程序、运行应用更快。Vulkan API
:Open GL
的下一个版本,Android 7.0
将支持相关API
- 多窗口模式: 可以分屏开多个多窗口
- 可回复通知: 通过
Notifiction.builder
中addAction()
可以设置回复 - 目录访问权限: 使用
StorageManager
访问目录,,,它将动态申请权限,而不需要在清单文件中申明权限 - 流量节省程序: 系统增加了一个全局的流量节省工具
ICU4J API
支持: 系统内置了该免费开源Unicode
工具库,不需要再在应用中集成Direct Boot
: 新的系统中应用可以申请在开机未解锁的情况下直接启动,比如微信、第三方的闹钟等VR
使用: 支持VR
应用程序编写,使用com.google.vr.sdk.widgets.pano.VrPanoramaView
控件和com.google.vr.sdk.widgets.pano.VrVideView
分别显示图片和视频
Android 相关重难点知识整理的更多相关文章
- 老猿Python重难点知识博文汇总
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 除了相关教程外,老猿在学习过程中还写了大量的学习随笔,内容比较杂,文章内容也参差不齐,为了方便,老猿 ...
- html和css的重难点知识
目录 html总难点总结: 1. 块级标签与内联标签的区别 1.1 块级标签: 1.2 内联标签: 2. 选择器 2.1 定义 2.2 选择器的分类 2.1 选择器的分类 3. css中margin, ...
- Android电源管理基础知识整理
前言 待机.睡眠与休眠的区别? Android开发者官网当中提到"idle states",该如何理解,这个状态会对设备及我们的程序造成何种影响? 进入Doze模式中的idle状态 ...
- C++重难点知识
1.顶层const和底层const const int a=10; int b=5; const int *p1=&a; int (*const)p2=&b; p1是顶层const,表 ...
- 这是一份非常适合收藏的Android进阶/面试重难点整理
写在前面 记得我大二时“不务正业”地自学Android并跟了老师做项目,到大三开始在目前的公司实习,至今毕业已有几年多,学习Android已经6.7年多了!但总感觉知识点很零散,并且不够深入,遇到瓶颈 ...
- Android 基本控件相关知识整理
Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户.作为一个程序员如何才能开发出友好的图形界 ...
- Android开发——Fragment知识整理(一)
0. 前言 Fragment,顾名思义是片段的意思,可以把Fragment当成Activity的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成.Fragment需要被嵌 ...
- android网络交互之DNS优化知识整理
android网络交互之DNS优化知识整理 之前的工作中,经常会遇到DNS解析出问题导致网络交互的操作无法正常进行. UnknownHostException 在很多的移动开发过程中,与服务端的交互的 ...
- Android开发——Fragment知识整理(二)
0. 前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...
随机推荐
- java的poi导入excel时解析日期
if (r.getCellType()==Cell.CELL_TYPE_NUMERIC){ if(HSSFDateUtil.isCellDateFormatted(r)){ //用于转化为日期格式 D ...
- POJ 2773 Happy 2006(容斥原理+二分)
Happy 2006 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10827 Accepted: 3764 Descr ...
- Subscription
- 【Python之路】第二十一篇--Memcached、Redis
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- caffe杂
一.finetune命令: mpirun /home/zhangsuosheng/caffe_mpi/build/tools/caffe train -solver solver.prototxt - ...
- Linux内核学习资料
1.为什么计算机的学生要学习Linux开源技术 http://tinylab.org/why-computer-students-learn-linux-open-source-technologie ...
- vuejs项目打包成APP后,首页不显示
- 002-docker安装-mac上安装docker,17.06在CentOS7 64位机器上安装
一.mac上安装docker 1.下载 通过这个链接下载:https://download.docker.com/mac/stable/Docker.dmg 2.安装 将 Moby 的鲸鱼图标拖拽到 ...
- Tornado模块分类
Tornado模块分类 1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 t ...
- sql join on 与where
转载:http://www.cnblogs.com/Jessy/p/3525419.html left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join : ...