自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 Android新导航组件NavController的坑

1. Toolbar/ActionBar设置下面的代码, 可以将导航器 navController 与 Toolbar/ActionBar 绑定.setupActionBarWithNavController(navController, appBarConfiguration)但是, 如果Activity 使用了Toolbar, 就需要将其使用的Theme设置为noActionBar:<item name="windowActionBar">false</item>

2021-02-10 18:28:31 7661 4

原创 记一次诡异的OOM坑

OOM,即OutOfMemory。作为Android设备常见的性能问题,经常见于图片大量加载的场景。然而博主这次碰到的OOM,却是由一个意想不到又合情合理的问题导致。由于是半路接手一个正在开发的项目,着实被坑了一把。一. 场景描述:在一个Activity中,会异步生成一张二维码图片。不过这个功能显然是后来匆忙加的,因为二维码Bitmap并没有缓存(项目其它地方的图片都是用Glide)...

2018-07-09 10:23:35 390

原创 Android启动性能优化

一. 了解APP启动内部机制1.1 三种启动方式:cold,warm,hot冷启动:app将从头开始启动暖启动热启动暖启动和热启动,系统将一个正在运行的app从后台转为前台。我们强烈推荐直接优化冷启动。因为这些优化措施同样可以提高暖启动和热启动的性能。1.2 冷启动过程相比其它启动方式,优化冷启动并不容易。因为相比其它两种方式,系统和app显然有更多的工作要...

2018-06-26 00:05:57 488

原创 leetcode之旅-无重复字符的最大子串长度

一. 题目描述Given a string, find the length of the longest substring without repeating characters. - Examples: - Given “abcabcbb”, the answer is “abc”, which the length is 3. - Given “bbbbb”, ...

2018-06-24 04:26:27 481

原创 ProtocolBuffer使用入门

一. 获取Protocol Buffer1.1 获得源码Github:ProtocolBuffer源码Git clone之:git clone https://github.com/google/protobuf.git或者直接下载release版本:https://github.com/google/protobuf/releases本例选择从release下载3.5.1版...

2018-06-17 17:49:50 1962

原创 Android屏幕兼容性概览

前言:这篇文章内容主要来自于Google的官方指导,有些地方加入笔者自己的理解。有很多内容现在应用的已经很少了,比如ldpi屏幕。现在android设备的分辨率越来越高,尺寸也接近于同一,适配难度也低了很多。Google在过去不断推出了新的View组件、容器组件。个人建议尽量使用新的组件来实现UI,它们往往性能更好,风格和样式趋近于MD的统一风格,而且更易于适配不同的屏幕。但笔者仍...

2018-06-13 02:31:52 503

原创 Android降低UI渲染速度的检测、诊断及修复

一. Slow rendering - jank为了保证UI交互的流畅,必须保证每帧的渲染时间不超过16毫秒,保证60的FPS。一旦界面有较慢的渲染,系统将强制跳帧,用户就会感觉到卡顿。We call this jank.二. 定位jank1. 三种定位方法想要准确定位发生jank的代码并不容易,以下三个办法可以帮助开发者: - 视觉检查:可以快速直观的发现jan...

2018-06-12 00:16:33 2032

原创 ANR问题的检测、诊断及修复

一. ANR简介描述:UI线程如果停止响应太长的时间, “Application Not Responding” (ANR) 就被触发。如果被阻塞的app处于前台,系统会显示一个ANR对话框。触发:以下两个条件,任意各一个都会导致ANR当app处于前台时,在5s内无法相应用户输入或广播。当app没有activity处于前台时,广播接收器正在进行长时间的任务,且无法结束。...

2018-05-30 02:37:02 1613

原创 Android Vitals各性能指标介绍

Android vitals 简介谷歌推荐使用Android vitals来帮助开发者提高App的稳定性和性能表现。作为这个方案的一部分, Play Console提供了Android Vitals dashboard的早期测试版本。当被选中的用户运行App时,设备会记录大量的测试指标数据,包括app稳定性、渲染时间和电池使用数据。Play Console统计这些数据并在dashboar...

2018-05-30 02:35:09 3418

原创 Activity的工作过程(二)

