Android知识点汇总_android知识点梳理-程序员宅基地

技术标签: android  Android  

目录

目录

Java

Android重要知识模块

网络

数据库

架构设计和设计模式

注解与事件总线框架

设计模式

性能优化

模块化与更新

JNI

JNI注册方式

C调用JAVA

System.loadLibrary原理

系统开发相关

开发相关问题


Java

Java基础知识总结

 数据结构与算法总结

Android重要知识模块

Android基础知识总结

Android Framework知识总结

Android 架构

Android各版本特性

网络

Android网络开发学习总结

数据库

  1. sqlite升级:涉及表和字段。表和字段的新增与删除能直接修改,字段不支持直接修改,需要通过中间文件做转换。
  2. 数据库框架对比和源码分析:如LiteOrm、GreenDao、Realm等。
  3. 数据库的优化:a.使用索引;b.语句的拼接使用StringBuilder代替String;c.查询时返回更少的结果集及更少的字段;d.少用cursor.getColumnIndex;e.异步线程;
  4. 数据库数据迁移问题:创建临时表做中转。
  5. 如何导入外部数据库:1. 把原数据库包括在项目源码的 res/raw 目录下,2.在进入应用时,若data/data下没有数据库,则用写文件的方式把数据库拷入,若已有则直接打开。

sharepreferences 是进程同步的吗?有什么方法做到同步?不是,其是单文件的,默认没有考虑同步互斥问题,可通过ContentProvider 实现多进程共同访问。其是线程安全的,里面synchronized来保证同步。

架构设计和设计模式

Android开发常用轮子-2019 包含部分网络框架

Android 快速开发开源框架 2014年

开发工具Jetpack

注解与事件总线框架

  1. RxJava的功能与原理实现: 使用可观察序列组成的一个异步地,基于事件的响应式编程框架,逻辑简单,流式结构。
  2. RxJava的作用,与平时使用的异步操作来比的优缺点。
  3. 说说EventBus作用,实现方式,代替EventBus的方式:观察者模式,依赖反射,订阅后处理。
  4. 如果一个订阅者需要注册多个事件的时候,Rxjava需要一个个单独的注册,而EventBus则可以实现一个订阅者订阅多个事件,和一个事件对应多个订阅者。所以在Rxjava的基础上有了Rxbus来作为事件总线的库。RxBus在订阅者数量很大的情况下性能下降很明显,比不过EventBus。

设计模式

设计模式学习总结

性能优化

Android性能优化学习总结

  1. 如何对Android 应用进行性能分析以及优化?
    1. 分类:
      1. 性能问题:布局与绘制;启动速度; apk启动耗时:am start -W 中的waittime
      2. 内存问题:内存泄漏,内存浪费。 查看内存使用情况
      3. 耗电问题:
      4. 存储优化:
      5. apk大小
    2. 检测工具:Lint代码检查,GPU过度绘制选项查看过渡绘制,
  2. ddms 和 traceView
  3. 性能优化如何分析systrace?
  4. Java多线程引发的性能问题,怎么解决?
    1. 利用线程池解决频繁创建与销毁问题;
    2. 减少无意义的同步,与伪共享;
  5. 启动页白屏及黑屏解决? 设置窗口背景颜色为透明,在布局未加载出来时,显示当前应用背景。
  6. App启动与发布后崩溃异常捕捉:在Application 启动时初始化Thread.UncaughtExceptionHandler 类,用其去捕捉异常,不能捕获native层。native层使用sigaction捕捉异常信号,或使用Bugly、google-breakpad等第三方工具。 参考crash log收集总结 
  7. 现在下载速度很慢,试从网络协议的角度分析原因,并优化。 网络拥塞控制;ARP;DNS解析;缓存……

模块化与更新

  1. 热修复:目的是为了解决线上的bug或者小功能的更新,做到不用为了解决小bug或者小功能而频繁发布版本。核心技术分三类:代码修复、资源修复和动态链接库修复。每个核心技术有不同的方案,每种方案又有不同的实现。
    1. 代码修复:主要有三个方案:底层替换(直接在Native层修改原有类,不需要重新加载类。阿里系为主。)、类加载(基于Dex分包方案,主要有是Google官方方案、Dex自动拆包和动态加载方案。不能即时生效。)、Instant Run。
    2. 资源修复:替换系统AssetManger,加入patch的资源
    3. 动态链接库修复:先加载patch所在的so;
  2. 插件化原理分析:主要涉及类加载和资源加载。插件化目的是为了解耦业务模块,将一个应用里面不同的业务模块都做成一个apk。可并行开发,动态加载。
  3. 模块化实现:分模块开发,解耦。
  4. 项目组件化的理解:一种开发模式,把每个模块使用到的共同的功能抽取出来做成一个Lib去共同依赖,每个业务模块互不依赖、互相解耦,在开发的时候可以安排不同的开发人员去开发不同的模块,开发完毕以后单模块测试,最后整合到一起总体测试上线。
  5. 对于应用更新这块是如何做的?(解答:灰度,强制更新,分区域更新)?

