自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 gradle 你是否想过task hello为什么不会报错?

先来看一段代码,这是一个最简单常见的tasktask hello{ doLast{ println'hello world!' }}hello是什么?它也不是String,之前也没有任何地方定义过hello。为什么不会报错?书上《Android gradle权威指南》其中3.4中对于gradle task的说法错误有些多。(a)task是Project类的create方法。首先Project类中没有叫做create的方法,task是Project类中task方法的。只有在TaskCo

2021-10-28 16:33:59 1187

原创 GC回收机制

GC回收首先gc回收的对象是堆区和方法区的垃圾对象,栈内的垃圾不在gc回收的范围内如何判断是否是垃圾引用计数法•为每个对象创建一个计数器,每被引用一次,计数器就+1;没被释放一次,就-1。直到 计数器等于0时,才标志为垃圾。缺点是无法避免循环引用的问题。即A引用B,B引用A,此时A、B永远无法被回收。可达性分析•不能通过引用链连接到gc root的对象,都可以标记为垃圾对象。gc root有四种虚拟机 栈,本地方法栈引用的对象,方法区中静态属性引用的对象,常量引用的对

2021-07-29 01:21:29 225

原创 binderService如何实现acitivity和service的绑定

binderService如何实现acitivity和service的绑定首先从bindService这个方法看起@Overridepublic boolean bindService(Intent service, ServiceConnection conn, int flags) { return mBase.bindService(service, conn, flags);}调用的是ContextWrapper里的bindService。看一下这个mBase是何

2021-07-29 01:21:18 184

原创 关于阿里热修复sophfix需要冷启动才能生效的探索

之前公司让我调研关于为什么很多情况下不能即时生效热修复。公司之前用的是阿里的sophfix热修。然后我反编译,通过对比原有包和热修复后的包的差距发现了一些R文件的改动。最终总结下有两种情况下sophfix必须冷启动后才能完成bugfix。1 修改涉及内部类的内部类持有了外部类的引用,修改了外部类的方法,热修复后会使用补丁中的类的方法去替换掉旧的类的方法。但是这些方法所属类就变成补丁包中的类了,此时补丁类中的新方法访问匿名内部类是没有权限的。原则是不涉及访问权限的变动。(1)方法中不能包含有内部类

2021-07-28 16:00:59 296

原创 rxjava学习笔记

RxJava框架的学习笔记1、什么是RxJava?在github上的自我介绍是这样的:RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.It extends the observer pattern to support sequences of da

2021-07-28 15:43:55 95

原创 retrofit学习笔记

1、什么是Retrofit 2.0 ?github上的介绍是A type-safe HTTP client for Android and Java.翻译过来就是一个用于Android和Java的类型安全HTTP客户端。底层实际上就是封装了okhttp。本质的工作流程:客户端使用Retrofit 进行网络请求,封装请求方法、请求参数、Header、Ur等信息后 ,之后由 OkHttp 完成后续的请求操作。在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户

2021-07-28 15:42:41 79

原创 gradle学习(二)

gradle学习(二)1、setting文件在gradle中,设置文件默认名字是settings.gradle,放在根目录下,用于初始化和工程树的配置。根工程就是project,子工程就是moduel。一个子工程或者说是moduel,只有在settings文件中配置了gradle才会去识别,构建的时候才会被打包。诸如include ':app1', ':module_one', ':module_two', ':router', ':l

2021-07-28 15:39:04 161

原创 热修复学习笔记(一)

1. 为什么需要热修复?此外,如果有一些紧急需要上线的小需求,希望马上能上线的,也可以借助热修复快速迭代,当然也不能过于依赖热修复。因此总结一下,它有几大优势(1)不依赖发版。(2)用户无感知,无需下载最新应用。(3)修复成功率高,能快速把损失降到最低。2. 热修复的原理修复可以分成三种目标,分别是代码修复、资源修复以及so库修复。代码修复是我们最经常使用的场景。代码修复又可以分为三种解决方案底层替换方案、类加载方案和Instant Run方案。2.1类加载方案类加载方案,基于dex分

2021-07-28 15:38:59 116 1

原创 java泛型

