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,然后放入MessageQueueLooper#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实现更简单,但性能不如Parcelabletransient关键字用于保留字段不被序列化
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,回退栈的应用等知识.这 ...
随机推荐
- oracle 网络访问配置tnsnames.ora文件的路径
转自:https://blog.csdn.net/jaray/article/details/22379811 oracle 网络访问配置tnsnames.ora文件的路径 oracle 9i 是: ...
- 爬虫实战【11】Python获取豆瓣热门电影信息
之前我们从猫眼获取过电影信息,而且利用分析ajax技术,获取过今日头条的街拍图片. 今天我们在豆瓣上获取一些热门电影的信息. 页面分析 首先,我们先来看一下豆瓣里面选电影的页面,我们默认选择热门电影, ...
- (转)HTTP
HTTP(Hyper Text Transfer Protocol)超文本传输协,是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型. HTTP特点: 支持客户 / 服务器模式 简单快速 ...
- POJ 2253 Frogger【最短路变形——路径上最小的最大权】
链接: http://poj.org/problem?id=2253 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- Powershell About Active Directory Server
一.获取域控制器服务器清单 (Get-ADForest).Domains | %{ Get-ADDomainController -Filter * -Server $_ } | select hos ...
- Java 之异常
异常概述 异常: 是在运行时期发生的不正常情况. 在 java 中用类的形式对不正常情况进行了描述和封装. 描述不正常情况的类, 就称为异常类. 异常体系 父类: Throwable (JDK 文档) ...
- 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理
一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...
- MariaDB备份和恢复
一.为什么要备份? 灾难恢复:硬件故障.软件故障.自然灾害.黑客攻击.误操作: 测试二.要注意的要点: 能容忍最多丢失多少数据: 恢复数据需要多长时间内完成: 需要恢复哪些数据: (1)做还原测试,用 ...
- Spring 数据库连接池读取系统环境变量作为参数
原来是写在一个properties文件里面,后来项目要部署的的确太多了,每次更改不太方便,就想把这些固定不变的信息写在当地的环境变量里面 原先是这样的:引用的所有信息在jdbc.properties ...
- dedecms中的内容页中的变量
{dede:php runphp='yes'} var_dump($refObj->Fields); {/dede:php}