自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

许佳佳的博客

热爱生活,热爱技术,热爱互联网,热爱祖国。

  • 博客(332)
  • 资源 (60)
  • 收藏
  • 关注

原创 【StudyWebView】android webview架构的一种新思路

github项目地址https://github.com/Double2hao/StudyWebviewStudyWebView架构StudyRouter架构如上图,主要几个模块的功能如下:webview客户端的webview,可以是view,也可以是界面。H5运行于webview上,webview是H5与客户端交互的媒介。BridgesBridges处于业务进程。H5通过单一的通道来调用客户端的功能,由于客户端部分业务会处于业务进程,因此webview会将需要调用业务进程的逻辑封装成b

2021-04-06 20:53:19 65

原创 由浅入深 学习 Android Binder(十)- 总结

概述笔者在大学学习Android时也一直对Binder非常有兴趣,奈何多次探索,多次无功而返。现在想想,不仅是缺乏Binder实践的经验,更多的也是故步自封,没有考虑过直接剖析native层源码来理解binder。(那时候总想着java层都还没搞明白,直接看native层没有意义)后来随着工作经验的积累,对Binder和多进程也有一定的实践经验,再次回顾时,发现很多细节也是可以理解了,于是就开始思考如何去整理Binder这一些系列的知识。我个人非常明白,不能”直接开始解析某个类“地来写,这样的后果就

2021-01-17 11:35:16 166

原创 【StudyRouter】路由的自动注册

StudyRouter项目地址:https://github.com/Double2hao/StudyRouter此项目通过使用动态编译、注解解释器等技术,用最简单的方式实现了路由的自动注册。如对这方面知识有兴趣的朋友可以看看。实现通过注解解释器生成辅助类通过Transform出辅助类和要注入代码的位置。在相应的位置调用辅助类的相关代码,实现自动注册。涉及知识点列表笔者...

2020-04-19 08:18:27 355

原创 由浅入深学习android input系统(二) - input事件如何传递到app进程( InputDispatcher )

概述前文已经解析的内容是:app进程在接收到input事件后,最终传递到View,经过了哪些操作。本文将继续探索 android input系统,分析下系统进程是怎么将input事件传递到app进程的。InputDispatcher的事件分发系统进程的input事件都通过InputDispatcher这个类来进行分发。比如当有触摸事件发送过来时,InputDispatcher会对其进行判断来分发给哪个进程,哪个window。调用任务栈如下:InputDispatcher.dispatchOnc

2021-06-08 08:18:37 185 5

原创 Android 混淆 小结

概述官方依赖文档:https://developer.android.com/studio/build/shrink-code?hl=zh-cn不管是独立开发app还是开发aar,混淆都是必须了解的一个模块。混淆作用缩小包大小使关键代码对外不可读开启混淆将minifyEnabled设置为true,就可以打开混淆proguard-android-optimize.txt ,是android预设的混淆规则,包含了大多数常用的混淆规则,比如activity的名字不混淆。proguar

2021-06-01 08:27:00 28 2

原创 由浅入深学习android input系统(一) - input事件如何传递到View

概述”View的事件分发“对于大多数android开发者而言都是比较熟悉的。对此还不了解的读者,推荐看下笔者的相关文章:完全理解android事件分发机制那么这个事件究竟是如何从“触摸屏幕”到“View处理事件”的呢?本系列将针对此疑问展开。ViewRootImpl对事件的传递View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过ViewRootImpl将更新U

2021-05-24 08:51:07 35

原创 ViewRootImpl源码解析 (二) - 事件分发

概述前文链接:ViewRootImpl源码解析 (一) - View的更新前文讲了ViewRootImpl中View更新相关的逻辑,此文将讨论下ViewRootImpl中的事件分发逻辑,或者说是事件回传逻辑。此处先列出笔者的个人对ViewRootImpl的理解,如有问题欢迎评论指正。View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过ViewRootImpl将更新

2021-05-20 09:08:40 20

原创 ViewRootImpl源码解析 (一) - View的更新

概述前文讲解了windowManager.addView() 源码相关的知识,有兴趣的读者可以看下:前文讲到ViewRootImpl,但是属于浅尝辄止,没有继续深入了,因此笔者再开几篇文章,继续深入讲下ViewRootImpl的源码。此处先列出笔者的个人对ViewRootImpl的理解,如有问题欢迎评论指正。如下:View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过

2021-05-10 08:07:18 353 6

原创 Android Window系列(二)- windowmanager.addview源码解析(View的更新)

概述前文讲解了window与decorview相关的知识点,有兴趣的读者可以看下:本文将继续探讨下window与view的关系,主要针对“如何在window中添加view”来进行探索。如何在window中添加View这样的场景有非常多,有如下例子:activity在启动的时候向window中添加viewdialog在启动的时候向window中添加viewtoast在启动的时候向window中添加view悬浮窗activity在启动的时候向window中添加view相关逻辑的任务栈调用

2021-05-06 07:57:32 80

原创 我们越多地理解世界,也就越多地理解自己

近期看了罗翔老师的读书课程,过往经历浮现眼前,一下子突然想明白很多事情。总觉得这些想法对于自己而言应当是宝贵的东西,自己不想它们只在脑中一晃而过,于是作此文记录一下。应当是有较大的个人偏见,也没有抱着要教育读者的姿态,如有滑稽搞笑的地方,期望读者能一笑而过,当然也欢迎评论交流。读书仅为了补全自己心中的世界我初中班主任老师经常会给我们传递一种观念,就是要”多读书”。至于为啥要多读书,我其实并不知道,也就是在这样观念的教育之下,我初中读了大量的书籍,比如有学校特别推荐的《钢铁是怎样练成的》,有恶补小学

2021-05-01 18:32:06 101

原创 Android Input子系统为什么要使用socket,而不是binder?

