- 博客(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><
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
Android stodio的编译速度太慢,这个有没有提高的途径
2016-08-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人