Activity启动详细流程(下)四. 新进程启动ActivityThreadZygote进程孵化出新的应用进程后,会执行ActivityThread类的main方法。在该方法里会先准备好Looper和消息队列,然后调用attach方法将应用进程绑定到ActivityManagerService。然后进入loop循环,不断地读取消息队列里的消息,并分发消息。//Activ...

2018-05-28 01:21:07 171

原创 Activity的工作过程(一)

一. Activity调用ActivityManagerService启动应用用户在Launcher程序里点击应用图标时,会通知ActivityManagerService启动应用的入口ActivityActivityManagerService发现这个应用还未启动,则会通知Zygote进程孵化出应用进程,然后在这个dalvik应用进程里执行ActivityThread的main方法。...

2018-05-28 01:20:25 763 1

原创 Android消息机制原理

一. 概述:Handler、消息队列和LooperHandler的功能:将一个任务切换到某个指定的线程中去执行。UI线程:Handler常见于从工作线程切换到UI线程。因为Android UI使用的是单线程模式,不允许在其它子线程中访问UI。如果在多线程中并发访问UI,可能导致UI控件处于不可控的状态,它不是线程安全的。工作流程:Thread2中创建Handler对象,Handl...

2018-05-10 17:00:09 150

原创 View的工作原理(四):自定義View