java泛型1、为什么需要泛型?(1)在编译的时候提供安全检测的功能(2)同时能支持多种类型参数。概念有点抽象,举个例子比如List 我们在使用的时候,可以指定不同的类型。 List<String> strList=new ArrayList<>(); List<Integer> intList=new ArrayList<>();为什么能支持这样呢,看ArrayList的源码,可以看到E就是不确定的类型,需要外部指定。...

2021-07-28 15:35:02 72

原创 记录webView接入h5界面时,调起相册、文件、相机无效的解决办法

记录webView接入h5界面时,调起相册、文件、相机无效的解决办法。在开发项目时,接入一个h5界面。使用webview时,发现界面显示正常,但是按钮不论怎么点都无效,但是m站和ios都正常。后来上网查了相关资料,才发现原来这块是需要Android这边自己在webview这边开发的。需要重写WebChromeClient。这里有一个需要区分的概念就是WebChromeClient和WebViewClient,因时间和精力关系只做简单的学习和介绍。WebViewClient只和影响view有关系的事件到

2021-07-28 15:26:20 6339

原创 Android开发艺术探索 第三章View

第三章 View1.View的基础知识1.1 什么是ViewView是Android所有控件的基类,比如button,listView等的基类都是View。除了View以外,还有一个ViewGroup。ViewGroup代表一组View的集合,ViewGroup也是一种View1.2 View的参数view的位置由四个顶点确定,分别对应四个属性top、left、right、bottom,其中top是左上角纵坐标,left是左上角的横坐标,right是右下角的横坐标,bottom是右下角的纵坐标。这

2021-07-28 15:24:15 158

原创 Android开发艺术探索学习笔记 第二章IPC

最近将之前工作做本地的学习笔记上传一下这里是Android艺术开发探索的前三章内容文章目录1. android的多进程模式2. IPC基础概念介绍2.1 Serializable2.2ParcelabeQ&A3.AIDL3.1使用(1)创建aidl文件(2)创建服务端服务供远程绑定(3)创建客户端3.2IBookManager.java类源码分析3.3定向Tag4. Android中的IPC方式4.1 Bundle使用方式4.2 文件共享4.3 Messenger4.4 ContentProvi

2021-07-28 15:23:14 151

原创 Android 自定义的mylog

自定义的MyLog1、为什么需要自定义一个MyLogger?以Log.d为例,可以看到需要传入两个参数,分别是tag和message。tag用来过滤其他log从而找到自己需要的那条log。public static int d(String tag, String msg) { return println_native(LOG_ID_MAIN, DEBUG, tag, msg);}因此在每个需要打log的类,你都需要自己创建一个tag用于过滤,如下所示。public class Ma

2021-05-07 16:12:03 249

原创 Android svga动画框架

为什么需要动画播放框架?Android中实现动画有几种方式(1)Frame Animation(逐帧动画)(2)Tween Animation (补间动画)(3)Property Animation(属性动画)(4)GIF/WebP动画图片方案1的缺点在于需要将动画拆分成一张张图,体积大。方案2、3实现难度大,开发人员需要每一步都细细调参,效率低低。此外如果需要更换动画,需要进行客户端的更新。方案4 gif实际上和帧动画类似,将一张张图片打包压缩成gif。随便一个gif的

2021-05-06 18:06:42 2652 4

原创 Android gradle学习(一)

Android gradle学习(一)文章目录Android gradle学习(一)1、gradle配置2、初用gradle任务和项目生命周期3、Gradle Wrapper(1)生成wrapper(2)wrapper配置(3)gradle-wrapper.properties(4)自定义wrapper task4、gradle日志(1)gradle的日志(2)输出错误堆栈信息(3)自定义日志输出5、gradle命令(1)获取帮助(2)查看所有可执行的Task(3)强制刷新依赖(4)多任务调用(5)通过任

2021-04-27 19:20:01 260 2

原创 java反射和代理模式

java反射和代理1 什么是反射?通常创建一个对象,都是以new的方式。A a=new A();反射则是一开始并不知道自己需要创建的对象,自然不能用new的方式。而是运行时才知道创建的类是什么,并且可以在运行时获取类的成员变量和构造方法等。为什么这么做?假如创建的类可能频繁改动或者,本身不知道需要具体创建哪个类时,就可以使用反射,体现了java的灵活性。Person person=new Teacher();下次需要改成Student,就需要修改源码,并且重新编译。假如这是已经交付给客户

2021-04-22 14:57:53 224