概述此文出自笔者回答的一个知乎问题,原问题:Android Input子系统为什么要使用socket,而不是binder?Android Input子系统为什么要使用socket,而不是binder?近期正好学习到Binder与input系统相关的知识,觉得这个问题非常有意思。使用socket而不使用binder的原因非常多,笔者仅根据自己的认知回答一下,一定会有考虑不周的地方,有想法的读者可以评论补充或者交流。如果使用binder,会有哪些问题?binder与socket相比太耗资源了。

2021-04-27 21:03:00 64

原创 Android Window系列(一)- window与decorview

概述window是android中非常常见的一个概念。Activity、Dialog、Toast这些常用的知识点都是和window密不可分的。因此,笔者整理了下window相关的知识,期望能对需要的读者有所帮助。window官方描述Window源码中对window的描述如下:/** * Abstract base class for a top-level window look and behavior policy. An * instance of this class should

2021-04-25 07:50:02 3007 6

原创 android gradle 多渠道打包小结

概述多渠道对于android来说是一个比较常见的概念,举几个常见的用法:根据不同的渠道使用不同的资源根据不同的渠道使用不同的依赖根据不同的渠道作不同的数据统计根据不同的渠道,游戏app中对应不同的服务区github地址本文项目基于笔者自己写的demo,对其有兴趣的读者可以自行下载:https://github.com/Double2hao/MultiChannelTestandroid studio的多渠道如果要使用多渠道,仅需要在该项目的build.gradle文件中增加以下代码:

2021-04-08 20:57:15 2856 3

原创 由浅入深 学习 Android Binder(十一) binder线程池

Android Binder系列文章:由浅入深 学习 Android Binder(一)- AIDL由浅入深 学习 Android Binder(二)- bindService流程由浅入深 学习 Android Binder(三)- java binder深究(从java到native)由浅入深 学习 Android Binder(四)- ibinderForJavaObject 与 javaObjectForIBinder由浅入深 学习 Android Binder(五)- binder如何在.

2021-03-22 08:51:19 302

原创 android aar 自动引入依赖

概述android 生成aar后,引用此aar的项目不会自动引用 aar中的依赖,一般情况下,需要开发者在使用这个aar的项目中再自己手动添加需要的依赖。那么如何能让一个项目引用aar后,自动引入相关的依赖呢?实现方式上传aar到maven仓库前,修改maven中的pom文件,在其中写入aar相关的依赖。build.gradle代码plugins { id 'com.android.library' id 'maven'}android { compileSdkVersion

2021-03-13 19:32:48 170 2

原创 迁移或备份csdn文章小结

概述一直想要备份下自己CSDN的文章,目前光原创的就有300多篇,完全手动备份太耗时间,于是准备写代码来实现。大概思考了下,备份差不多需要以下几部分:备份文章的markdown文件备份所有文章中的图片(毕竟很多都是亲手画的,都是心血)替换所有markdown文件中图片的url最终效果最终备份了300多篇文章和400多张图片,总共700多个文件,如下图:下载所有图片和替换所有url的总耗时 2分29秒,如下图:备份markdown这个部分直接在github上找到了现有的项目,相关项

2021-03-13 19:25:35 64 1

原创 android小程序多任务栈管理

概述微信小程序要知道什么是小程序的任务栈管理,直接看微信小程序即可:一次最多启动5个小程序小程序启动到达上限后,会关闭最久未使用的小程序,并且打开新的小程序。微信小程序使用时,如下图:实现要点小程序的任务栈管理,主要有以下要点:如何启动多个任务栈的小程序如何限制任务栈的启动个数DemoDemo的github地址如下:https://github.com/Double2hao/ProcessTaskTestDemo如下图:Demo中打开多任务栈的场景如下:关键实

2021-03-02 07:17:48 268

原创 android监听软键盘弹出弹回事件

概述针对“软键盘的遮挡”问题,最简单的方式就是将activity的windowSoftInputMode设置成adjustResize或者adjustPan。android:windowSoftInputMode="adjustResize"android:windowSoftInputMode="adjustPan"其效果一般如下: 如上图,这样设置后能保证“当前操作的布局”在软键盘之上。但是实际业务场景,可能需要的是“将整块布局”设置在软键盘之上,即Demo中的两个输入框和按钮都需要在软

2021-02-11 07:50:15 158 1

原创 Android 进程恢复

概述在android多进程的场景中,进程被意外杀死的情况非常场景,可能是用户手动杀死进程,也有可能是操作系统内存不够主动回收。某个进程被杀死,会导致其他进程与这个进程的通信失效,因此,一旦发生这种情况,就需要在其他进程,对这个被杀死的进程作“进程恢复”。进程恢复重要步骤在进程死亡的时候重启进程。检查进程间通信逻辑,如果失效需要做恢复。此处的恢复,简单来说就是一些初始化操作,可能包括io,网络等操作。DemoDemo 的github地址:https://github.com/Doubl

2021-02-10 11:08:08 79

原创 Android跨进程传图片(解决TransactionTooLargeException)

跨进程传图片方案直接intent传bitmap使用文件读写intent传递自定义binder,binder中传递image使用网络传输直接intent传bitmap优势使用简单劣势相关代码可能有侵入性,必须在四大组件中接收。intent传递数据的总大小是1MB,其中还包括启动四大组件相关的信息。因此使用intent传递的图片不宜超过500KB,甚至应该更小,因为还可能会传递其他数据。如果通过此方案传递大图片,必须先压缩后传输。开发者需要自己评估业务场景是否适用,毕竟很多场景不

2021-02-10 07:28:21 185 3

原创 序列化小结

为什么要序列化wiki的描述如下:序列化在计算机科学的资料处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。笔者个人理解如下:序列化:“把当前环境的数据结构 转化成一种 可存储 或者 可传输的形式” 的过程。反序列化:”这种可传输或者可存储的形式 还原成 当前环境的数据结构“的过程。此处为了便于读者理解举个例子:现在有一个 Student类,有name,age等参数。需求一

2021-02-09 06:29:49 124

原创 由浅入深 学习 Android Binder(九)- service_manager 与 svclist

概述前文讲过了java层与native层的IServiceManager,两者最终其实都是通过transact方法 走到了binder driver。之后binder driver便会把工作交给service_manager来处理,这个类的path是/frameworks/native/cmds/servicemanager/service_manager.c。前文地址:由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(

2021-01-17 11:26:39 183 2

原创 由浅入深 学习 Android Binder(八)- IServiceManager与BpServiceManager(native层)

概述前文已经讲解过java层ServiceManager的逻辑,如果没有了解过的读者建议看下:由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(java层)此文承接前文,继续讲下在native层的IServiceManager,具体的path是/frameworks/native/libs/binder/IServiceManager.cpp。native层还有/frameworks/native/cmds/servi

2021-01-11 08:34:26 282

原创 许佳佳的2020,疫情下格外有意义的一年

晚上11点仍在工作的医务工作者这张照片拍摄于2020年12月30日晚上11点多。我们在西二旗租的房子附近,近期来过一名新冠的患者,因此安排了集体的新冠检测。我和老婆本来是安排下午4点的检测,由于人员过多,一直等到晚上10点多都没有安排上。尽早的拿到检测结果,在家隔离的我就可以尽早去公司上班,毕竟在家工作的效率还是太低了。最终我们是当天没有安排上,在第二天中午又重新安排的检测。本来是一件很让人烦躁的事,看到这张照片的时候莫名的平静。我们的那些小事与 在疫情中失去或付出更多的人们相比,又算得了什么

2021-01-05 08:49:13 377 2

原创 由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(java层)

概述ServiceManager于android binder来说是非常重要的一部分。ServiceManager在java层与native层都有各自的逻辑,本文主要讲下java层ServiceManager的逻辑。如果了解过binder的读者,可能也多少会听说过binder与serviceManager的关系为了方便读者有个整体的认知,附上整体的流程图:何处使用了ServiceManager前文由浅入深 学习 Android Binder(二)- bindService流程中,在clie

2021-01-04 08:47:51 480

原创 从小地方到大城市,是“翻身的起点”还只是“昙花一现”

我和老婆都是从小地方来的北京,现在工作于某个短视频互联网公司。近期,我和我老婆在慢慢筹备婚礼,因此会不由自主的畅想未来。结果想来的更多的,,其实是焦虑。大城市 or 小城市如果想在大城市安家,那么仅仅房子就可能是压死我们的一座大山,更别提还要考虑车位、车牌、小孩的学区这些。如果想要工作几年回小城市,那么回去就等于失业,或者说等于是放弃了作为程序员的职业生涯,小城市很少能有相关岗位,更别提公司前景,是否能涨薪这些了。而作为程序员,目前网上经常说的35岁危机,也的确是骇人听闻。不同的自我定位想想块

2020-12-27 09:44:28 181

原创 由浅入深 学习 Android Binder(六)- IPC 调用流程

概述如果使用aidl来进行IPC,在client进程执行的transct方法后最终会执行到server进程的onTransact方法,如下图:对aidl还不是很了解的读者可以看下笔者的前文:由浅入深 学习 Android Binder(一)- AIDL那么在client进程调用transact后,究竟触发了哪些逻辑呢?本文将针对此点深入探索。此文探讨的是两个进程之间的IPC。如果是同一个进程之间调用,流程会简单一些,有兴趣的读者可以自行探索。调用流程先给出流程图,便于读者有一个整体

2020-12-19 07:55:03 528 2

原创 由浅入深 学习 Android Binder(五)- binder如何在进程间传递

概述前文分析过bindService源码,该文章地址如下:由浅入深 学习 Android Binder(二)- bindService流程最终得到时序图如下:如上图,client进程与server进程是通过系统进程来进行通信的。实际demo中,有两个场景我们会接触到binder:client进程通过serviceConnection获取到系统进程传递的binder。server进程将service.onbind()返回的binder传递给系统进程。我们就以server给系统进程传递bi

2020-12-12 10:16:49 331

原创 由浅入深 学习 Android Binder(四)- ibinderForJavaObject 与 javaObjectForIBinder

概述前文已经解析了java层binder在native层的形式。前文地址:由浅入深 学习 Android Binder(三)- java binder深究(从java到native)前文由于篇幅限制,没有继续探索JavaBBinder与BinderProxy,此文则将继续深入相关逻辑。ibinderForJavaObject 与 javaObjectForIBinderjava与native之间通过JNI来实现数据的传递与交互。主要就是通过native层的ibinderForJavaObje

2020-12-11 08:31:36 239

原创 由浅入深 学习 Android Binder(三)- java binder深究(从java到native)

概述前文地址:由浅入深 学习 Android Binder(二)- bindService流程前文讲到bindService流程,其中多次碰到用binder实现的IPC,有以下几个:client进程 通过IPC 通知AMS进程去bindServiceAMS进程 通过IPC 通知server进程去bindServiceserver进程 通过IPC 通知AMS进程bindService结果AMS进程 通过IPC 告诉client进程bindService结果本文就选择”client通知AM

2020-12-06 05:12:49 387

原创 由浅入深 学习 Android Binder(二)- bindService流程

概述前文已经讲过了binder在aidl的IPC中所起到的作用。其中的Binder是通过ServiceConnection+bindService获取到的。本文承接前文,详细探索一下从bindService到ServiceConnection.onServiceConnected()的流程。bindService流程bindService的流程其实有两种场景:Service冷启动Service热启动本文为了分析的更加全面,因此主要分析”Service冷启动“的场景。笔者此处先列出流程,读

2020-11-22 08:46:47 419

原创 由浅入深 学习 Android Binder(一)- AIDL

概述demo项目 github地址:aidl是常用的android IPC方式,本文将根据一个demo来解析下AIDL的原理。为了便于读者理解,本文不会探究Binder的实现细节,可以认为Binder在此文的分析中被看做是一个“黑盒”。有一定经验的读者可以直接到文末看总结,最终流程图如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bLrLwiAU-1605878532480)(evernotecid://214C33E9-92BC-434E-8AEC-B93

2020-11-22 08:37:59 2803 6

转载 Java8 JVM内存结构变了,永久代到元空间

JVM内存结构的细化为了更细化的讲解,我们将该图进行进一步的优化调整。针对java7及以前版本的细化。看出变化了吗?堆和方法区连在了一起,但这并不能说堆和方法区是一起的,它们在逻辑上依旧是分开的。但在物理上来说,它们又是连续的一块内存。也就是说,方法区和前面讲到的Eden和老年代是连续的。在继续进行下去之前,我们先来理解两个概念:规范和实现。规范和实现针对Java虚拟机的实现有专门的《Java虚拟机规范》,在遵守规范的前提下,不同的厂商会对虚拟机进行不同的实现。 就好比开发的过程中定义了接口

2020-11-13 21:28:21 362

原创 一篇文章理解进程、线程、协程

概述笔者之前已经对进程和线程有过了一定的探索,有兴趣的读者可以了解下:进程和线程的区别(Linux)近期笔者又接触到了协程,顺便也想尝试用一种更加通俗易懂的方式讲下这几个概念。期望能对有需要的读者有所帮助,如有理解不对的地方欢迎评论指出。为什么要有多进程?多进程目的:提高cpu的使用率例子:一个用户现在既想使用打印机,又想玩游戏。假设只有一个进程(先不谈多线程)从操作系统的层面看,我们使用打印机的步骤有如下:使用CPU执行程序,去硬盘读取需要打印的文件,然后CPU会长时间的等待

2020-11-01 08:17:42 573 2

原创 Android存储空间总结

概述Android存储在6.0之前,真的可以用“混乱不堪”来形容。造成的原因很多,个人认为有以下几点:android早期手机本身的内存很小,大部分app的读写都在sd卡内操作。用户权限意识薄弱,android 6.0之前直接在安装时申请权限,用户往往在未知情况下就给予了存储权限。app为了使自己的应用数据好看,直接将资源存储到sd卡,存储在sd卡的文件将不会计算成该app的内存占用。app处于卖方市场。如果不给存储权限用户就无法使用app部分甚至全部功能。目前,随着Android越发完善,

2020-10-25 08:45:36 1177 5

原创 Android 悬浮窗日志工具

概述github地址:https://github.com/Double2hao/StudyFloatUtil在多端交互的场景中,客户端往往只扮演着平台的角色。最常见的如webview,小程序等等——客户端虽然是最终程序的展现平台,但是逻辑却不会由客户端的工工程师来直接开发,而是由前端的工程师开发完后运行在客户端上。由于客户端的功能是由客户端工程师提前开发好后提供给前端的工程师调用,因此这些功能一旦出现问题,那么就需要客户端工程师和前端工程师一起联调沟通解决。类似于这样的场景中,为了减少开发和

2020-10-17 14:53:40 575

原创 android viewpager无限轮播

概述github地址:https://github.com/Double2hao/ViewPagerCycleTest一直很好奇ViewPager无限轮播的实现方式,于是稍微研究了下,作此文记录之,效果如下:原理一般情况下ViewPager的size等于显示的fragment的个数。无限轮播只需要,将ViewPager的size设置成无限大,通过取余后的值来显示Fragment即可。此demo中还加入了timer来自动轮播。并且如果用户手动滑动的话,自动轮播会停止。关键代码无限轮播

2020-10-17 10:57:36 11442

原创 mysql索引原理:B-Tree 和 B+Tree简介

本文参考:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41856完全不了解B-Tree的读者可以先看下这篇文章:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41844B-TreeB-Tree毫无疑问是树结构,如下图:主要有以下特性:d为大于1的一个...

2020-10-17 10:42:51 1143 2

原创 RecyclerView 回收机制解析

概述近期接触到RecyclerView回收机制相关的内容,于是作此文记录下相关探索。如记录的有问题欢迎评论探讨。定位回收机制源码笔者使用debug的方式,在adapter的onCreateViewHolder中打断点,于是得到该任务栈。思路:onCreateViewHolder是创建viewHolder的方法,那么在调用这个方法之前一定有是否复用的判断,因此断点在这个方法可以找到相关方法。然后我们就可以发现是RecyclerView#Recycler的tryGetViewHolderFor

2020-10-17 10:36:28 518

原创 git diff的生成方式:myers diff算法

概述本文参考:https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/每个开发者多少都接触过git的diff功能,如下图:该功能能够展示出某个文件的改动信息,非常便于开发者的日常开发。本文将探讨下此功能实现的原理。myers diff 做了啥引用个例子a = ABCABBAb = CBABAC现在要找出ab之间的diff。仔细想一想,我们会发现其实两者之间的diff情况是有无数个的,比如可以找到以下几

2020-09-20 08:21:43 825

android Jsoup获取网站内容(实例为新闻标题获取),android网络必学

近期做简单的新闻客户端界面使用到了Jsoup获取,使用起来特别方便,这也是被我一个学长称为学android网络必学的一个东西,在此也是分享一下自己近期所学。

2015-10-04

学生信息管理系统2222

#设计目的 1、网上很少有关于SQLite简单综合项目的测试APP。 2、把自己所学的部分UI综合一下,希望能给新手一些帮助。 #涉及知识点 1、包括SQLite的增删查找等功能。 2、RecyclerView展示 3、SharedPreference保存密码,以及判别是否是第一次安装APP。(如果是第一次就录入测试数据) 4、简单的Menu操作

2016-09-23

残缺棋盘 android实现颜色填充

原“残缺棋盘”题目: 残缺棋盘是一个2^k*2^个方格的棋盘,其中恰有1个方格残缺。图中给出,其中残缺部分用阴影表示。 这样的棋盘称为"三格板",残缺棋盘问题就是用这四种三格板覆盖更大的残缺棋盘。再次覆盖中要求: (1)两个三格板不能重复。 (2)三格板不能覆盖残缺棋盘方格,但必须覆盖到其他所有的方格。 添加要求: 使用图形化界面实现颜色填充残缺棋盘

2016-05-17

onMeasure简单方法 完美解决ListView与ScollView!

近期做项目碰到ScrollView与Listview冲突的情况,查看了网上一些解决listview和scollView的冲突的方法,最终选择了重写onMeasure的方法来解决这个问题。 在此对各种方法做一个个人的总结评价。 主要的方法有四种: 1、手动设置ListView高度(比如把高度设置为200dp) 评价:特别简单无脑,但是大大提高了代码的耦合性,比较适合“图方便”的新手。 2、使用单个ListView的addHeaderView()方法(给listview设置顶部固定的一个view) 评价:比较简便的方法,但是如果顶部布局需要监听滑动事件,也不可取。 3、使用LinearLayout取代ListView(重写LinearLayout) 评价:完全可行,但是让一个LinearLayout来实现Listview的功能真的觉得好奇怪啊。 4、重写ListView的onMeasure() 评价:只需要写几行代码,轻松解决冲突问题。不仅降低代码耦合性,而且简单。唯一的缺点,可能就是理解需要花比较多的时间。

2016-05-22

实验一 直接法解线性方程组(android)

一、实验目的 掌握Guass列选主消去法,三角分解法解线性方程。 二、实验内容 分别写出Guass列选主元消去法,三角分解法的算法,编写程序上机调试出结果,要求所编程序适用于任何线性方程组问题,即能解决这一类问题,而不是某一个问题。 实验中以下列数据验证程序的正确性 1、Guass列选主元消去法 [2.5 2.3 -5.1][x1] [3.7] [5.3 9.6 1.5][x2]=[3.8] [8.1 1.7 -4.3][x3] [5.5] 2、Doolittle三角分解法 [ 2 10 0 -3 ] [-3 -4 -12 13] [ 1 2 3 -4 ] [ 4 14 9 -13]

2016-04-14

Android应用开发-护眼提醒

设计初衷: 在学习《第一行代码》的服务那章时,涉及到了alarmmanager的内容。然后笔者当时正好在关注“程序员如何保护眼睛”的问题。 于是便自己做了一个demo,用于每一个小时左右提醒一次,后来周围的朋友看到我有这个定时提醒,觉得比较新鲜,便说你以这个创意单独做一个APP吧。 鉴于软件的个性化,我在此款应用中也是加入了自己设置图片,设置提醒文字等功能。朋友说个性化振动是一个亮点。

2016-01-13

android socket聊天室——也不仅仅是聊天室

#前提概要 笔者很久之前其实就已经学习过了socket,当然也是用socket做过了聊天室,但是觉得此知识点比较一般,并无特别难的技术点,于是也并未深究。 然而近期一个项目中对socket的使用却让笔者感觉socket强大无比,可以实现诸多功能。 #个人Socket体验 项目主要有关智能家居,需要实现多台手机同时对灯进行操作(开或者关),主要需要实现以下几点: 1、进入界面时获取所有灯的状态。 2、一台手机改变了灯的状态,其他的手机上可以有所显示。 3、硬件上改变了灯的状态(手动开关灯),所有手机上要有所显示。 此功能如果使用HTTP读取的方式实现就不太合适了。一方面客户端与服务器读取文件的同步性难以保证,即使保证了,也需要浪费大量性能;另一方面,类似笔者的这种项目功能服务器和客户端交互比较频繁,对“即时性”要求也比较高,用HTTP不仅性能消耗太大,而且难以保证“即时性”。 但是使用Socket就很容易实现了,主要逻辑如下: 1、每次进入界面与服务器建立Socket连接,并得到此时灯的状态 2、每次需要对灯进行操作的时候建立一个线程把灯的状态传递给服务器,服务器接收到之后,把该状态传递给每一个此时与服务器建立连接的客户端。

2016-11-21

图片文字轮播效果(图片和文字自动滚动)

轮播是类似知乎日报上的一个轮播效果,如下图。

2015-10-04

android 通知的使用小实例(振动,灯光,声音)

android 通知的使用小实例(振动,灯光,声音)

2015-10-26

android Fragment与Activity交互,互相发数据(附图详解)

笔者近期看官方training,发现了很多有用又好玩的知识。其中,fragment与Activity通信就是一个。 fragment与Activity通信主要是两点: 1、fragment传递信息给Activity 此点是通过在fragment中定义接口与Activity共享数据。 2、Activity传递信息给fragment 此点主要是通过fragment的getArgument()和setArgument()两个函数传递bundle来传递。

2016-03-26

android viewpager+fragment做主界面(超容易理解的demo)

笔者之前已经写过了关于viewpager的demo,但是之前是通过将Activity转化为view,然后放入viewpager实现的,具体操作中有时候还是不如fragment方便。 之前的viewpager demo的地址:http://blog.csdn.net/double2hao/article/details/50183567 主要实现的功能与之前的一样: 1、滑动的同时改变标题栏 2、点击标题栏的同时滑动 3、点击fragment中的button能有toast提示

2016-01-03

FragmentTransaction使用全解

#前言 之前已经写过用Fragment做主界面以及Fragment与Activity通信的文章。两篇文章如下: [ndroid viewpager+fragment做主界面(超容易理解的demo!)](http://blog.csdn.net/double2hao/article/details/50450377) [android Fragment与Activity交互,互相发数据(附图详解)](http://blog.csdn.net/double2hao/article/details/50983820) 对于Fragment还剩FragmentTransaction没有具体讲到,此篇文章就讲一下FragmentTransaction的主要用法,也是对之前的回顾。

2017-03-03

android 记事本demo(listview与SQLite)

android记事本的demo在网上一搜一大堆,但是大神写的demo往往功能太多导致新手难以着手,很难啃得动;而一些新手写的demo又往往是东拼西凑,代码很多都是copy的别人的,直接放在项目里面用,也不知道代码有什么作用。往往代码特别丑,重复性的代码也比较多。 笔者近期学到此处,自己理解之后也还是打算写个demo供新手学习一下。代码说不上优雅,但在笔者看来已经尽力去让人容易理解了。 为了便于新手学习,在此也是罗列一下涉及的知识点: 1、SQLite的基本使用,增删查改 2、listview,adapeter的基本使用 3、activity生命周期 4、intent、bundle传递参数 5、AlertDialog的基本使用

2015-12-13

android 后台定时提醒(Service,AlarmManager的使用)

笔者最近将工具书上Service的有关内容都学习了一下,于是打算做一个小应用来练一下手了。 考虑到自己每次在敲代码或者打游戏的时候总是会不注意时间,一不留神就对着电脑连续3个小时以上,对眼睛的伤害还是挺大的,重度近视了可是会遗传给将来的孩子的呀,可能老婆都跟别人跑了。 于是,为了保护眼睛,笔者便做了个如下的应用: (界面为了便于让新手理解,所以做的比较简单,并且没有设置背景图片,也没有设置APP桌面图片,有心的读者完全可以放上自己或者对象的图片,然后做的比较个人化)

2015-11-08

ASP.NET 个人信息注册页面,并跳转显示

#题目 新建一个MVC项目,利用HTML、CSS、JS、jQuery、Ajax、jQuery UI等技术设计一个个人信息注册页面。当点击“提交”按钮时,跳转到新的页面显示录入信息。 **基本要求:** 用户名为6-10个小写字母(小写使用正则式验证,且用户名不能为“wustzz” –用Ajax技术来检测);密码为6位数字,确认密码不一致时有提示;籍贯使用级联(jquery实现);Email必须符合Email格式;手机是11位(假设规定以1569开头);出生年月使用jQuery UI日历组件设置;图片要传递到新的页面显示。

2016-11-23

android nextFocus使用详解

近期在学习android官方sample,学习到nextFocus的时候花了一些时间,并且也是觉得比较有用,所以拿出来分享。 效果:

2016-02-26

学生宿舍管理系统 学生宿舍管理系统

【题目】学生宿舍管理系统 考查点:线性结构、文件操作 注意:必须使用文件存储数据,不得使用数据库管理系统。 任务:通过此系统可以实现如下功能: 录入: 可以录入宿舍情况,包括宿舍号、可容纳学生数、已容纳学生数、男生/女生宿舍等信息; 可以录入学生住宿情况,包括学号、姓名、性别、宿舍号等信息。 其他信息可以自行设计。 分配宿舍:为每一个学生分配入一个未住满的宿舍。能否提供一个智能分配算法?推荐选择?批量分配?鼓励创新。 调换宿舍:实现一个学生调换宿舍操作以及两个同性学生互换宿

2016-03-04

android XML动画初步解析(activity界面之间跳转demo)

上一篇文章android 简单地设置Activity界面的跳转动画讲了简单的activity界面之间的跳转,并且使用的是android内置的一些动画,此章就小提一下如何自己写一些动画来进行跳转。 按例,还是上一下效果:

2016-01-22

viewpager做主界面(可点击可滑动,超容易理解的demo)

笔者之前已经做过了一个使用viewpgaer轮播效果的博客,但是viewpager本身也是深受androider的喜爱,如今基本每个app都会用到相关的功能,本篇文章也是讲一下用viewpager做主界面的用法。 主要功能: 1、滑动的同时改变标题栏 2、点击标题栏的同时滑动

2015-12-05

android短信加密(发送加密短信,解密本地短信)

短信加密此类功能由于新手学习的需求量较小,所以在网上很少有一些简单的demo供新手参考。笔者做到此处也是花了比较多的时间自我构思,具体的过程也是不过多描述了,讲一下demo的内容。(源码在文章结尾) demo功能: 1、可以发送短信并且加密(通过改变string中的char) 2、能够查看手机中的短信 3、能够给收到的加密短信解密。 涉及到的知识点: 1、intent bundle传递 2、ContentResolver获取手机短信 3、listveiw与simpleAdapter 4、发送短信以及为发送短信设置要监听的广播 遇到的问题: 1、发送短信字符过长会导致发送失败 解决方法:设置

2015-12-25

android 用java动态设置布局(增添删除修改布局)

XML对开发者来说十分的方便,不仅使用起来简单,而且能够及时调试,修改界面之后马上能看到效果,Java不具有这个优势。但是java却可以动态对布局进行操作,这是xml所做不到的。笔者认为,新手索要掌握的java动态设置布局主要有两点,一方面是对布局的属性进行修改,另一方面是增添和删除控件。

2016-02-05

android 自定义AlertDialog 与Activity相互传递数据

主要实现功能: 1、从Activity的TextView中获取字符串设置到AlertDialog的TextView和EditText中 2、将AlertDialog的EditText中的值设置到Activity的TextView中 新手在自定义AlertDialog上的疑问笔者猜测主要有两个: 1、自定义的layout如何放到AlertDialog中? 解答: 获取到layout的view之后,直接调用AlertDialog.Builder的setView方法即可。 2、如何对自定义AlertDialog中的控件进行操作? 解答: 于fragment中的操作类似,首先要获取该layout的

2016-01-20

实验四 常微分方程的数值解

实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验三博客地址:http://blog.csdn.net/double2hao/article/details/51344145 【实验内容】 分别写出改进欧拉法与四阶龙格库塔求解的算法,编写成熟上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 求 y'=-xy^2 y(0)=2 (0<=x<=5) 步长h=0.25

2016-05-11

android修改控件外观(使用drawable资源)

使用drawable资源这方面是比较容易的,笔者学习并没有花太多时间,但是却是受益匪浅。

2015-12-03

android Fragment与Activity互相发数据(附图详解)

笔者近期看官方training,发现了很多有用又好玩的知识。其中,fragment与Activity通信就是一个。 fragment与Activity通信主要是两点: 1、fragment传递信息给Activity 此点是通过在fragment中定义接口与Activity共享数据。 2、Activity传递信息给fragment 此点主要是通过fragment的getArgument()和setArgument()两个函数传递bundle来传递。

2016-03-25

android ContentResolver的使用(获取和修改联系人信息demo)

ContentProvider和ContentResolver永远是相对的,本章主要是讲ContentResolver的使用,当然是在android系统提供ContentProvider的情况下。 ContentProvider与ContentResolver概念上的东西的就不讲了,主要讲一下ContentResolver的作用以及使用方法。 ContentResolver的作用: 1、可以通过ContentResolver来获取android内部的数据,比如联系人信息、系统的多媒体信息、短信信息等等。 2、可以获取提供了ContentProvider的应用的数据。 ContentResolver的使用方法:(参考《疯狂Android讲义第三版》446面) 1、调用Context的getContentResolver()获取ContentResolver对象。 2、根据需要调用ContentResolver的insert(),delete(),updata(),query方法操作数据库。 3、为了操作系统提供的ContentResolver,需要了解该ContentProvider的Uri,以及该ContentProvider所操作的数据列的列名,可以通过查阅Android官方文档来获取这些信息。 笔者个人意见: 1、建议新手读者在学完SqLite之后再来学习ContentResolver的内容,ContentResolver的insert(),delete(),updata(),query四个操作数据库的方法均与SQLite中的相同。 2、ContentProvider的Uri,以及该ContentProvider所操作的数据列的列名都不需要死记硬背,需要用的时候查阅一下即可,新手此处最好能自己全部写一下,对ContentResolver的使用有一个总体的了解。

2016-04-07

实验三 数值积分(android)

实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 一、实验内容 分别写出变步长梯形法和romberge法计算定积分的算法,编写程序上机调试出结果,要求所编程序适用于任何类型的定积分,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 求 (sinx)/x的积分,积分区间为[0,1]

2016-05-08

android 实现FlowLayout 流线布局(自定义ViewGroup)

#项目目的 1、深化自定义View的概念 2、将MeasureSpec、View的绘制流程、Layoutparams等分散的知识点整合成一个demo。 #项目灵感 笔者经验也是有限,此文章主要借鉴张鸿洋前辈的博客。 原文地址:http://blog.csdn.net/lmj623565791/article/details/38352503 #项目预览 ![这里写图片描述](http://img.blog.csdn.net/20161018184251886) #主要涉及知识点以及相关链接 ###1、MeasureSpec [快速理解android View的测量onMeasure()与MeasureSpec](http://blog.csdn.net/double2hao/article/details/51553703) ###2、Layoutparams以及MarginLayoutParams [Android开发:LayoutParams的用法](http://blog.csdn.net/double2hao/article/details/51438798) [MarginLayoutParams--一个可以在代码中直接设置margin的方法](http://blog.csdn.net/u011374875/article/details/52150471) ###3、View的绘制流程 [Android视图绘制流程完全解析,带你一步步深入了解View(二)](http://blog.csdn.net/guolin_blog/article/details/16330267) ###4、笔者自定View相关文章 [给自定义View添加xml属性](http://blog.csdn.net/double2hao/article/details/52117503) [android 自定义控件(底部icon点击效果)](http://blog.csdn.net/double2hao/article/details/51093896)

2016-10-18

android图片轮播效果,RollViewPager的简单使用

图片轮播算是我们用的比较多的一个功能,我之前也写过类似的文章(http://blog.csdn.net/double2hao/article/details/48896297),但是说实话自己写并不是特别方便,而且往往bug会比较多。而在github上有一些大神专门写了viewpager的轮播框架并且开源,供大家学习参考,这篇博客就教大家如何简单地使用开源框架RollViewPager。 对RollViewPager有兴趣,或者希望更深入学习的可以直接去github下载源码学习:https://github.com/Jude95/RollViewPager

2016-05-06

为RecyclerView添加分页加载(上拉加载更多)功能

上一篇文章已经介绍了如何为RecyclerView添加FootView,在此基础上,要添加分页加载的功能其实已经很简单了。 上一篇文章地址:[为RecyclerView添加FootView和HeadView](http://blog.csdn.net/double2hao/article/details/52787975)

2016-10-11

实验二 插值方法(android)

一、实验内容 分别写出拉格朗日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于在任何一组插值节点,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 已知下列函数表 X 0.56160 0.56280 0.56401 0.56521 Y 0.82741 0.82659 0.82577 0.82495 求X=0.5635时的函数值。

2016-04-22

给自定义View添加xml属性

笔者之前已经写过了一些自定义View的文章,在此对其也就不从头说起了,如有兴趣的读者可以看一下笔者的前两篇文章。 [android 自定义view的使用(最佳demo——返回标题栏)](http://blog.csdn.net/double2hao/article/details/50209249) [android 自定义控件(底部icon点击效果)](http://blog.csdn.net/double2hao/article/details/51093896) 笔者之前的文章中仅仅介绍了如何使用自定义View以及为什么要使用自定义View等等,但是在实际操作中,我们还是希望自定义View之后,直接能够在xml中就对其进行操作,如下图:

2016-08-04

RecyclerView超简单demo(局部更新取代ListView)

回顾上一篇写RecyclerView的博客(android RecyclerView布局真的只是那么简单!)。笔者比较具体地讲了一下自己对RecyclerView的理解,但是可能知识点比较杂乱,部分新手读者还是无法领会其意。正好笔者最近学习到“局部更新”的知识点,在此就再附上一个更简单的demo了。 为何要实现局部更新? 很简单,就是要提高效率。很多时候在一个列表中,我们只会修改一条item,如果直接使用notifyDataSetChanged(),未免显得有点浪费资源了。 如何实现的局部更新? 在RecyclerView出来之前,ListView如果要实现局部更新,首先要自定义一个ViewHolder,其次要自己写一个局部更新的函数。整体的流程算不上复杂,但是确实不是很方便,开发者们都会不由得想,为什么不直接官方就把这个写好啊。(ListView局部更新的例子在网上有很多,笔者在此处就不多加阐述了。) 然而,RecyclerView的出现就是帮了开发者们一个大忙了,RecyclerView.Adapter自带局部更新的函数,不需要自己写。

2016-06-08

完全理解android事件分发机制

#前言 之前笔者其实已经写过事件分发机制的文章:[快速理解android事件传递拦截机制概念](http://blog.csdn.net/double2hao/article/details/51541061) 但是,现在看来其实更像是一篇知识概括,多出可能未讲清楚,于是打算重写事件分发,用一篇文章大致讲清楚。 首先,形式上笔者最先思考的是使用源码,此者能从原理上讲解分发机制,比起侃侃而谈好得多。但是源码的复杂往往会让新手产生畏惧难以理解,于是笔者最终还是打算使用实例log来让读者理解android事件分发。 #重要函数 笔者此次主要提及最常用的几个函数: (其间区别看源码很容易理解,此处直接给上结果) **onClick():**这个函数是是View提供给我们的OnClickListener这个接口中的函数,在这里可以自定义对点击事件的处理逻辑。会在onTouchEvent()中进行调用。 **onTouch():**这个函数是View提供给我们的OnTouchListener这个接口中的函数,在这里面可以自定义对触摸事件的处理逻辑。 **onTouchEvent():**这个函数是view内部的触摸事件的处理方式,其间包括获取焦点,调用onClick()等等。 **dispatchTouchEvent():**这个是View的事件分发函数,在ViewGroup中进行重写。在View中其间会调用onTouchEvent(),在ViewGroup中其间会调用onInterceptTouchEvent()和onTouchEvent()。 **onInterceptTouchEvent():**这个函数是事件拦截函数,是ViewGroup才有的函数。

2017-01-12

快速入门android AIDL(开启多进程并进行通信)

为何要开启多进程?主要有两种情况: 一、一个应用由于自身需要采用多进程模式来实现。比如播放器之类,如果仅仅在service中运行会影响主线程的响应速度,很可能会造成ANR;如果仅仅在子线程中运行,一旦开启该线程的Activity被杀死后,线程也被杀死,无法实现后台运行效果,更加不合理。而如果在另外一个进程中使用service后台运行,就显得十分恰当了。 二、由于android对单个应用所使用的最大内存做了限制,为了加大一个应用可使用的内存,所以通过多进程来获取多份内存空间。 本篇文章demo重点: 1、开启多进程 2、两个进程之间使用AIDL进行通信

2016-06-10

android SharedPreference的简单使用(登陆界面记住密码)

SharedPreference方面的内容还算是比较简单易懂的,在此还是主要贴上效果与代码,最后也是附上源码。

2015-10-20

ASP.NET 电影票信息的增删查改

##题目 1、使用Code First技术创建一个Movie数据模型。 ``` public class Movie { public int ID { get; set; } //电影编号 public string Title { get; set; } //电影名称 public DateTime ReleaseDate { get; set; } //上映时间 public string Genre { get; set; } //电影类型 public decimal Price { get; set; } //电影票价 public string Rating { get; set; } //电影分级 } ``` 2、使用MVC相关技术实现数据的列表显示和新增功能。 3、完成数据的编辑、删除、明细和条件查询等功能。 4、完成如下查询: (1)查询尚未上映电影的信息 (4)查询票价在某个区间的电影信息

2016-12-14

Android单元测试-对Activity的测试

#前提概要 上一篇文章已经介绍了单元测试的作用和简单示例,如果不了解的读者可以先阅读上一篇[ Android单元测试-作用以及简单示例](http://blog.csdn.net/double2hao/article/details/77159380)。 这篇文章主要介绍常见的Activity中的测试。 #对Acitivity的测试 对于Activity,我们大致有两种测试需求: 1、在Activity正常启动后,查看界面布局是否正确,包括View的点击事件等是否正确。 2、需要在Activity启动前完成各种数据的部署,然后查看Activity的效果。 对于这两种需求,笔者分别做了两个示例解说: 1、检测一个布局中的button和TextView是否正确。 2、从网络动态获取String到Activity界面显示,并且这个图片的URL是由Intent传递过来的。

2017-08-14

最简易的网络框架封装(新手可看)

网络通信在Android上的重要性就不多说了。 demo就是获取到“https://www.baidu.com/”的HTML代码后显示在textview中。 如果仅仅实现这个功能需要的java代码绝对在10行以下,但是本片主要是讲一下简易框架的封装。 封装目的: 1、在同一个项目中,我们要执行网络操作可定不想要每次都编写一遍HTTP请求的代码。通常情况我们都会将这些网络操作提取到一个公共的类里面,并提供一个静态方法,

2016-09-07

从零开始写一个简单的ImageLoader框架

从零开始写一个简单的ImageLoader框架

2016-08-12

空空如也

空空如也

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

TA关注的人 TA的粉丝

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