一. 自定义普通View这个小节我们来看看如何自定义一个继承自View的控件。目标:自定义一个圆形控件:public class MyCircleView extends View { private int mColor = Color.GREEN; private Paint mPaint; public MyCircleView(Context...

2018-05-07 23:53:20 219

原创 View的工作原理(三):layout与draw

一. layout过程先来看看View的layout方法源码:public void layout(int l, int t, int r, int b) { if ((mPrivateFlags3 &amp;amp; PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT) != 0) { onMeasure(mOldWidthMeasureSpec, ...

2018-05-06 01:54:03 294

原创 View的工作原理(二):measure

本文主要描述measure过程。一. View的measure过程View的measure方法为final,该方法中会调用View的onMeasure方法。下面是onMeasure方法:protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension...

2018-05-05 17:57:55 350 1

原创 View的工作原理(一):MeasureSpec

ViewRoot 和 DecorViewView的绘制流程是从ViewRoot的performTraversals方法开始的。它经过measure、layout和draw三个过程才能最终将一个View绘制出来。 measure:测量View的宽和高layout:确定View在父容器的位置draw:将View绘制在屏幕上。performTraversals的工作流程: 父容器在o...

2018-05-05 02:18:03 426

原创 View的事件体系三(滑动冲突处理)

本文讨论滑动冲突问题。在界面中只要有内外两层同时可以滑动,就可能会产生滑动冲突。一. 滑动冲突场景外部滑动方向和内部滑动方向不一致。举个例子,ViewPager 和 Fragment配合组成的页面滑动效果。左右滑动可以切换页面, 如果页面内又是一个ListView,就会导致滑动冲突,只不过ViewPager内部已经处理了这种滑动冲突,所以我们无需担心这个问题。但是如果我们使...

2018-04-27 02:28:00 488

原创 View的事件体系二(事件分发)

一. 传递规则MotionEvent 的分发主要由下面三个方法来完成:public boolean dispatchTouchEvent(MotionEvent ev)对于一个根ViewGroup,点击时间产生后,会首先调用这个方法。它将根据onInterceptTouchEvent 的返回值,来决定是否对子View继续分发。public boolean onInterceptTo...

2018-04-26 01:17:52 185

原创 View的事件体系一(触摸、手势、滑动)

一. View基础触摸、手势、滑动事件View是所有界面层的空间的一种抽象。 Andorid屏幕坐标系原点在左上角, 而View的left,right,top,bottom属性,都是相对于其父View的坐标。1. MotionEvent 和 TouchSlopMotionEvent 手指触摸屏幕后,典型的事件类型:ACTION_DOWN:手指刚接触屏幕;ACTIO...

2018-04-24 16:48:17 621

原创 Android跨进程通信-IPC初探(三) - 使用AIDL

IPC初探(三) - 使用AIDL本文将会介绍AIDL通信。本系列的其它文章:Android跨进程通信-IPC初探(一)Android跨进程通信-IPC初探(二) - 使用Messenger1. 示例的新需求回顾一下在IPC初探(一)中的示例,服务端为客户端提供了两个功能:addStudent() : 在客户端为服务端的List添加新的数据getStud...

2018-04-23 12:37:34 239

原创 Android跨进程通信-IPC初探(二) - 使用Messenger

IPC初探(二)本文将会介绍Messenger通信。Mesenger是一种轻量级的IPC方案。它通过传递Message来实现数据的进程间传递。它的底层实现是AIDL。Messenger工作原理: 需求描述:C端向S端跨进程发送msg,并封装一个bundle数据对象S接收msg,读取bundler数据,并向C端返回一条新的msg,并封装一个新的bundlB数据对象...

2018-04-22 02:12:35 302

原创 Android跨进程通信-IPC初探(一)

IPC初探(一)进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。 IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。 Android中特有的IPC机制主要是Binder,当然也支持Socket。1. Android中的多进程模式开启多进程模式在n...

2018-04-21 03:38:20 259

原创 Android 各种第三方轮子

图片加载 强烈建议放弃Universal Image Loader , 这玩意很久没更新了。 推荐脸书出品的Fresco, 以及Picasso, 或者Glide。网络请求 OKHttp,Retofit,或者Volley。 如果请求需求不多,可以考虑系统自带的Android Aync HTTP(这玩意真的还有人用吗。。。)数据解析 G...

2018-04-18 01:16:36 503

原创 Activity的生命周期和启动模式

一. Activity的生命周期Activity的生命周期分两种情况:典型情况:在有用户参与的情况下,Activity所经过的生命周期的改变。异常情况:Activity被系统回收或由于当前设备的Configuration发生改变从而导致Activity被销毁重建。1. 典型情况下的生命周期分析正常情况下,会经历如下生命周期: 方法 功能 描述...

2018-04-08 14:31:13 125

原创 Java 编码规范15(工程结构)

工程结构其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释规约与其...

2018-04-08 00:10:52 930 2

原创 Java 编码规范14(MySQL-SQL语句与ORM映射)

一. SQL语句其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释...

2018-04-08 00:10:03 770

原创 Java 编码规范13(MySQL-索引规约)

MySQL-索引规约其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-...

2018-04-08 00:09:30 383

原创 Java 编码规范12(MySQL-建表规约)

MySQL-建表规约其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-...

2018-04-08 00:08:48 445

原创 Java 编码规范11(安全规约)

安全规约其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释规约与其...

2018-04-08 00:07:51 2300

原创 Java 编码规范10(单元测试)

单元测试其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释规约与其...

2018-04-07 01:25:58 1130 2

原创 Java 编码规范9(异常日志)

一. 异常处理[强制] Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理,比如:NullPointerException,IndexOutOfBoundsException等等。 说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,不得不通过catch NumberFormatException来实现。 ...

2018-04-07 01:25:21 1808

原创 Java 编码规范8(编程规约-注释规约与其它)

注释规约与其它其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释规...

2018-04-07 01:24:32 1008

原创 Java 编码规范7(编程规约-控制语句)

控制语句其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释规约与其...

2018-04-07 01:23:29 485

原创 Java 编码规范6(编程规约-并发处理)

并发处理其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释规约与其...

2018-04-07 01:22:51 606

原创 Java 编码规范5(编程规约-集合处理)

集合处理其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释规约与其...

2018-04-07 01:20:38 536

原创 Java 编码规范4(编程规约-OOP规约)

编程规约-OOP规约其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-...

2018-04-07 01:18:49 733

原创 Java 编码规范3(编程规约-代码格式)

代码格式其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注释规约与其...

2018-04-07 01:17:25 801

原创 Java 编码规范2(编程规约-常量定义)

编程规约-常量定义其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注...

2018-04-07 01:16:39 1018

原创 Java 编码规范1(编程规约-命名风格)

编程规约-命名风格其它相关文章 Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-并发处理) Java 编码规范7(编程规约-控制语句) Java 编码规范8(编程规约-注...

2018-04-07 01:14:40 1266

原创 Android编程规范摘要7 (安全)

安全其它相关文章: Android编程规范摘要1 (资源文件命名与使用) Android编程规范摘要2 (基本组件) Android编程规范摘要3 (UI与布局) Android编程规范摘要4 (进程、线程与消息通信) Android编程规范摘要5 (文件与数据库) Android编程规范摘要6 (Bitmap、Drawable ...

2018-04-02 01:32:45 440

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除