[原文]

集合

  1. 对 HashMap 进行排序: HashMap 本身无序,但其子类 LinkedHashMap 使用链表结构,实现了有序。通过 HashMap#entrySet() 方法可以将 Map 转为 Set<Entry> ,再在 ArrayList 的构造函数中可以传入 Collections ,正好 Set 和 List 的父类就是 Collections ,这样就可以调用 Collections.sort(list, comparator) 进行排序了。排序好后,使用 for 遍历加入 LinkedHashMap 。

引用类型

  1. 引用类型

    • 强引用

      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
  2. 对象可及性 
    强可及对象: 除非虚拟机 OOM ,否则永远不会被回收 
    软可及对象: 系统内存不足时,被回收 
    弱可及对象: 当系统 GC 发现发现该对象,就被回收

线程池

  1. 控制一个方法的并发数量限制

    • 方法一,使用信号量 
      Semaphore 信号量,构造函数传入允许个数。 
      Semaphore#acquire() 取得锁, Semaphore#release() 释放锁。

    • 方法二,使用线程池

      Excutors.newFixedThreadPool(num);
      
      • 1
      • 1
  2. 手动实现线程池

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)

  1. IOC(DI) 概念 
    Inverse Of Controller,控制反转; Dependency Inject 依赖注入。
  2. ViewUtils框架,XUtils中的四大部分之一,使用到就是 IOC
  3. 自定义注解 
    • Target,注解类作用的对象,如FILED、METHOD等
    • Retention,生命周期,SOURCE(源码中存在,编译成字节码被清除)、CLASS(字节码中存在,运行时被清除)、RUNTIME(运行期运行期有效,会被加载到虚拟机中)
    • 定义体中, value 作为默认变量名,如 @XXX("abc")
  4. 反射 
    • getFiled() 只能获取 public 修饰的字段,通常使用 getDeclaredFileld() 获取申明的字段
    • 设置字段的值先通过 DeclaredFiled#setAccessible(true) 暴力取得权限,再通过 DeclaredField#set(user, name) 设置

Handler 机制

  1. Handler 通常用于子线程给主线程发送消息
  2. Looper.prepare(),创建 Looper ,创建 MessageQueue ,通过 ThreadLocal 将 Looper 与主线程绑定
  3. new Handler(),从 ThreadLocal 中取得 Looper,从 Looper 中取得 MessageQueue 的引用
  4. handler#sendMeessage(),消息中添加 msg.target=this,然后放入 MessageQueue
  5. Looper#loop(),循环取消息池,调用 dispatchMessage()
  6. Looper 需要调用 Looper#quit() 终止

Fragment

  1. Fragment 切换使用 Fragment#hide() 和 Fragment#show() 效率最高
  2. 手动实现回退栈

    • 每次替换 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 
    三级缓存,不能使用原生的控件

序列化

  1. Serializable 是 Java SE 实现的用于对象序列化的接口, Parcelable 是 Android 推出的用于序列化的接口。 Serializable 实现更简单,但性能不如 Parcelable
  2. transient 关键字用于保留字段不被序列化

Activity 保存

  1. onSaveInstanceState() 是会在 onStop() 前调用,用于保存 Activity 的状态
  2. 调用时机: 横竖屏切换、HOME键后台等,但按返回键将不会调用

自定义权限

  1. 在清单文件中 Activity 可设置属性 permission 来自定义启用该活动所需要的权限,可以任意命名
  2. 自定义权限在使用的时候要先声明再使用:
 // 声明权限
<permission android:name="com.xxx.xxx.AAA" />
// 使用权限
<use-permission android:name="com.xxx.xxx.AAA" />
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
  1. 四大组件都是可以声明自定义权限的
  2. 在广播接收者中,调用 sendBroadcast(intent, String permission) 指定权限,但仍然需要在清单文件中申明与使用,广播的自定义权限主要用于友方相互唤醒

Service

  1. startService() 方式启动,Service 就一直在后台运行,与其他组件的生命周期无关,bindService() 方式启动,Activity 销毁时该 Service 也同时销毁
  2. IntentService 用于执行较耗时的后台任务,执行完成后自动销毁

7.0 新特性

  1. JIT 编译器: 安装速度提升 75%,并减少 50% 的应用程序编译代码,并在同等 CPU 性能从 30% 提高到 600%,使用 JIT 可以让用户安装程序、运行应用更快。
  2. Vulkan APIOpen GL 的下一个版本,Android 7.0 将支持相关 API
  3. 多窗口模式: 可以分屏开多个多窗口
  4. 可回复通知: 通过 Notifiction.builder 中 addAction() 可以设置回复
  5. 目录访问权限: 使用 StorageManager 访问目录,,,它将动态申请权限,而不需要在清单文件中申明权限
  6. 流量节省程序: 系统增加了一个全局的流量节省工具
  7. ICU4J API 支持: 系统内置了该免费开源 Unicode 工具库,不需要再在应用中集成
  8. Direct Boot: 新的系统中应用可以申请在开机未解锁的情况下直接启动,比如微信、第三方的闹钟等
  9. VR 使用: 支持 VR 应用程序编写,使用 com.google.vr.sdk.widgets.pano.VrPanoramaView 控件和 com.google.vr.sdk.widgets.pano.VrVideView 分别显示图片和视频

