- 博客(40)
- 资源 (10)
- 收藏
- 关注
原创 我的安卓我的BLE4.0————祝福翔飞人
最近翔飞人退役了。一直振翅的飞人最后还是落了地。伤病无情,英雄迟暮。祝福他换片天空再次起航ing。前一阵子,被老板叫去搞项目。说是要用到蓝牙,一琢磨,网上不多的是,下了一个蓝牙聊天的demo,翻来覆去就这点东西嘛,还不是小意思,搞了半个月,信心满满地跟硬件工程师交流,我擦嘞,这什么玩意,完全不一个系统嘛。这算是跟蓝牙的第一次正面交锋吧。蓝牙发展到今天,已经是第四代了。BLE4....
2019-09-16 22:30:37
213
原创 有状态的drawbale中嵌套shape
一直以来,定义有状态的drawable资源需要引用shape时,都是单独创建一个shape,再创建一个drawable。
2017-05-29 14:53:43
1244
原创 Mac下用Charles实现Android http和https抓包
背景工作以后,团队需要,抓包工具用的特别多。Charles功能丰富,能满足需要抓包的大多数场景。 之所以专门讲一下Android抓包,一个原因是笔者从事Android开发,经常用;另外,就是网上关于Charles实现Android抓包的配置说明鱼龙混杂,不仅浪费时间还让人抓狂。工具(1)最新的charles工具,下载地址:https://www.charlesproxy.com/...
2017-05-29 12:22:42
79902
14
原创 Activity--onSaveInstanceState正确的打开方式
背景之所以会写这篇文章,是因为之前偶然看见csdn的博客专家写到这个问题,给出的结论实在让人大跌眼镜。于是看了下源码,索性做个记录。在Android 7.0以前,谷歌一直约束着让它以单窗口的姿态与广大用户见面(当然,除了个别不听话的厂商,早已实现了多窗口)。从开发者的角度来看,Activity(Fragment)通常是我们与用户交互的载体,也就是象征意义的“窗口”。通常我们的应用一般会有多个Acti
2017-05-22 00:13:58
988
原创 Android开发常见问题之"Failed to convert @drawable/xx into a drawable Exception details are logged in Window
问题描述图片资源引用错误,通常会有如下类似的错误日志:java.lang.NumberFormatException: Color value '@drawable/xx' must start with #
2017-05-21 19:12:51
4153
原创 Android使用gradle打包Assets目录
现在提起Android开发工具,大多人第一个想到的肯定是Android Studio。谷歌专门为Android开发者推出的这款IDE,以其强大的功能迅速击败的老牌的eclipse。与此同时,eclipse依赖的ant,也逐渐被更加强大更加灵活的gradle所取代,成为Android开发领域首选构建工具。
2017-05-14 21:16:25
15509
1
原创 Activity源码之Android 6.0权限相关完全解析
我们都知道Android6.0以前权限的申请非常简单,只需要在mainfest声明所需的权限即可。而6.0以后,Android将权限的管理进一步严格化,它要求用户在使用某些敏感权限时,必须在mainfest中先声明之后再动态申请。
2017-05-02 00:29:45
2084
原创 面试--算法--Top K
Top K问题是面试时手写代码的常考题,某些场景下的解法与堆排和快排的关系紧密,所以把它放在堆排后面讲。下面先来还原一下Top K考试常见的套路。你正紧张地坐在小隔间里,听着越来越近的脚步声,内心忐忑,犹如兔脱。推门声呷然而起,你扭头一看,身体已不由自主起立,打量着眼前来人,心里一阵窃喜:还好,面善。面试官点头致意,你配合坐下,满心满眼一片赤诚,恨不得把公司的茶水阿姨都夸一遍来表明你面试的诚意。面试
2016-12-19 11:12:27
14536
4
原创 算法--排序--面试总结
这一篇作为排序算法的总结。常见的排序算法有冒泡、选择、插入、希尔、快排、堆排、基数、归并、计数以及桶排等。前六种算法在前面文章里已经有过较详细的介绍,并提供了相关的Java代码作为参考。其中,最重要的必然是快排和堆排这两种,准备面试的同学务必要熟练掌握。至于后四种算法,则考得相对很少,而且大多数考点也集中在它们的复杂度和稳定性上。同时,这四种算法还有一个共同的特点,它们的效率不低,但都是以申请额外的
2016-12-18 09:58:16
476
原创 算法--排序--堆排
这一篇再画下重点,看一下堆排。在将堆排之前,有必要先澄清两个概念:堆和堆排序。堆是一种数据结构,属于完全二叉树的一种。根据数据排列的特点,可以分为大顶堆(最大堆)和小顶堆(最小堆)。所谓的大顶堆,就是满足父节点大小于左、右子节点的树;小顶堆,则是父节点不大于左、右子节点的树。由此,我们也可以得出一个结论:大顶堆(小顶堆)是整个堆最大(小)的元素。堆排序则是利用堆的性质来进行排序的一种算法。什么性质呢
2016-12-17 10:15:18
775
原创 算法--排序--快排
前面的几个算法都比较基础,面试笔试99%不会考。这一篇画下重点,看一下快排。快排的核心是”分治”,所谓的分治,就是”大而化小,小而化了”。说白了,就是将一个数组分成两个子数组,分别执行快排。排完后,再分成4个子数组,再排…直到不能再拆分为止。可以说,整个快排就是一个不断拆分的过程。因此,拆分就很关键(废话…)。究竟该如何拆分呢?按什么策略拆呢?这就是它的核心了。单轴快排一般会选择一个数组元素作为fl
2016-12-16 00:44:10
935
原创 算法--排序--希尔
希尔是插入排序的姊妹,她在插入的基础上引入了分组的概念,在分组内做插入,然后不断地缩小分组的个数,分组为0即可完成排序。换句话,插入排序是分组为1的希尔排序。 举个例子:现有长度为10的数组[1, 5, 8, 4, 7, 3, 0, 2, 9, 6]; 注:希尔排序的整个过程,图中颜色相同的表示处于同一个分组内,元素所处的位置对应着数组的下标。 (1)既然引入了分组gap,不妨就让gap =
2016-12-15 00:14:36
496
原创 算法--排序--插入
插入排序的思想跟选择排序类似,都是从后面选择元素往前面“放”,导致这两种算法经常”傻傻分不清楚”。笔者认为它们两个最大的区别已经体现在“放”的策略上。假设现有无序数组A0到A5处在,它们分别对应着数组中的0到5号位。要求实现从小到大排列。所谓的选择排序,它侧重从A0到A5中选出最小的一个元素,放到0号位上;然后在剩余元素中选出次小元素,放在1号位上,依次类推…而插入排序,它里面引入了分组的概念,核心
2016-12-02 11:18:47
434
原创 算法--排序--选择
选择排序的思想也比较简单,就是从所有数据中选出最小的一个,排好第一位;然后再选一个次小的,排好第二位;依次类推下去…形象一点说像极了平时大家钟爱的打牌运动,笔者斗地主时喜欢装逼,总是要先把牌取完,然后再一把揭开慢慢整理,大眼一扫,MD竟然有个3!!!没办法,拿出来放到最左边。再扫一眼3后面的牌,我擦,竟然还有个4,抽出来,放到3后面吧…直到排好王炸,哈哈,又赢了5000金豆(得意脸)条件: 数据量
2016-11-30 00:52:59
362
原创 算法--排序--冒泡
冒泡排序,可能是大多数人接触的第一个排序算法。C语言教程里对此有详细描述。冒泡算法本身不难,但写不好的话,很容易写成效率最差的选择排序,介绍选择排序的时候会分析一下原因。条件: 数据量较小原理: 吹泡泡。内外两层,一趟确定一个元素的位置。这里总结了一个速记法则”外后内浅(前)”,解释一下就是最外层的循环从最后面开始,内层的循环从前面开始。记下这个法则,以后就不容易写蹩脚了。时间复杂度:没什么好说
2016-11-29 00:25:27
343
原创 算法--查找--总结篇
紧张的校招终于接近尾声了。长达四个月的时间,在实习和面试之间频繁切换,起早贪黑熬夜点灯都是家常便饭,仿佛一夜之间又回到了高考前(目瞪狗呆脸…)。好在准备还算到位,加上平时的项目积累、总结,最终的结果还算满意。回过头来想想,真真切切也就一个感受:找工作真特娘的是一项体力活。以前,总是听师兄师姐谈经验,觉得工作该如何如何,算法该如何如何,重点知识该如何如何。于是一股脑的刷算法,看面经,啃基础。你能说它没
2016-11-28 23:39:07
524
原创 解决ActionBar字体设置
首先,字体是由ActionBar的Tittle部分显示,而ActionBar是由Theme属性来控制的,所以要形成这样的解决思路: theme->ActionBar->Tittle->最终的显示。 通过代码来直观看一下:<!-- 注意parent属性,必须是Theme的一种,否则找不到我们需要设置的actionBarStyle --><style name="ActivityTheme"
2016-07-27 13:11:58
2817
原创 从生产者消费者窥探线程同步(下)
欢迎转载,转载请注明出处。尊重他人的一丢丢努力,谢谢啦! 阅读本篇之前,如果你还没有看过从生产者消费者窥探线程同步(上) ,那不妨先戳一下,两篇一起嚼才更好呢。上一篇分析了使用BlockQueue和synchronized来实现生产者消费者模式。这一篇来看一下其他的实现,闲言少叙。(3)Lock实现核心:Lock的用法中规中矩,有点类似于非静态同步方法,只是前者是对lock对象显式加锁,而后者是
2016-06-20 08:48:33
2906
原创 从生产者消费者窥探线程同步(上)
欢迎转载,转载请注明出处。尊重他人的一丢丢努力,谢谢啦! 阅读本篇之后,如果你觉得说得还有点道理,那不妨先戳一下从生产者消费者窥探线程同步(下) ,两篇一起嚼才更好呢。最近复习了下生产者消费者模式,虽然对它不太陌生,但要说认认真真地实现,还真从来没有过,这里将它总结一下,有不妥或者见识不到之处,欢迎留言指出。为什么要使用大概基于以下2点: (1)可以实现解耦 大多数设计模式,都会创造出一个第
2016-06-16 18:29:12
3936
2
原创 算法--查找--散列表查找
查找除了线性表的查找(顺序、二分、分块),树上查找(BST、B-树),还有一种散列查找。相比于前两种查找,散列表的查找效率惊人的高O(1),它采用的直接寻址技术,基本上就是实现了精准打击,达到一击而中的效果。所谓的直接寻址技术,说白了,就是存储记录时,通过散列函数计算出一个散列地址;读取记录时,通过同样的散列函数计算出地址,然后按照地址访问记录。整个过程有点类似于数学中的映射,一个或者多个key通过
2016-06-14 11:09:51
3009
原创 算法--查找--二叉排序树创建、查找
二叉排序树(BST)具有如下性质: (1)若有左子树,左子树所有值均小于根节点的值; (2)若有右子树,右子树所有值均大于根节点的值; (3)左右子树,分别是一棵二叉排序树。左子树中最右边节点必然是左子树中最大的,右子树最左边节点必然是右子树中最小的。BST的创建和搜索还是比较简单的,思路基本一样,有树便有递归。比较棘手的是它的删除,相比于C语言的指针操作来说,java
2016-06-12 17:41:33
875
原创 算法--查找--斐波那契查找
相对于二分查找和差值查找,斐波那契查找的实现略显复杂。但是在明白它的主体思想之后,掌握起来也并不太难。既然叫斐波那契查找,首先得弄明白什么是斐波那契数列。相信大家对这个著名的数列也并不陌生,无论是C语言的循环、递归,还是高数的数列,斐波那契数列都是一个重要的存在。而此处主要是用到了它的一条性质:前一个数除以相邻的后一个数,比值无限接近黄金分割。就笔者而言,这种查找的精髓在于采用最接近查找长度的斐波那
2016-06-11 00:03:24
19307
12
原创 算法--查找--差值查找
老实说,差值查找与二分查找在实现上基本没什么区别。相对于二分查找来说,查值查找更在乎数据的分布规律,换句话说,查值查找会根据数据的分布情况,来决定要选择的拆分点middle,从而实现优化。比如现在一个长度为100,分别存放着1到100的整数,我们要查找2,就不会从50这个点来拆分,而是会选择较小的数值。条件:(1)数据必须采用顺序存储结构;(2)数据必须有序。原理:与二分查找类似,区别在于拆分点的选
2016-06-10 17:46:09
2252
原创 (笔记)内核之输入法框架
IMF的本质包含了虚拟键盘的系统级窗口,能处理虚拟按键的点击事件,当然也能把字符传递到编辑框中IMF的核心思想采用Service运行具体的输入法在Service中创建窗口,把输入的内容传递到编辑框中常见的缩写IMF:输入法框架IM:输入法IMS:输入法服务IMM:输入法管理器IMMS:输入法管理器服务IME:具体的输入法,包括IMS和各种BindIMF框架的四个BinderIMM
2016-06-10 11:21:32
1728
原创 算法--查找--二分查找
昨天面试,突然被问到二分查找。原理都懂,实现其实也不算难,偏就没写出来,说起来真是一个大写的尴尬…想来还是算法底子太弱,痛定思痛,不如好好复习一下,那就从此处上路吧。条件:(1)数据必须采用顺序存储结构;(2)数据必须有序。原理:二分查找,也叫作拆半查找,属于静态查找的一种。一般的实现思路,就是先拿中间位置的数middleData与待查找的数searchData比较,如果middleData时间复杂
2016-06-10 11:06:53
640
转载 [转]稳定排序和不稳定排序
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前
2016-04-22 11:11:40
486
原创 史上最全:ant多渠道打包安卓工程(二)
背景上一篇我们讲了如何利用ant来代替eclipse实现安卓工程的编译签名打包,这一篇重点来研究一下多渠道问题。搞过移动开发的应该都知道,国内的安卓市场有成百上千个,我们的apk发布之前,通常要为每一个渠道打包出来一个独一无二的安装包,如果仍然安装老方法来,在每一个渠道下都执行一次ant release,肯定能实现,但试想一下,每一个apk打包出来需要几分钟,要这样执行下去的话,容易重复不说,打包的
2016-04-11 20:08:01
747
原创 面试系列之HashMap原理
背景源码总结背景有过Java编程经验的大概都要这个印象:四大集合除了List之外,用的最多的集合非HashMap莫属。虽然用的很多,但许多人包括我在内,未必能真正弄懂其原理。前面的介绍,我们也知道,HashMap是Map的接口实现,是LinkedHashMap的父类,与Hashtable并没有什么继承关系。至于两者的关系也是极微妙的。大的来说,主要有两点不同,这里也顺带提一下:HashMap
2016-03-29 14:57:20
3491
1
原创 面试系列之AsyncTask源码深入解读
前言源码梳理前言安卓中经常会涉及到多线程问题,一般多用Handler+Runnable的组合来解决。源码中对其进行了精妙的封装,于是有了AsyncTask。相对于Handler+Runnable来讲,AsyncTask开启的异步,过程可控、结果可知,使用的线程池技术并发性能更好,封装优势明显,使用起来也比较简单,但在多个线程共同控制一个UI时,就表现的繁琐不便。具体的比较,可参看
2016-03-23 20:23:15
527
原创 Android进程间通信
前言AIDLMessenger前言安卓开发中,提到进程间的通信,大部分人第一个想到的必是AIDL无疑。可以理解,Android系统中,出于安全考虑,进程是每个应用的安全边界。各个应用程序都运行在自己的进程里,它们之间一般不能直接进行数据交换。传统的Corba、Java技术采用RMI(远程接口调用)来解决不同进程之间的通讯,Android设计者模仿了这一做法,提供了AIDL Service或者M
2016-03-18 16:47:02
471
原创 java动态代理实现
为什么要用动态代理动态代理的实现为什么要用动态代理我们开发软件的过程中,通常会有各种各样的相同代码重复出现。遇到这种情况,一般会有三种做法,最不可取的是一路“复制”,“粘贴”到底,写起来挺爽,要是去维护,简直是噩梦;稍有经验的都会将这些重复的代码独立出来,在别的地方直接引用即可。但这样也有一个问题,程序中必须要硬编码去直接调用独立出来的方法,有没有一种即可以执行独立方法,又不用硬编码调用的优雅方
2016-03-15 10:30:41
892
原创 JAVA集合汇总
四大集合概述Set集合List集合Queue集合Map集合重要的工具类:Collections一些其他的接口四大集合概述与数组相比,集合最大的特点是具有映射关系,它里面只能盛装对象(对象的引用),而数组却是什么都能装,什么都能放,所以才有了那句屌屌的言论”有了数组和对象,就可存放下一切数据”。提到集合,就不得不说Collection和Map,这两个接口是集合的根,java中所有的集合都
2016-03-10 10:25:45
766
原创 java垃圾回收机制
垃圾回收的意义java中的垃圾回收机制对象在内存中的状态探秘finalize()方法强引用、弱引用、软引用、虚引用垃圾回收的意义也许是保护环境吧。人类生活生产,总会产生各种各样的垃圾,这些垃圾都怎么处理?一般无外乎挑挑拣拣,分分类,能回收的当然好,回来洗洗消毒继续用;不能回收的也没办法,埋了烧了?总之是对外界有一些不好的影响,这些不好的影响在程序猿看来,就是系统泄露,更具体一点就是内存泄漏
2016-03-07 10:08:27
735
原创 Java类加载器(自定义类加载器)
为什么要有类加载器类加载的过程初识类加载器类加载机制自定义类加载器为什么要有类加载器我们知道java中所有的二进制文件,最后都是要放在jvm中解释运行的。纯粹的二进制文件,其实并没有什么卵用。jvm在第一次使用或者预加载时,都要将某个类的二进制文件加载进去,这时候不可避免的需要用到一个加载的触手,就是这个类加载器啦。类的加载过程简单来说,一般可分为加载、连接、初始化三个过程。加载,顾名思义
2016-03-03 15:42:52
5601
原创 java基础:常见的概念问题,面试笔试可能会遇到哟
这几天在csdn上闲看大家的提问,发现有一些概念自己也顶不真,整理一下,以备不时之需。直接量 直接量就是程序中通过代码直接给定的值。java的语法支持为8中基本类型、字符串和null制定直接量。其中null类型比较特殊,只有一个值null。 关于直接量容易记错也是面试考试中经常命中的一点就是它的存储问题,典型的如下:String s1 = “nihao”; String s2 = “niha
2016-02-21 22:29:38
812
原创 史上最全:ant多渠道打包安卓工程(一)
初识ant网上看到一些说ant构建已经不太现实的言论,想想也是,google的android studio广受欢迎,它推崇的gradle使用起来方便快捷,似乎已成主流,笔者确有体会。回头整理工程,心血来潮,想试试ant,竟然整理了半天没弄出来,哎,真个是饭可一日不食,学不可一日而止呃。ant是Apache基金会提供的一个打包工具,可以很方便地将软件编译、测试、部署等步骤联系在一起,自动化有序进行,也
2016-02-17 22:16:37
779
原创 java中的Lambda表达式
Lambda运算符因其方便简洁等原因,早已成熟地被运用在C++、C#等编程语言中。作为一个重大更新,java 8终于引进这个已被广大开发者期待已久的新特性,本文初探这一特性,作引路之用。为什么要用Lambda表达式语法适用范围函数式接口特点使用总结为什么要用Lambda表达式刚开始接触这玩意,也想了很久:为什么非要用这个语法,又挫又怪又丑?总是不愿正眼瞧它,后来想想,作为一名程序猿
2016-02-04 18:46:03
2086
原创 BLE4.0蓝牙开发的必经之路
最近,翔飞人退役了。始终振翅的飞人最后还是落了地。伤病无情,英雄迟暮。祝福他换片天空再次起航ing。前一阵子,被老板叫去搞项目。说是要用到蓝牙,一琢磨,网上不多的是,下了一个蓝牙聊天的demo,翻来覆去就这点东西嘛,还不是小意思,搞了半个月,信心满满地跟硬件工程师交流,我擦嘞,这什么玩意,完全不一个系统嘛。这算是跟蓝牙的第一次正面交锋吧。借着物联网啦,工业4.0啦的势头,蓝牙发展到今天,算是风生水起
2015-04-08 17:49:29
14655
9
ant-contrib-1.0b3-bin.jar
2016-04-11
BLE4.0读写示例(read and write)
2015-04-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人