JNI

JNI注册方式

  1. jni中注册native函数方法: 注册JNI函数的两种方式
    1. 静态注册:每个class都得用javah生成一个头文件,名字长,首次调用慢。类似 android_com_media_Target_test() ,通过函数命令规则查找响应函数。
    2. 动态注册:要在jni_onload 中注册。有类似 { "hello", "()Ljava/lang/String;", (void*)native_hello} 对应关系。 {"native_start",  "()V", (void *)android_media_AudioTrack_start},

C调用JAVA

  1. jni如何调用java层代码? C/C++调用JAVA
    1. 获取字节码对象;
    2. 通过字节码对象找到方法对象;
    3. 通过字节码文件创建object对象;
    4. 通过对象调用方法。

System.loadLibrary原理

Runtime.loadLibrary0 先用findLibrary去查找so是否存在,然后调用nativeLoad去加载库。

nativeLoad 方法参考:System.loadLibrary 加载 .so 原理

系统开发相关

  1. Android5种签名类型 :platform、media, shared, testkey/releasekey
  2. App 是如何沙箱化,为什么要这么做?  设置UID,底层是基于Linux内核的权限机制。
  3. 权限管理系统(底层的权限是如何进行 grant 的)? 参考 Android权限之底层实现概览
  4. 内存对象的循环引用及避免:内存回收机制的可达性算法。使用弱指针,程序中手动释放。
  5. 系统启动流程是什么?(init--Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程)
  6. 一个应用程序安装到手机上时发生了什么
  7. Android为每个应用程序分配的内存大小是多少?
    dalvik.vm.heapstartsize=8m    ----起始分配内存
    dalvik.vm.heapgrowthlimit=192m ---- 一般情况app申请的最大内存 dalvik.vm.heapsize=512m 
  8. Android中进程内存的分配,能不能自己分配定额内存?
  9. 进程保活的方式:Android进程分类?前台,可视,服务,后台,空进程。
  10. 如何保证一个后台服务不被杀死?(相同问题:如何保证service在后台不被kill?)比较省电的方式是什么?
  11. 什么是协程?:可看做是轻量级的线程,一个线程内能包含多个协程。协程是串行执行的,由用户自己控制调度。
  12. App中唤醒其他进程的实现方式:通过intent的不同用法,参考 App相互唤醒的几种方式

开发相关问题

  1. 工作历史问题技术记录
  2. 低版本SDK如何实现高版本api:用@SuppressLint 和 @TargetApi 后加入版本判断。
  3. 为什么不能在子线程更新UI?  在更新UI时都会调用 ViewRootImpl 中的 checkThread()方法来判断当前线程是否是主线程,若不是就会抛异常。在onCreate方法中可以在子线程中更新UI,因为此时ViewRootImpl还没有创建,无法做判断。ViewRootImpl是在handleResumeActivity方法中的makeVisible里面创建的。
  4. 有什么解决方法可以避免OOM?
  5. Oom 是否可以try catch?为什么? 可以,但不应该这样做。
  6. 怎么去除重复代码? 抽象基类,布局文件,style等。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lanmengfenghe/article/details/89352459

智能推荐

java中的volatile关键字的功能详解_volatile 关键字,-程序员宅基地

文章浏览阅读4.6k次。Cookie的应用场景:1,记录用户的登陆状态,提示用户是否记住密码;2,购物车购物功能;我们知道,在web开发过程中,我们都要和cookie打交道,有时候离开了cookie还真玩不转。cookie最典型的应用莫过于登陆提示,最近在做一个小项目,正好要用到cookie的知识,在这里顺便做一下总结。_volatile 关键字,

通过 ICMP 协议实现 Ping Tunnel 建立可穿透网络隧道-程序员宅基地

文章浏览阅读7.1k次。Twitter via Ping Tunnel周四 Cola 没去幼儿园,中午带着他去 KFC 吃东西。回来的时候小林指着西总布胡同说走这条路回去还是原路返回,他说还是..._ping tunnel

基于springboot+vue.js的名城小区物业管理系统(附带文章和源代码设计说明文档ppt)-程序员宅基地

