自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

bdmh的专栏

QQ:515840062

  • 博客(195)
  • 资源 (12)
  • 问答 (1)
  • 收藏
  • 关注

原创 Android:ActivityTaskManagerService接管ActivityManagerService

ActivityManagerService这个服务,对于玩Android的开发人员,应该再熟悉不过了,它是掌管Activity的核心。不过从Android 10.0(API 29)开始,再看ActivityManagerService的代码,会发现,ActivityManagerService的工作已经被ActivityTaskManagerService这个服务接管了。具体我们就看看这里的变化。虽然说ActivityTaskManagerService接管了ActivityManagerServ

2021-12-01 16:50:28 3764

原创 Android:EditText长按选词的过程

在前面我们研究过下面两篇文章:​​​​​​​《看看Android源码中View是如何实现LongPress的》《Java:BreakIterator是如何取词的》那么在Android组件EditText中,当我们点击在某个文字位置时,长按,就会选中匹配的词语。如图:这个过程其实就是上面两篇文章内容的综合运用,下面我们就来看看实现过程。既然是在长按事件中触发的,那就直接定位到TextView的performLongClick方法,如果是EditText,则TextView中的如下变量可用.

2021-11-29 14:46:30 2539

原创 Java:BreakIterator是如何取词的

BreakIterator是Java提供的一个用来判断语言边界的类。给定一个字符串和一个索引位置,BreakIterator可以根据本地语言边界限定规则,找到这个索引前后,可以和它组成词语或句子的字符的索引,我们可以根据begin和end索引来获取这个单词。比如下面的字符串:Hello World当指定索引8时,也就是字符o和r之间时,用BreakIterator去分词,就可以得到World这个单词。看下面的图就能看到了。BreakIterator提供了四种边界判断getWord.

2021-11-25 10:37:11 812 1

原创 看看Android源码中View是如何实现LongPress的