原创 Android 如何简便地将后端返回的字符串做部分高亮展示

这个标题想了好久还是没想到如何简洁明了地把需求说清楚。。就随便取了一个。先看需求,在开发过程中,有时候需要对后端返回对字符串做部分的高亮展示。如图所示,假定以下都是后端接口返回的,需要对部分特定对内容做高亮处理,包括了字体、颜色等做特殊处理。如果是的话,你可以继续往下看了。这个需求的难点在于,特殊处理的字符个数未知、位置未知(没办法将字符串分成多个接口字段),也没有固定的上下文,可能随机分布在字符串的各个地方,并且需要对一个textview的部分文字进行不同颜色大小的展示。因此不好进行处理。

2021-02-10 14:32:13 528

原创 Android View基础知识(一)

一、View的种类View主要分成两种:一种是单一视图,只包含一个view,常见的有textview等。 另一种是视图组,包含一组view,也就是viewgroup。可以看到viewgroup继承自view,比如Linearlayout等布局、listview。public abstract class ViewGroup extends View implements ViewParent, ViewManager {}所以可以说Android中所有的UI组建都是继承自view。

2021-02-04 12:09:43 679

原创 Android textwatcher监听文本框输入变化

textwatcher 包含三个接口,分别对应文本框输入的三个状态,分别是输入前、输入中、输入完成。1.改变前 beforeTextChanged这个方法会在输入前调用,有四个参数分别是CharSequence s: editview中原来的内容int start : 本次替换的起始位置int count: 本次替换内容的长度int after: 新替换内容的长度注释中说的很明白,这个方法被调用是用来通知你,原内容s从start位置开始的count个字符将为被长度为after的新内容替换,

2020-09-22 14:52:43 993

原创 Android editview和软键盘详解

editview和软键盘详解1.editview焦点和软键盘的调用并无关系一直以来大家可能都有一个误区就是,editiview的焦点变化会直接影响软键盘的显示和隐藏,最典型的观点就是,我点击editview出现光标,软键盘就弹出来了,不就说明了一旦editview获取焦点,就能调用软键盘了吗?一般来说当editview被点击时,会自动调用软键盘,但是本身editview焦点的获取与否不会影响键盘的显示或者隐藏,两者本身没有联系。看下面的例子。这是MainActivity的xml文件,很简单就是一个ed

2020-09-22 11:48:27 1550

原创 Android viewpage页面刷新失效的原因分析