Android 相关重难点知识整理的更多相关文章

  1. 老猿Python重难点知识博文汇总

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 除了相关教程外,老猿在学习过程中还写了大量的学习随笔,内容比较杂,文章内容也参差不齐,为了方便,老猿 ...

  2. html和css的重难点知识

    目录 html总难点总结: 1. 块级标签与内联标签的区别 1.1 块级标签: 1.2 内联标签: 2. 选择器 2.1 定义 2.2 选择器的分类 2.1 选择器的分类 3. css中margin, ...

  3. Android电源管理基础知识整理

    前言 待机.睡眠与休眠的区别? Android开发者官网当中提到"idle states",该如何理解,这个状态会对设备及我们的程序造成何种影响? 进入Doze模式中的idle状态 ...

  4. C++重难点知识

    1.顶层const和底层const const int a=10; int b=5; const int *p1=&a; int (*const)p2=&b; p1是顶层const,表 ...

  5. 这是一份非常适合收藏的Android进阶/面试重难点整理

    写在前面 记得我大二时“不务正业”地自学Android并跟了老师做项目,到大三开始在目前的公司实习,至今毕业已有几年多,学习Android已经6.7年多了!但总感觉知识点很零散,并且不够深入,遇到瓶颈 ...

  6. Android 基本控件相关知识整理

    Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户.作为一个程序员如何才能开发出友好的图形界 ...

  7. Android开发——Fragment知识整理(一)

    0.  前言 Fragment,顾名思义是片段的意思,可以把Fragment当成Activity的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成.Fragment需要被嵌 ...

  8. android网络交互之DNS优化知识整理

    android网络交互之DNS优化知识整理 之前的工作中,经常会遇到DNS解析出问题导致网络交互的操作无法正常进行. UnknownHostException 在很多的移动开发过程中,与服务端的交互的 ...

  9. Android开发——Fragment知识整理(二)

    0.  前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...

随机推荐

  1. storyboard设置navigation controller

    到storyboard选中我们唯一一个的viewcontroller,找到xcode的菜单栏,Edit->Embed In->NavigationController.这时候storybo ...

  2. 关于Z序的总结

    //转自:http://blog.csdn.net/flowshell/article/details/4797917 Z 序:一个重叠窗口的堆,每个窗口在Z 序中 都有唯一一个位置.一个窗口的Z 序 ...

  3. 用jQuery的attr()设置option默认选中无效的解决 attr设置属性失效

    表单下拉选项使用selected设置,发现第一次默认选中成功,在页面不刷新的情况下,再次下拉,selected属性设置了,默认选中不生效 在手机端有些浏览器用jQuery的attr()方法设置sele ...

  4. Oracle database精装版11gR2入门详细连接教程

    对于11g本身比较简单,适合学习者使用,对电脑要求相对较低. 自己一个人单机学习使用. 工具/原料   Oracle Database Express Edition 11g Release 2安装包 ...

  5. pycharm调试

    pycharm调试 flask app调试: 1.打开edit configurations面板 run===>edit configurations(图一或图二处都可以) 2.配置项目信息 点 ...

  6. 003-spring结合java类调用quartz

    一.利弊 针对001 中设置,不方便程序中动态添加任务,只能使用配置进行配置任务, 适用于已知固定时刻需要执行的任务. 针对002中设置,不方便结合调用spring注入的实体 使用于程序内部新增添的任 ...

  7. xcode中全文查询某个中文字

    查询所有中文 [^"]*[\u4E00-\u9FA5]+[^"\n]*? 查询某个中文字“中”字 [^"]*[\u4e2d]+[^"\n]*? 中文字转成uni ...

  8. Django项目在nginx上面的部署(django+flup+nginx)

    首先说下需要用到的软件1.python环境因为我用的centos6.2 上面自带了python2.6.6的环境.所以就可以不用安装了.2.Django环境我们这里用easy_install的方式来安装 ...

  9. NUnit.Framework的使用方法演示

    using NUnit.Framework; namespace CheckExcel { [TestFixture] public class TestExcelHelper { /// <s ...

  10. [转]C#读写远程共享文件夹

    1.在服务器设置一个共享文件夹,在这里我的服务器ip地址是10.200.8.73,共享文件夹名字是share,访问权限,用户名是administrator,密码是11111111. 2.新建一个控制台 ...