文章浏览阅读817次,点赞18次,收藏20次。博主介绍:CSDN深耕的技术专家、博客专家、有着常年的工作经验、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战文末获取源码+数据库。

Arthas使用教程 阿里巴巴开源项目、史上最强java线上诊断工具-程序员宅基地

文章浏览阅读1.4w次,点赞31次,收藏263次。什么是 Arthas摘录一段官方 Github 上的简介Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!是否有一个全局视角来._arthas

java 方法注释格式_JAVA注释方法及格式-程序员宅基地

文章浏览阅读2.7k次。2019独角兽企业重金招聘Python工程师标准>>>JAVA注释方法及格式1、单行(single-line)--短注释://……单独行注释:在代码中单起一行注释, 注释前最好有一行空行,并与其后的代码具有一样的缩进层级。如果单行无法完成,则应采用块注释。注释格式:/* 注释内容 */行头注释:在代码行的开头进行注释。主要为了使该行代码失去意义。注释格式:// 注释内容行尾注释:..._方法注释

egret4.X版本项目无法与egret 5.X项目共存解决_egret 4.x老项目升级-程序员宅基地

文章浏览阅读367次。在编译egret 5.X 项目项目中执行egret clean_egret 4.x老项目升级

随便推点

App下载安装量如何统计_app下载量推广-程序员宅基地

文章浏览阅读3.1k次。背景和目的开展广告推广等活动后,想要通过安装量、注册量分析活动效果给多个不同渠道,分别进行安装量分析,评估谁优谁劣方便渠道结算,为后续活动的开展提供数据支撑App安装流程通常用户在某个渠道下看到App的下载链接后,会经历以下五个步骤:打开链接进入下载页面->点击下载按钮跳转应用商店->进入应用商店下载App->打开激活App->注册登录账号。这五个步骤分别对应的量化数据是:落地页访问量、下载按钮点击量、App下载量、App安装激活量、App注册量。通过对这四个指标的跟踪_app下载量推广

pd.DataFrame.to_excel出错,如何解决??_pd.to_excel 出现 临时文件错误-程序员宅基地

文章浏览阅读3k次。各位大佬请问是什么问题?我运行pd.DataFrame.to_excel,结果每个选项都报错,但是库都打足了。# 1.文件读取# 1.1 读取Excel文件import pandas as pddata = pd.read_excel('data.xlsx') # data为DataFrame结构,这里设置是相对路径,也可以改成绝对路径print(data)# 1.2 读取CSV文..._pd.to_excel 出现 临时文件错误

关于a标签,添加:data-toggle="modal" 属性,又添加了:href="#btn_top",属性导致 跳转到另一个页面出现遮罩层_"data-toggle=\"modal"-程序员宅基地

文章浏览阅读7.1k次。1.关于a标签,添加:data-toggle="modal" 属性,又添加了:href="#btn_top",属性导致 跳转到另一个页面出现遮罩层如上图,如果a标签无意添加了:data-toggle="modal"属性,那么你的href标签里对应的modal要能找到,广泛解释就是。添加:data-toggle="modal"属性,添加a标签会寻找此标签的href属性,可刚好你写的href ..._"data-toggle=\"modal"

MySQL的on duplicate key update 的使用_mysql on duplicate key update-程序员宅基地

文章浏览阅读1.5w次,点赞2次,收藏31次。mysql的存在就更新不存在就插入实现先建数据库表,重点要添加主键索引(id列,没有测试)和唯一索引(branch_no列)sqlINSERT INTO t_bank_organ_copy1 ( organ_no, branch_no, branch_name, created_by )VALUES ( 1255, '13', '深圳分行', '小王' ) ON DUPLICATE KEY UPDATE branch_name = '中国银行'测试:1、organ_no, ._mysql on duplicate key update

【JqGrid】JqGrid日期格式化处理-程序员宅基地

文章浏览阅读6.2k次。使用JqGrid显示日期是转换后的结果,即显示的毫秒数。需要自己进行手工处理,处理后的代码如下:{label:'日期',name: 'departure_date',index: 'departure_date',align: "center",formatter:function(cellValue,options,rowObject){ return (moment(rowOb_jqgrid日期格式化

Convert.ToInt32()与Int.Parse()的区别_convert.toint32和int.parse的区别-程序员宅基地

文章浏览阅读619次。1、int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型);2、int.Parse(string sParameter)是个构造函数,参数类型只支持string类型;3、Convert.ToInt32()适合将Object类型转换为int型;4、Convert.ToInt32()和int.Parse()的细微差别:对于空值(null)的处理_convert.toint32和int.parse的区别