昨天项目中遇到一个问题,感觉可能是使用viewpage很常见的问题,所以就整理记录一下。调用notifyDataSetChanged为什么不刷新界面?先说结论重写在adapter中getItemPosition即可方法。重写方式最简单的就是直接返回POSITION_NONE,但是会导致每次调用notifyDataSetChanged导致所有page都进行重绘,影响性能。如下所示@Override public int getItemPosition(Object object) { ret

2020-09-17 13:55:49 683

原创 从零学习Kotlin之数组和集合

数组和集合1. 数组1.1创建为数组增加了Array类,为元素是基本类型的数组添加XXXArray类(其中XXX可以是Int、Byte、Short)。因此数组在kotlin中是对象。创建数组就相当于创建Array<T>的实例,也可以通过arrayOf()的方式创建。因此创建数组有三种方式使用arrayOf()、arrayOfNulls()、emptyArray()工具函数使用Array(size:Int,init:(Int)->T)构造器使用XXXArray(动态初始化)x

2020-09-08 09:32:33 756

原创 Android View详解(上)

第三章 View1.View的基础知识1.1 什么是ViewView是Android所有控件的基类,比如button,listView等的基类都是View。除了View以外,还有一个ViewGroup。ViewGroup代表一组View的集合,ViewGroup也是一种View1.2 View的参数view的位置由四个顶点确定,分别对应四个属性top、left、right、bottom,其中top是左上角纵坐标,left是左上角的横坐标,right是右下角的横坐标,bottom是右下角的纵坐标。这

2020-09-04 09:44:11 230

原创 从零学习Kotlin之流程控制

Kotlin流程控制1. 分支结构1.1 if(1)if分支​ if分支有三种结构,分别是//第一种if () {}//第二种if () {} else {}//第三种 可以跟多个else ifif () {} else if () {} else if () { } ………else 是对前一if条件的取反(2) if表达式if 作为表达式时,可以代替java中的三目运算符?。for (i in 1..5) { val age= Rando

2020-09-02 10:45:55 115

原创 从零学习kotlin之基础类型

kotlin基础类型1.分隔符(1)分号 ;​ 每行不强制要求以 “;”结尾,但是如果一行内有多个语句,则前面 的语句必须以;结尾​ kotlin运行一条语句跨多行,但是字符串变量名不能换行。var str =” fkit” //表达式可以跨多行str += ” abc “//字符串或者变量名不能换行var str="11 22"(2)花括号​ 定义代码块{}(3)方括号​ 用于访问数组、集合元素,如 //数组的第四个元素赋值 a[3] = 3

2020-08-30 09:54:12 660

原创 从零学习kotlin之运算符与表达式

kotlin运算符与表达式和java相同的运算符1.1单目前缀运算符 有+、-、!这三个。 +a = a.unaryPlus() -a = a.unaryMinus() !a = a.not()1.2自加自减运算符运算符 对应方法a++ a.inc()a-- a.dec()注:++不完全与对应方法想等,因为a++ 与++a的含义不同1.3双目运算符运算符 对应方法a+b a.plus(b)a-b a.minus(b)a*b a.times(b)a/

2020-08-30 09:49:10 548

原创 Android 搞懂dp、sp、px、pt

Android尺寸1.几个概念px即像素,代表屏幕上的一个像素点,是物理单位,在不同的手机上显示的实际大小可能会不同,因为不同手机的分辨率不同。dpidots per inch 像素密度。每一英寸(对角线长度)的像素密度。google规定 当 dpi=160时,1dp=1px。具体的换算公式为1px=1dp*dpi/160。Android系统定了四种像素密度,分别是低(120)、中(160)、高(240)、超高(320),对应的px、与dp关系分别是 0.75、1 2、1.5、2。dp也称d

2020-08-25 15:57:25 567

原创 自定义Dialog在外部赋值时空指针异常解决办法以及源码原因分析

问题描述在项目中,需要创建一个自定义的dialog,然后在外部对于dialog的控件进行赋值,此时发现空指针异常。如下所示这个是dialog的java文件,很简单就是里面有一个textview,然后在外部向textview赋值。 public class MyDialog extends Dialog { private Context context; private TextView tipsView; public TimeConflictDialog

2020-08-21 09:48:52 498

原创 一篇弄懂LayoutInflater.from(context).inflate()

昨天项目的原因,使用到了这个LayoutInflater.from(context).inflate(),结果发现应该加载的布局没有显示出来。排查了好久发现是照着别人view的时候,直接把LayoutInflater.from(context).inflate(R.layout.item, null)照写了,然后就没加载出来。所以今天整理一下昨天出现的问题。LayoutInflater.from(context).inflate()这个方法有几个重载方法,其中主要使用的参数简单的解释一下。1..

2020-08-19 10:19:56 15549 3

原创 dialog四周留白以及圆角样式设置无效的问题

8.11的关于dialog的两个问题1关于Dialog无法全屏的原因自定义的dialog如果不指定样式的话,会自动继承系统默认的样式,在四周留下空隙。项目中最初自定义dialog的构造函数如下。public MyDialog(@NonNull Context context) { super(context);}查看源码点进去以后会发现如果不指定样式,会使用这个默认的系统样式。/** * Creates a dialog window that uses the default di

2020-08-12 19:20:01 1048

原创 Immersionbar学习笔记

一、什么是Immersionbar?​ Immersionbar是一个第三方的类库,用于 android 4.4以上沉浸式实现。​ 什么是沉浸式?前一张图是正常未使用沉浸式的,后一张图使用沉浸式后标题栏的背景颜色也变成红色。二、Immersionbar的使用​ 1.导入依赖implementation 'com.gyf.immersionbar:immersionbar:2.3.3'​ 2.基础使用ImmersionBar.with(this).init();​ 3.高级使

2020-08-10 17:21:12 18484

原创 AddView和layoutParams总结

一、AddVIewaddview方法可以用于动态地向布局内添加viewaddview重载了五个方法,如下所示addView(View child) // child-被添加的ViewaddView(View child, int index) // index-被添加的View的索引addView(View child, int width, int height) // width,height被添加的View指定的宽高addView(View view, ViewGroup.La

2020-08-10 17:08:15 2772

原创 ARouter入门总结

ARouter1.什么是ARouter?ARouter是阿里开发的路由框架,主要用于模块化或者组建间实现独立,进行页面跳转。此外还能实现依赖注入功能。2.ARouter的基本原理。1.注册B界面将类的信息,通过key-value的形式,注册到arouter中。2.查询A界面将类信息与额外信息(传输参数、跳转动画等),通过key传递至arouter中,并查询对应需要跳转类的信息。3.结合将A界面类信息、参数与B界面的类信息进行封装结合。4.跳转将结合后的信

2020-08-10 17:03:30 349

原创 Activity生命周期和启动模式入门总结

第一章 Activity生命周期和启动模式1. Activity的生命周期全面分析启动Activity有四种生命状态 ,分别是:running、paused、stopped、killed。1.1 正常生命周期onCreate(): 表示此时activity正在创建,通常进行一些初始化的方法。onStart(): 表示此时activity已经被创建,但没有位于前台,处于可见但不可交互的状态。onResume(): 表示此时activity处于前台running的状态,既可见又可交

2020-08-10 16:57:54 312

原创 Android学习笔记之EventBus

EventBus文章目录EventBus1、什么是EventBus?2、什么是发布-订阅模型?3、EventBus的使用4、发布事件5、@Subscribe1、什么是EventBus?​ EventBus,中文翻译事件总线,是greenrobot开发的基于发布-订阅模型的开源框架。可以理解为,将一个个的event事件发送到bus总线上,然后eventbus会根据订阅者已匹配的事件,然后把事件发送给对应的订阅者。我们在activity之间通信的时候,可以使用intent或者handler的方式进行通信

2020-08-03 10:41:45 471 1

原创 Android 自定义attribution使用

自定义Attribution的使用使用分为三步第一步在attr中添加自定义的属性,如下所示<resources> <declare-styleable name="PreferenceWithTip"> <attr name="tipstring" format="string|reference"/> <attr name="titlestring" format="string"/>

2020-07-20 17:30:25 687

原创 Bitmap 官网学习笔记

一、Bitmap摘要Bitmap实现了Parceable接口,所以bitmap也能够通过intent进行传递。public final class Bitmap extends Object implements Parcelable它有两个内部类,都是枚举类,如下所示。 Nested classes enum Bitmap.CompressFormat Bitmap.CompressFormat规定了几种种压缩格式,分别是JPEG、PNG、WEBP(这个在

2020-07-09 18:57:58 635

原创 Android Activity之间的信息传输

在实际开发过程中,有时需要在Activity之间传递数据,可以分成两种情况,第一种是向下一个被启动的Activity发送数据,第二种是向上一个活动返回数据。如图所示。一、向下一个被启动的Activity发送数据可以通过Intent传递简单的数据。调用intent.putExtra()方法,此方法以key-value的方式存储键值对,如图所示,重载了不同数据类型的该方法,比如可以发送int类型、String类型等。示例代码如下所示,可见intent可以同时传递多个、不同类型的数据。.

2020-06-18 18:09:49 831

原创 Android菜单Menu的简单使用

首先了解什么是菜单?由于Android手机屏幕的有限,当如果有许多按钮或者导航选项时,分布在界面上十分的不美观,就如图桌面上散乱的放置了很多杂物,因此可以提供一个类似抽屉的东西,负责存放和整理这些按钮。如图所示便是微信的Menu,点开这个按钮后,会出现一排更具体的按钮。 那么如何实现一个Menu呢?首先需要创建一个menu的文件夹,在res文件目录下创建名为“menu”的文件夹,然后右键选择文件夹new-》Menu...

2020-06-09 00:13:29 562 3

原创 android 运行时权限一览和使用方法

一、什么是动态权限?在android6.0前,所有的权限都只需要在Manifest中写。如图所示那么为什么6.0后需要添加运行时权限?因为现在很多的软件为了以防万一,都先将权限申请完。比如明明一个计时器软件,却需要用户授权相册,联系人等权限。如果不授权,就不给用。为了改变这种情况,则在6.0后推出了运行时权限。用户不必再安装软件时就授权所有的权限,而是在运行时需要用到什么权限就申请...

2020-02-29 16:43:47 2484

空空如也

空空如也

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

TA关注的人

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