Android 基础
Android 五大布局介绍
https://www.jianshu.com/p/4fac6304d872
FrameLayout,LinearLayout,RelativeLayout,TableLayout,AbsoluteLayout(弃)
Android Studio 调试
断点调试
http://blog.csdn.net/yy1300326388/article/details/46501871
- 其中的“跨断点调试”应为“恢复项目”;
- 学会灵活运用“设置变量的值”功能;
TraceView 性能分析
https://bxbxbai.github.io/2014/10/25/use-trace-view/
- 最重要的两个参数是 Calls + Recur Calls / Total 和 Cpu Time / Call;
- 在开始追踪的地方加入 Debug.startMethodTracing(“name”);,在停止追踪的地方加入 Debug.stopMethodTracing();,即可生成用于 TraceView 分析的 debug 文件;
Android 新特性
Android 8 新特性
https://zhuanlan.zhihu.com/p/26409511
通知渠道,画中画模式,自适应图标,固定快捷方式和小部件….
Android 性能
Android 中 RelativeLayout 和 LinearLayout 的性能分析
http://www.jianshu.com/p/8a7d059da746
- RelativeLayout 默认执行两次 onMeasure:因为 View 有可能在横纵方向存在交叉引用(A 横方向依赖 B,B 纵方向依赖 A);
- LinearLayout 默认执行一次 onMeasure;如果使用 weight 属性,则执行两次 onMeasure,即非 weight 属性先 onMeasure 一次,剩下的长度再分配给 weight 属性;
- 尽量使用 padding 代替 margin;
- 复杂的 View 嵌套结构对性能的影响更大;
Android 代码质量
SonarQube
https://www.sonarqube.org/
代码质量管理平台;
Android 插件化
Android 插件化入门
http://www.jianshu.com/p/b6d0586aab9f
Android 插件化的作用:
- 解决方法数超过65535的问题;
- 不同团队负责不同的插件,分工明确;
- 不同模块封装成不同的插件 APK,各个模块可以单独编译,提高开发效率;
- 通过上线新的插件解决线上 bug,实现“热修复”;
- 减小宿主 APK 的体积;
Android Web
Android 代码混淆
https://www.cnblogs.com/renhui/p/5863199.html
http://www.cnblogs.com/renhui/p/5910300.html(Java Annotation)
使用 Js 的 WebView 都要进行代码混淆;
Android 开发技巧
获取当前 Activity 实例对象
http://blog.csdn.net/vfush/article/details/51483436
- 在 MyApplication 内声明公有静态 Activity 对象 sCurrentFrontActivity;
- 在 MyApplication 内重写 onCreate 方法,实现 ActivityLifecycleCallbacks 接口,在 onActivityCreated 和 onActivityResumed 方法中为 sCurrentFrontActivity 赋值为参数 activity;
- 使用时,判断 (MyApplication.sCurrentFrontActivity instanceof 某个 Activity),reture true 则当前 Activity 为那个 Activity;
(不一定是最好的解决方案!)
Android 屏幕适配:最全面的解决方案
https://www.jianshu.com/p/ec5a1a30694b
仅收藏,暂无研究的动力;
漏洞:startForeground() 前台 Service 去掉通知显示
http://blog.csdn.net/wxx614817/article/details/50669420
Android 7.0 已经修复该漏洞;
Android 常见错误
java.util.ConcurrentModificationException
http://blog.csdn.net/aaawqqq/article/details/43884623
出现原因:集合在被迭代器迭代的同时被修改;
解决方法:
1. 迭代时用锁;
2. 先复制,再迭代;
3. Android 使用 CopyOnWriteArrayList;
Android 源码
深入理解 Looper,Handler,Message
http://blog.csdn.net/lmj623565791/article/details/38377229
http://blog.csdn.net/shaoenxiao/article/details/54561753
Android 生命周期 & 适合执行的操作
http://blog.csdn.net/samuel__liu/article/details/51049579
- A Activity 中启动 B Activity,生命周期的执行顺序:
A Activity -> onPause();
B Activity -> onCreate();
B Activity -> onStart();
B Activity -> onResume();
A Activity -> onStop(); - onCreate() 中建议进行 setContentView(),findViewById() 等初始化操作;
- onResume() 可以进行耗时操作,但不是 Activity 可交互最好的指示器,使用 onWindowFocusChanged() 可以更清楚知道 Activity 的交互情况;
- onPause() 不能进行耗时操作(如果执行时间超过 500ms,Activity 将会被强制关闭),但是需要执行如停止动画等消耗 CPU 的操作,以便下一个 Activity 更快执行;或执行关闭独立设备(如照相机)的操作;
- onStop() 可以进行耗时操作,因为它是在后台执行;然而,如果内存不足,系统可能回收此进程,onStop() 可能永远不会执行;
Activity 与 Fragment 生命周期比较
Android 架构
Android MVP 讲解(晓鹏)
https://rocko.xyz/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/
MVP 对应于 Android:
M:Model,V:Activity,P:Presenter
其中,Activity 持有 Presenter 的引用,Presenter 持有 Model 和 Activity 的引用;
Android MVP demo
https://github.com/iGuure/AndroidCodeHub/tree/master/AndroidArchitecture
软引用 弱引用 ReferenceQueue WeakHashMap
Java 四种引用介绍
https://www.cnblogs.com/dolphin0520/p/3784171.html
- 软引用很适合做缓存;
- 与 ReferenceQueue 联用时,ReferenceQueue.poll 拿到的是引用,此时调用该引用的 get 方法返回 null(对象将要被回收);
- 调用 System.gc 无法保证 JVM 立即执行垃圾回收;
ReferenceQueue 介绍
https://www.cnblogs.com/dreamroute/p/5029899.html
(读到 WeakHashMap 之前)
- 例子中的 referenceQueue.remove 改为 referenceQueue.poll,去掉 thread.setDaemon(true),System.out.println(“map.size->” + map.size()) 移到子线程的最后;
WeakHashMap 介绍
https://www.cnblogs.com/skywang12345/p/3311092.html
- 我的理解:HashMap.put 直接将 key 的引用存进键中,WeakHashMap.put 为 key 对象新增一条弱引用,并将弱引用存进键中,如图:
轮子:SoftMap
http://blog.csdn.net/lovoo/article/details/51302594
指针和引用
C++ 中指针和引用的区别
https://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html
(只读1.(1))
- 我的理解(以 Java 为例):
Integer i = new Integer(1);
此时内存栈中存放着引用 i,堆中存放着 Integer 对象 1:
指针 是堆中 Integer 对象 1 在内存中的地址,
引用 是栈中引用 i 或 i 的别名;
内部类
普通内部类和静态内部类的区别
http://blog.csdn.net/u012123938/article/details/46684839
- 普通内部类持有对外部类的强引用;静态内部类则没有,可以使用软引用或弱引用访问外部类(Android handler 内存泄漏:链接);
- 普通内部类不能持有静态成员;
Java 语法
普通代码块,构造代码块,静态代码块
https://www.cnblogs.com/sophine/p/3531282.html
- 三种代码块均没有方法名,注意各自的位置和关键词;
-
普通代码块功能与一般大括号相同;
构造代码块每次初始化类时都运行一次;
静态代码块只在 JVM 初次加载类时运行一次;
Java 多线程
Java 实现超时监听
http://blog.csdn.net/dailywater/article/details/19771689
方案1:使用守护线程;
方案2:使用 Future 特性(推荐);
// Android 范例代码
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> future = executorService.submit(new TimerTask());
try {
future.get(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
Log.d("Guu", "Time out!");
e.printStackTrace();
}
Log.d("Guu", "Finish future task!");
class TimerTask implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(10000);
return null;
}
}
Condition
http://blog.csdn.net/ghsau/article/details/7481142
传统的 notify() 不能指定唤醒哪一个 wait(),而 Condition 的 await() 可以唤醒特定的 signal();
Volatile
https://www.cnblogs.com/zhengbin/p/5654805.html
Volatile 的作用:
1. 保证变量对所有线程的可见性;
2. 禁止指令重排列(保证 Volatile 前后的语句相对位置不变);
网络
HTTP 1.0/1.1/2.0
http://www.jianshu.com/p/52d86558ca57
其他
Json 相较于 XML 的优势
https://www.zhihu.com/question/25636060