除了最常用的点击事件(Click),还有一个长按事件(LongPress),比如长按弹出复制、粘贴的菜单,长按弹出自定义View等等。这篇文章我们就来看看Android源码中是如何实现长按事件的。既然是手势动作,那就逃不过onTouchEvent。直接找到View代码中的onTouchEvent。这个时间里面,首先会检查几个是否可点击的状态,比如点击、长按、环境点击(触笔、鼠标右键等)。final boolean clickable = ((viewFlags & CLICKABLE)

2021-11-23 09:19:06 1923

原创 Android:从源码看权重Weight的计算

一个Layout中,放置几个TextView,然后对每个TextView设置不同的宽度比例,设置权重属性layout_weight就是我们最常用的一个功能。弄明白权重的计算,有助于我们更精准的布局。假设有如下布局,我们考虑子控件的width都是match_parent,权重比为1:2:2。屏幕宽度为1080。 <LinearLayout android:layout_width="match_parent" android:layout_height="

2021-11-19 16:36:29 1153

原创 在Mac M1芯片下使用Android Studio模拟器

相信很多朋友都被Mac电脑的M1芯片坑了一把,很多诸如Docker、VirtualBox、Genymotiion、甚至连Android Studio自带的模拟器都无法使用了。好在各厂商都在努力解决这个问题。Android Studio的使用,可以下载专门为M1新版开发的版本。链接如下:https://redirector.gvt1.com/edgedl/android/studio/install/2020.3.1.25/android-studio-2020.3.1.25-mac_arm.dmg安

2021-11-19 10:34:08 9687 5

原创 扩展.net日志框架Serilog的WriteTo

Serilog作为日志框架,是一个不错的选择,ASP.net Core提供了很多关于Serilog的NuGet包,可以让你把日志输出到文件、控制台、数据库等。对于入库的日志,NuGet包提供的操作比较有限,有的甚至无法自定义字段,所以使用起来就不是那么友好了。所以我们需要对WriteTo进行扩展,写入我们自己的数据库表,自己的字段,采集我们需要的信息等等。这里需要用到.Net的类扩展功能。看看WriteTo是什么类型。public LoggerSinkConfiguration WriteTo

2021-11-18 16:14:11 1557 1

原创 JQuery的table2excel.js导出到Excel导致科学计数法问题的解决方法

打开table2excel.js文件,找到Plugin.prototype节点,修改mid节点内容,原始样式如下mid: "</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body>",现在我们给它加上样式,解决科学计数问题。mid: "</x:ExcelWorksheets></x:ExcelWorkbook>&lt

2021-09-14 15:53:08 1209 1

原创 VUE:No PostCSS Config found 解决

通过npm安装后,在vue中引用时,比如:import 'font-awesome/css/font-awesome.min.css'有时会遇到No PostCSS Config found的错误信息,网上这类大都是说在项目根目录下创建postcss.config.js文件,内容如下:module.exports = { plugins: { 'autoprefixer': { browsers: 'last 5 version' } }}当创建后,依然

2021-03-23 15:11:14 4901 2

原创 Android:让我们来写一写Binder

Binder作为Android中跨进程通信的一部分,在源码中是起了极其重要的作用。比如ActivityManagerService,就是通过Binder来控制Activity的操作。至于Binder的通信,很多文章都是通过创建AIDL工程,由工具自动生成代码,就会看到诸如Stub、Proxy等内部类,看的是一头雾水。所以要想明明白白的使用Binder,自己手写一遍,对理解是非常有效的。以下以在两个进程间通信为例来写一个Binder。客户端首先定义一个接口,包括Binder标识,发送Transac

2021-03-12 14:16:06 502

原创 Activity生命周期总结

Activity生命周期总结方式 生命周期 备注 单一Activity(启动) onCreate onStart onResume 单一Activity(关闭) onStop onDestroy ①MainActivity中打开TestActivity MainActivity: onPause TestActivity: onCreate TestActivit..

2021-03-09 14:17:29 275

原创 Android:别让ListView的各种scroll迷失了

目录scrollTo(View.java):不建议使用scrollBy(View.java):setSelectionFromTop(AbsListView.java);setSelection:(ListView.java)scrollListBy(AbsListView.java):scrollTo(View.java):不建议使用这个滚动是滚动的View的位置,并不是ListView内部的Item滚动,它是通过改变mScrollX或mScrollY的值,通过画布的tr.

2020-11-24 13:27:17 1029

原创 如何查找Manifest merger failed with multiple errors问题原因

做android程序,在gradle文件中免不了引入第三方的库,添加库之后,同步gradle,碰到Manifest merger failed with multiple errors问题,也不是什么稀罕事,但是一堆的编译过程提示的错误,看着头就大,无从下手。比如在某次编译时,出现如下错误。然后在Build Output面板中,看到的是如下任务出现错误:接下来我们看看如果通过查看日志,查找问题原因。命令 ./gradlew如果使用出现Permission denied错误,就先使

2020-07-20 11:06:39 584

原创 Android:ArrowKeyMovementMethod

我们之前在Android:MovementMethod,BaseMovementMethod和Android:LinkMovementMethod、ScrollingMovementMethod两篇文章中讲过TextView的两种MovementMethod的工作过程,这两种都是针对TextView而言的,那么对应可选择文本或者EditText,还有一种MovementMethod,那就是Arro...

2020-04-09 13:58:49 781 1

原创 Java:通过字节码看if-else和switch-case

条件语句是我们使用非常频繁的语法之一,其中if-else和switch-case最为常用,那很多同学也会有疑惑,这两种方式有什么区别,哪个效率更高一些呢。接下来我们就从字节码的角度,看看这两种方法的实现。先来看看if-else。public void foo(int i) { if (i == 1) System.out.println(1); else ...

2020-03-26 11:18:20 949

原创 Android:解读TextView的DynamicLayout

在《Android:TextView的Layout创建过程》中我们提到过,TextView中有三种Layout,我们已经讲了两种,今天我们就来说说第三种,动态布局DynamicLayout。我们平时使用的带链接的、ClickSpan等带样式的TextView,都会默认由这种布局进行处理。下面我们定义一个带链接的TextView。 <TextView android...

2020-03-25 10:26:26 1869

原创 Android:解读TextView的StaticLayout

StaticLayout用于布局之后,不会再进行编辑的文本。Android:TextView的Layout创建过程中提到过Layout创建的过程,所以这里直接从TextView的makeSingleLayout开始。当判断不满足DynamicLayout和BoringLayout之后,就会开始StaticLayout的创建。我们在布局中对TextView进行如下设置:手机屏幕密度为4。...

2020-03-17 11:11:42 2036

原创 Android:解读TextView的BoringLayout

A BoringLayout is a very simple Layout implementation for text that fits on a single line and is all left-to-right characters. You will probably never want to make one of these yourself; if you do, b...

2020-03-12 16:48:45 1482

原创 Android:TextView的Layout创建过程

TextView组件,使用频率非常高,虽然使用起来比较简单,但是它的实现其实是一个复杂的过程。它对文字的管理是通过Layout实现的。TextView内部会根据不同的设置,创建不同的Layout,总共有三种。DynamicLayout:用在EditText或者TextView中设置的是Spannable类型的文字(比如ClickSpan,URL等)。BoringLayout:常用在处理单行...

2020-03-10 11:25:21 1859

原创 Android:TextView的AutoSizeText实现过程

在实际开发中,我们经常会遇到,TextView区域固定,但字数不确定,又希望把文字信息都展示出来,IOS中可以轻松实现,但在Android上好想并没有这种实现。从8.0(API26)开始,TextView组件提供了autoSizeTextType、autoSizeMinTextSize、autoSizeMaxTextSize等相关属性,来满足这个需求,在8.0以前的版本,可以通过com.and...

2020-03-06 12:32:07 2134

原创 Android:看看Google工程师的手误

我们启动Activity,都会用到Intent,Intent需要传入Context参数,通常我们在Activity中使用Intent时,都会传入Activity的实例作为Context。但由于考虑到内存泄漏的风险,大都提倡使用ApplicationContext,所以很多同学就把Activity类型的Context换成了ApplicationContext,这时就发现,突然不能正常启动Activi...

2020-03-04 15:49:58 399

原创 Serializable是怎么工作的(反序列化)

在《Serializable是怎么工作的(写入)》篇文章中,我们大致了解了Serializable的写入过程,我们用到的是ObjectOutputStream,那与之对应的就是反序列化,把存入文件的二进制数据,读出来,转换为对应的实例对象,这次就该用到ObjectInputStream了。使用代码大致如下:TesyBean sBean = new TesyBean();String pat...

2020-03-03 10:15:03 277

原创 Serializable是怎么工作的(写入)

Serializable是Java提供的数据序列号接口,只要你的Bean继承自Serializable接口,那么就可以被序列化保存到介质中或者进行数据的传输。当我们查看Serializable的代码时,就会发现,里面什么都没有,那Java是如何处理继承了Serializable接口的数据呢?public interface Serializable {}既然Serializable...

2020-03-02 13:47:17 375

原创 String的比较,你都搞清楚了吗

String这个使用频率极高的数据类型,每个人都能说出很多关于它的使用情景。因为String相对于int等基本类型的内在差别,也常被面试官拿来拿捏面试者。不过确实,虽然我们每天声明无数次String对象,但是对于它的那些事,还是既熟悉又陌生,有点最熟悉的陌生人的感觉。所以今天汇总一下String的常见问题,诸如比较不同形式创建方法创建的对象、不同方法创建了几个对象等问题,结合字节码、源码及分析工具...

2020-02-28 12:42:14 7252

原创 从源码看int和Integer的面试题

int是一种基本数据类型,Integer是一个对象,需要实例化才能使用。它对int进行了包装,在Integer内部有一个对应的数值int变量。private final int value;int和Integer的对比,经常被拿来作为面试题,下面就多种情况,通过源码分析其结果。我们将比较“==”和Equals两种结果。第一种情况:Integer i1 = new Integer(...

2020-02-25 10:13:05 321 1

原创 Android:LinkMovementMethod、ScrollingMovementMethod

再上一篇文章《MovementMethod,BaseMovementMethod》中我们讲了Movement的基类,这里我们讲一下它的子类LinkMovementMethod和ScrollingMovementMethod,为什么把它俩放到一起呢?因为LinkMovementMethod继承自ScrollingMovementMethod。先来看ScrollingMovementMethod。...

2020-02-21 11:34:23 2561 2

原创 Android:MovementMethod,BaseMovementMethod

我们在使用TextView,EditText等组件时,可以会有光标的显示,可以选择文本,拖动轨迹球,滚动,长按弹出菜单等操作,这些都是MovementMethod的作用。MovementMethod是一个接口,提供了光标的位置、滚动以及文本的选择等操作。它会处理按键及Touch等操作。这个接口仅供系统调用。先来看看这个接口里面有哪些方法。//这里做一些初始化的工作public vo...

2020-02-11 14:57:32 1542 1

原创 Andorid:版本不匹配导致的Installation failed due to invalid APK file

最近将Gradle升级,新建项目,并在模拟器中运行,没想到出现了无法安装的错误。Installation failed due to invalid APK file查看LogCat日志,有Couldn't load memtrack module的错误提示。模拟题是 8.0-API-26,gradle的配制是 compileSdkVersion 28 buildT...

2020-02-01 11:14:43 1659 1

原创 Android:Parcelable序列化读写过程(Parcel)

Parcelable是为Android量身定制的序列化接口,底层是C的实现,通过内存来操作数据。Android中通过Binder机制传递Parcelable数据。Parcelable是一个接口,需要序列化的对象必须实现这个接口。而具体负责数据组装的是Parcel类。接下来,我们就以Activity间通过Intent传递序列化对象,来看看Parcel的工作过程。整个流程涉及到Activity...

2020-01-14 10:31:04 846

原创 Java:源码分析—反射(Method、Field)

在上一篇文章Java:源码分析—反射(实例化对象:newInstance)中我们了解了反射进行对象实例化的过程,既然对象有了,我们就要使用它,对于一个对象,我们最常用的就是方法和属性里,所以这一篇我们就来看看反射中的Method和Field。在Class.java文件的代码中,比较常用的关于方法和属性的是getMethods、getDeclaredMethods、getFields、getDe...

2020-01-09 09:54:17 381

原创 Java:源码分析—反射(实例化对象:newInstance)

今天我们来通过源代码,看看Java中反射是如何工作的。反射,其实在我们日常的编程过程中可能用的并不多,但是第三方的库,这个技术确实应用非常广泛的,包括我们在开发Android应用时,有时为了操作一些不开放的系统属性时,也会用到反射。这里我们将通过分析反射的运行,来看看Class这个类的功能。开始之前,先提到两个静态的整型变量,在java.lang.reflect.Member中。这两个变量...

2020-01-08 13:45:15 1012

原创 “+”真的可以替代StringBuilder吗

最近在头条上看到一篇帖子,说Java8开始,字符串拼接时,“+”会被编译成StringBuilder,所以,字符串的连接操作不用再考虑效率问题了,事实真的是这样吗?要搞明白,还是要看看Java编译后的字节码。先比较这样两段代码。最简单的字符串拼接,一个用“+”,一个用StringBuilder。 public void useOperator(){ String a...

2020-01-03 08:31:05 500

原创 Android:Volley框架分析(十)—— Cache的运转步骤

在上一节,Cache的主要方法分析完后,我们就看看Volley是如何使用Cache的。1、开启Cache选项request.setShouldCache(true);2、添加Request到队列,Volley先判断是否使用缓存,使用就添加到缓存队列,不使用就添加到工作队列(RequestQueue.class) public <T> Request<T&...

2019-12-30 10:19:07 239

原创 Android:Volley框架分析(九)—— Cache

目前只要是涉及到网络的框架,基本都要考虑缓存问题,在符合要求的情况下,实现快速响应并且减少网络交互。Volley同样也有一套自己的缓存策略,这一节就来讲讲Volley的缓存实现。因涉及到HTTP的缓存知识,这里只做简单描述,不做重点解释。Volley会把每个请求的信息,存储到本地文件中,文件名是根据url进行运算得到的,所以相同的url会得到相同的文件名。然后配合服务器返回的HTTP缓存信息,...

2019-12-30 10:07:22 216

原创 Android:Volley框架分析(八)—— ImageRequest

这节我们来看Request的另一个子类ImageReqeust,这个类是用来请求图像资源的。先看看使用方法。(图片实际尺寸1920*1080)构造函数: public ImageRequest(String url, Listener<Bitmap> listener, int maxWidth, int maxHeight, ScaleType scaleType, ...

2019-12-25 14:47:50 312 2

原创 Android:Volley框架分析(七)—— Request、StringRequest、JSONRequest

目录RequestStringRequestJsonRequest终于讲到使用Volley过程中,我们直接面对最频繁的一个对象了,那就是Request(请求),你的任何一次请求接口,都要创建一个Request并添加到请求队列中,我们在前端通过Listener回调去接收返回结果。com.android.volley.Request是一个抽象类,我们从这里开始。Request...

2019-12-25 14:41:46 555

原创 Android:Volley框架分析(六)—— 重试机制(RetryPolicy)

当请求超时,Volley内部会启动重试机制,对超时接口进行多次请求,直到超过此数后,抛出错误信息。先看看,重试请求是在哪里发出来的。回到BasicNetwork的performRequest方法,看代码后半部分的几个catch捕获,其中有几个地方会发出重试的动作。catch (SocketTimeoutException var12) { attemptRetryOnExcep...

2019-12-24 14:57:48 864

原创 Android:Volley框架分析(五)—— ByteArrayPool

上一节我们讲了请求发出去的整个过程,在BasicNetwork中,我们发现了一个属性。private static int DEFAULT_POOL_SIZE;protected final ByteArrayPool mPool;DEFAULT_POOL_SIZE = 4096;这个ByteArrayPool是做什么的,看名字是一个字节数组的池子,就好像线程池、连接池一样,大...

2019-12-23 13:56:41 365

原创 Android:Volley框架分析(四)—— BasicNetwork和HurlStack

在前面的文章中,我们提到过,在NetworkDispatcher中传入了BasicNetwork实例,BasicNetwork中又存在HurlStack对象,他们就是负责真正向网络发起请求的部分。Android:Volley框架分析(三)—— Dispatcher中提到了下面的代码,由BasicNetwork对象发起请求。NetworkResponse e = this.mNetw...

2019-12-23 13:56:34 209

原创 Android:Volley框架分析(三)—— Dispatcher

在Android:Volley框架分析(二)——请求队列中我们讲到队列任务开始后,就会将工作交给Dispatcher,这一节我们来看看Dispatcher是如何工作的。在Queue的start方法中,有两个Dispatcher。一个缓存分发(这里先不做介绍),一个工作队列分发NetworkDispatcher。mDispatchers:这是一个数组,Volley内部用来执行请求也是放到线程...

2019-12-19 16:20:44 215

ProtocolBuffer for java(android)

ProtocolBuffer的exe,源码,及maven

2014-12-12

C#仿Windows可折叠导航栏

C#仿Windows可折叠导航栏,支持小图标

2012-05-09

Delphi实现全局鼠标钩子

Delphi实现全局鼠标钩子 Delphi实现全局鼠标钩子

2010-09-16

API实现socket通信示例

socket的基本应用,针对初学者,老鸟们可以掠过。本示例采用Delphi2010编写

2010-09-01

windows用户基本设置

利用微软的ADSI(活动目录接口)设置windows用户及用户隶属于设置 原始代码来自网络,这里做了一些改动

2009-07-04

SPCOMM2.5修正版

SPCOMM2.5修正版SPCOMM2.5修正版

2009-05-22

delphi网络文件传输demo

delphi网络文件传输demo delphi网络文件传输demo

2009-03-20

汇编语言教程(chm)

汇编语言教程 汇编语言教程 汇编语言教程

2009-03-13

DELPHI全掌握(chm格式)

DELPHI全掌握 DELPHI全掌握 DELPHI全掌握

2009-03-10

ReportMachine2.6正式版本

ReportMachine2.6正式版本 ReportMachine2.6正式版本

2009-03-10

RegExpr,正则表达式

RegExpr,正则表达式,正则 RegExpr,正则表达式,正则

2009-03-10

delphi网络应用

delphi网络应用 用delphi解决网络问题

2009-01-12

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

TA关注的人

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