- 博客(285)
- 收藏
- 关注
原创 Android Studio上运行Java的main函数
一、背景在Android studio中如果觉得运行apk慢想快速跑一下java代码可以在Android工程中写一个main函数,运行main函数要比运行apk快很多。二、实现方案1.在 .idea 的 gradle.xml 中标注的位置增加下面的内容即可<option name="delegatedBuild" value="false" />2.现在可以运行 MainJava 的 main 方法了,按照下图指示的方式,指定运行的 main 函数即可...
2022-05-07 10:36:45 2024
原创 Java内存区域
一、简介JVM运行时将数据分区域存储,强调对内存空间的划分。二、程序计数器(Program Counter Register)一块较小内存空间,可看作当前线程所执行的字节码行号指示器多线程实际上是通过线程轮流切换并分配处理器执行时间的方式来实现,即任一确定时间,一个处理器内核都只会执行一条线程中的指令,只不过切换得很快,不易察觉线程私有:切换后能恢复到正确执行位置,每个线程都要有一个独立额程序计数器若正在执行Native方法,则计数器数值为空三、Java虚拟机栈线程私有描述J
2022-04-21 10:29:04 377
原创 Java内存模型总结
一、为什么要有内存模型?要想回答这个问题,我们需要先弄懂传统计算机硬件内存架构。1.硬件内存架构CPU去过机房的同学都知道,一般在大型服务器上会配置多个CPU,每个CPU还会有多个核,这就意味着多个CPU或者多个核可以同时(并发)工作。如果使用Java 起了一个多线程的任务,很有可能每个 CPU 都会跑一个线程,那么你的任务在某一刻就是真正并发执行了。CPU RegisterCPU Register也就是 CPU 寄存器。CPU 寄存器是 CPU 内部集成的,在寄存器上执行操作的效率要比
2022-04-20 10:32:06 413
原创 Kotlin获取类的包名
一、背景AClass.class.getName();如果AClass是java类,则此方法将返回包名和类名。 但是当我将AClass java文件转换为Kotlin文件时,它只会返回一个类名。所以系统找不到这个类路径二、实现方式1.KClass.qualifiedName获取val name = AClass::class.qualifiedName2.通过媒体资源Class.name获取val name = AClass::class.java.name3.通过Class#getN
2022-03-31 10:19:15 805
原创 kotlin中使用软引用
一、Java方式实现var str = String("asdf")val strSoftRef = SoftReference<String>(str)str = 二、kotlin委托实现委托属性,虽然常用by lazy,没看到别人的文章还想没想到这东西。看lazy大致可以了解委托的实现方式,结合一些文章差不多可以写成这样fun <T> weak(initializer: () -> T) = Weak(initializer.invoke())class
2022-03-31 10:11:19 3034
原创 Android区分高低端机型
一、背景某些APP项目中需要针对高中低端安卓机型做不同的适配,例如:特效的开关、动画效果的调整等。怎么在项目中对Android进行高低端机型的区分?接下来的内容会进行分析。二、区分标准区分的标准最直观的就是跑分数据。参考现在最主流的跑分软件安兔兔,数据主要由4部分构成,内存(RAM)、CPU、GPU、IO(数据库、SD读写),其中内存、CPU、GPU性能构成主要占比,IO性能次要。内存和CPU是所有功能的根本,而GPU则是对游戏类应用影响更大些,因此在非游戏类的普通应用,更注重内存和CPU。三、技术
2022-03-30 10:25:10 5495 1
原创 Android中设置org.gradle.jvmargs
一、配置文件gradle.properties文件二、作用Specifies the JVM arguments used for the daemon process.The setting is particularly useful for tweaking memory settings.org.gradle.jvmargs=-Xmx1536m上面的那两行是对这句话的解释:用于指定守护进程的JVM参数。这个设置呢,对于调整内存设置特别有用。1.那平常开发中它有什么用呢?主
2022-03-29 10:15:20 6948
原创 Gradle中implementation、api、compileOnly区别详解
一、implementation和api的区别1.implementation:只能在内部使用此模块,比如我在一个libiary中使用implementation依赖了gson库,然后我的主项目依赖了libiary,那么,我的主项目就无法访问gson库中的方法。这样的好处是编译速度会加快,推荐使用implementation的方式去依赖,该依赖方式所依赖的库不会传递,只会在当前module中生效。2.api该依赖方式会传递所依赖的库,当其他module依赖了该module时,可以使用该module下
2022-03-29 10:06:30 5214
原创 SSL协议总结
一、概念SSL协议位于TCP/IP协议与各应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol)、SSL握手协议(SSL Handshake Protocol)SSL握手协议:在SSL记录协议之上,会话层之下,在实际的数据传输开始前,协商加密算法、交换密钥、身份认证二、握手协议开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake)。假定客户端叫做爱丽丝,服务器叫做鲍勃,整个握手过程可以用下
2022-03-27 22:51:47 1016
原创 Android CheckBox与Spanned双重响应
一、问题描述客户端注册账号,需要用户确认用户协议及可以查看协议。选择使用单CheckBox控件配合SpannableString。但是遇到了一个问题,点击链接后CheckBox也响应了Click导致CheckBox勾选状态改变,这是不期望发生的。二、问题原因点击事件,从TextView的onTouchEvent入手@Override@Overridepublic boolean onTouchEvent(TextView widget, Spannable buffer, Mo
2022-03-24 11:12:48 1799
原创 Android Service解析
一、简介Service是Android提供给开发者的一个组件,主要用于后台一些耗时任务的处理。其实Android系统中已经存在了很多这样在后台执行一些特定任务的系统级Service,比方说与我们开发中打交道最多的ActivityManager,WindowManager,PackageManager和InputManager等等。今天我们依然从具体使用场景来对Android中Service的具体功能进行分析。二、Service生命周期从图中可以看出Service的生命周期会根据启动方式的不同有不同的
2022-03-23 10:47:40 329
原创 红黑树解析
一、二叉查找树和AVL树1.二叉查找树任意节点左子树不为空,则左子树的值均小于根节点的值.任意节点右子树不为空,则右子树的值均大于于根节点的值.任意节点的左右子树也分别是二叉查找树没有键值相等的节点.由二叉查找树的性质可知,构成二叉树的结构和插入数据的顺序有关,存在不稳定性。最好情况可以构建成平衡二叉树查找效率O(lgn),最坏情况也有可能构造成线性树(查找效率O(n))2.AVL树AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡。左右子树树
2022-03-23 10:31:50 258
原创 Android RecyclerView总结
一、缓存机制由于ListView也是由它的缓存机制,并且比RecyclerView简单很多。而且RecyclerView缓存的本质和ListView的是差不多的,所以我先从简单的ListView看起。二、ListView的缓存机制每当要找一个目标 convertView时,ListView先会去找 RecycleBin(回收站)第一步:RecycleBin在ActiveView(即在屏幕上显示的、活跃的View)中寻找有没有目标View第二步:如果第一步没有找到,则取 Scrap View(即废
2022-03-19 20:39:49 394
原创 Android事件分发原理
一、事件分发机制流程图当点击view的时候,最先响应的是它的父容器viewGroup,执行事件分发dispatchTouchEvent(MotionEvent e),在这个方法的内部会走它自身的onInterceptTouchEvent(MotionEvent e)进行事件拦截判断,如果该方法返回值为true(进行拦截),则该事件不会传递给它的子view,会走到viewGroup的onTouchEvent(MotionEvent e)事件;如果该方法返回为false(不进行拦截),则会传递给子view,子
2022-03-19 20:15:55 321
原创 Android 点击短信链接打开App
一、背景随着APP产品的迭代,运营的过程中往往会有一些活动希望通知到用户,或者唤起沉睡用户,就我们Android而言,当然有推送,长连接一类的方法,但是,基于国内的推送环境,只能APP自己启动长连接,没有统一的系统级别的推送支持,导致沉睡用户无法送达的,除非你是微信这样的大佬才行,所以,此时通用一点方式就是通过短信发送一条活动链接,通过点击这条链接可以直接跳转到我们的APP。二、实现思路要唤起我们的App大致工作流程如下:所以,一共有三条线路可以到达我们的APP,在任何安卓版本中,我们走或者中间右
2022-03-13 20:00:47 6546
原创 Kotlin在forEach中如何跳出循环和跳出当前循环体
一、数组的forEach中直接retrunfun main(args: Array<String>) { val arr = intArrayOf(1,2,3,4,5,6,7) arr.forEach { if (it == 4) return println("value:$it") } println("this is End")}那么输出结果是可以看到程序程序在遍历到4的时候就退出了方法,而且this is En
2022-03-13 19:25:58 1955
原创 Android 自定义checkbox与文字的距离设置
一、文字的距离设置只需要设定CheckBox的android:paddinLeft的值即可。二、自定义checkbox在开发过程中经常遇到的问题是,不同厂商的checkbox控件的UI不同,导致开发出的产品在UI上有些区别,尤其是一些厂商的UI做得比较丑,这时候我们可以使用自定义Checkbox来达到我们想要的UI。只需要在drawable文件下设定一个xml即可:<?xml version="1.0" encoding="UTF-8"?><selector xmlns:a
2022-03-13 19:15:21 1534
原创 Android 完整的自定义View
一、自定义View的分类自定义View一共分为两大类,具体如下图:二、具体介绍 & 使用场景对于自定义View的类型介绍及使用场景如下图:三、使用注意点在使用自定义View时有很多注意点(坑),希望大家要非常留意:1.支持特殊属性支持wrap_content如果不在onMeasure()中对wrap_content作特殊处理,那么wrap_content属性将失效支持padding & margin如果不支持,那么padding和margin(ViewGrou
2022-02-20 19:51:46 847
原创 Android AAB增量安装
一、简介由于频繁的更新迭代,移动终端上的大型应用程序越来越普遍。因此,从应用商店里下载大型应用安装包将无可避免的耗费大量时间,这已经成为移动终端用户的一大痛点。对于应用开发者而言,也需要改变现有的整包安装方案以满足用户需求。在传统的应用安装方案中,开发者通过ADB(Android Debug Bridge)以有线或无线的方式与终端用户连接,或者用户从软件商店直接下载,然而该方案需要用户等待完整的安装包传输结束后才能启动安装,在这期间产生了不良的用户体验。增量安装技术是一种流式的安装方案:一旦安装包的
2022-02-20 19:23:13 2432
原创 Gson反序列化时导致实体类的默认值失效了
一、问题示例实体类TestBean:class TestBean implements Serializable{ String title; boolean isShow = true;//这里给isShow设置了默认值,坑点}反序列化代码:new Gson().fromJson("{title:\"标题\"}", TestBean.class);预计得到的结果:TestBean.title 值等于 “标题”TestBean.isShow 值等于 “true”实际得
2022-02-20 19:15:51 977
原创 Android view坐标体系
一、前言Android View体系是界面编程的核心,他的重要性不亚于Android四大组件,在这个系列中我会陆续讲到View坐标系、View的滑动、View的事件分发等文章来逐步介绍Android View体系。二、View简介View是Android所有控件的基类,同时ViewGroup也是继承自View,看下面这张图我们就会有一个直观的了解:知道了View的层级关系有助于对View的理解,从上图可以发现我们常用的这些控件都是继承于View,如果我们更好的掌握了View的知识体系,那么我们在界
2022-02-15 11:37:50 505
原创 Android addview—动态添加view
一、前言在日常的开发中经常遇到需要动态添加子view的情况,addview是ViewGroup的特有方法,可以在布局中动态添加view,而view是不存在这个方法的。二、使用方式1.方法介绍addview有以下几种方式addView(View child) // child 被添加的ViewaddView(View child, int index) // index 被添加的View的索引addView(View child, int width, int height) //
2022-02-14 10:42:51 16750
原创 Android maven多flavor上传
一、问题背景最近, 项目中一直维护的一个 maven aar 库由于业务发展, 需要定义 2 个 flavor 并打包上传2 个 flavor aar 包到 maven 库。二、如何发布两个 flavor 的 aar 到 maven 仓库首先介绍一下, 发布 maven 库目前有 2 个可用的 gradle 插件:maven plugin (早期的 maven 插件, 目前已经不再维护, 功能简单, 问题比较多)maven-publish plugin (gradle 目前推荐使用的, 功能更强
2022-02-14 10:28:53 622 1
原创 Dagger2原理解析
一、什么是Dagger2Dagger2是Dagger的升级版,是一个依赖注入框架,现在由Google接手维护。 恩,这里有个关键字依赖注入,因此我们得先知道什么是依赖注入,才能更好的理解Dagger2。依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的。举个例子:我们在写面向对象程序时,往往会用到组合,即在一个类中引用另一个类,从而可以调用引用的类的方法完成某些功能,就像下面这样.public class ClassA { ... Clas
2022-02-13 16:59:12 730
原创 Android AAB简介
一、前言Google Play要求八月份起新应用须打包为AAB格式,开发者上传打包文件整合成aab格式,根据不同的处理器/分辨率等下载对应的安装包,减少冗余,所以安装包会减小。二、Android App Bundle(AAB)Android App Bundle 是一种发布格式,其中包含您应用的所有经过编译的代码和资源,它会将 APK 生成及签名交由 Google Play 来完成。使用 Android App Bundle 发布应用可帮助用户以尽可能最小的下载大小安装您的应用,并将压缩下载大小上限
2022-02-13 16:28:04 3905
原创 OAuth 2.0 解析
一、OAuth 2.0 的一个简单解释我住在一个大型的居民小区,小区有门禁系统,进入的时候需要输入密码,我经常网购和外卖,每天都有快递员来送货,我必须找到一个办法,让快递员通过门禁系统,进入小区,如果我把自己的密码,告诉快递员,他就拥有了与我同样的权限,这样好像不太合适。万一我想取消他进入小区的权力,也很麻烦,我自己的密码也得跟着改了,还得通知其他的快递员。有没有一种办法,让快递员能够自由进入小区,又不必知道小区居民的密码,而且他的唯一权限就是送货,其他需要密码的场合,他都没有权限?二、授权机制的设计
2022-02-10 11:13:54 874
原创 java闭包详解
一、为什么需要闭包闭包的价值在于可以作为函数对象或者匿名函数,持有上下文数据,作为第一级对象进行传递和保存。闭包广泛用于回调函数、函数式编程中。二、JAVA中的闭包在JAVA中,闭包是通过“接口+内部类”实现,JAVA的内部类也可以有匿名内部类。1.内部类在JAVA中,内部类可以访问到外围类的变量、方法或者其它内部类等所有成员,即使它被定义成private了,但是外部类不能访问内部类中的变量。这样通过内部类就可以提供一种代码隐藏和代码组织的机制,并且这些被组织的代码段还可以自由地访 问到包含该内
2022-02-09 16:23:49 1564
原创 Android apk签名原理
一、什么是apk签名签名是摘要与非对称密钥加密相相结合的产物,摘要就像内容的一个指纹信息,一旦内容被篡改,摘要就会改变,签名是摘要的加密结果,摘要改变,签名也会失效。Android APK签名也是这个道理,如果APK签名跟内容对应不起来,Android系统就认为APK内容被篡改了,从而拒绝安装,以保证系统的安全性。应用程序的作者使用自己的私钥签名APK文件,并将签名与公钥一起发布到APK中,这个过程称之为签名。当应用程序被安装时,用发布的公钥去解析签名,并与文件的hash进行比对,这个过程叫验签。二、
2022-02-09 15:41:57 7620
原创 oppo手机提示“由于某个应用遮挡了权限请求界面,因此设置应用无法验证您的请求开启辅助权限的回应”
一、解决方案关掉悬浮球才终于可以打开OPPO辅助功能的权限
2022-02-09 15:28:04 15120 2
原创 Android 将 build 变量注入manifest清单
一、背景如果您需要将变量插入在 build.gradle 文件中定义的 AndroidManifest.xml 文件,可以使用 manifestPlaceholders 属性执行此操作。此属性采用键值对的映射。二、示例android { defaultConfig { manifestPlaceholders = [hostName:"www.example.com"] } ...}您可以将某个占位符作为属性值插入清单文件,如下所示:<intent
2022-02-09 14:36:27 1671
原创 Android 使用okhttp进行post提交json数据
一、背景有的服务端的api只支持json格式的数据,不支持表单格式的数据,所以就需要客户端发送数据的时候指定为json格式。二、代码实现获取MediaType对象,类型为application/json,字符集为utf-8通过RequestBody.create()方法创建JSON请求主体创建请求对象,需要往请求头里添加参数也是在这里添加执行请求//创建一个OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient();//创建
2022-02-08 17:07:42 6930
原创 Android deeplink原理解析
一、什么是DeepLink移动端深度链接,简称deeplink。这是一种通过uri链接到app特定位置的一种跳转技术,不单是简单地通过网页、app等打开目标app,还能达到利用传递标识跳转至不同页面的效果。二、原理分析deeplink的scheme相应分两种:一种是只有一个APP能相应,另一种是有多个APP可以相应,比如,如果为一个APP的Activity配置了http scheme类型的deepLink,如果通过短信或者其他方式唤起这种link的时候,一般会出现一个让用户选择的弹窗,因为一般而言,系
2022-02-04 22:54:36 5711
原创 Android与H5交互原理
一、Android调用JS方法1.通过WebView的loadUrl// 调用js中的函数:jsFun(msg)webView.loadUrl("javascript:jsFun('" + msg + "')");2.通过WebView的evaluateJavascriptmWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() { @Override public v
2022-02-03 21:51:18 1953
原创 Android路由框架ARouter原理
一、为什么需要路由框架1.原生的路由方案存在的问题首先谈一谈原生的路由方案存在的问题以及为什么需要路由框架。我们所使用的原生路由方案一般是通过显式intent和隐式intent两种方式实现的,而在显式intent的情况下,因为会存在直接的类依赖的问题,导致耦合非常严重;而在隐式intent情况下,则会出现规则集中式管理,导致协作变得非常困难。而且一般而言配置规则都是在Manifest中的,这就导致了扩展性较差。除此之外,使用原生的路由方案会出现跳转过程无法控制的问题,因为一旦使用了StartActivi
2022-02-02 21:29:12 2501 1
原创 Android WebView 调用JS方法获取返回值
一、Android4.4+如果你项目的minSdkVersion 为4.4 以上,那么你可以直接通过WebView的evaluateJavascript()方法 拿到JS方法的返回值webview.evaluateJavascript("javascript:JSMethod()", new ValueCallback<String>() { @Override public void onReceiveValue(String value) {
2022-01-20 11:31:36 2482
原创 Android简析Window、Activity、DecorView以及ViewRoot之间的错综关系
一、职能简介1.ActivityActivity并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是Window。一个Activity包含了一个Window,Window才是真正代表一个窗口。Activity就像一个控制器,统筹视图的添加与显示,以及通过其他回调方法,来与Window、以及View进行交互。2.WindowWindow是视图的承载器,内部持有一个 DecorView,而这个DecorView才是 view 的根布局。Window是一个抽象类,实际在Activity中持有的
2022-01-20 11:23:38 995
原创 Android启动另外的APP及传递参数
一、通过包名启动如果你不知道那个APP的Activity,但是知道包名(package name),那么可以使用如下的方法:Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");startActivity(LaunchIntent);二、通过package/activity启动如果APP之间有合作关系,可以获得合作APP的清单文件(manifest),那么可以从该文件中
2022-01-20 10:34:31 5017
原创 Android Intent ACTION值自定义
一、简介在启动一个ACTIVITY时,作为信使的Intent主要由三部分构成:Intent<Action,Data,Category>;对于Action,有时候我们不一定非得用系统自定义的值,而可以自定义,同样可以达到启动其它Activity的效果,这里我们需要明确如下定义:ACTION的值是一个类型为String的字符串Intent中ACTION的值是双向的,发送方发给接受方中的ACTION值能够被双方了解,这样在发送方中,自定义ACTION的值,在接受方中,Intent-filter
2022-01-19 10:27:16 1731
原创 Android帧动画FrameAnimation
一、逐帧动画介绍视图动画由两部分组成,补间动画和逐帧动画,下面讲解逐帧动画。Frame-by-frame Animation主要作用于view,可以利用xml或者代码生成动画,如果使用xml方式生成动画需要在res/drawable 目录下创建动画xml文件(animation-list)。逐帧动画的原理是一张一张的播放图片资源(drawable资源),然后出现动画效果。逐帧动画对应的类是AnimationDrawable,在android.graphics.drawable.Drawable包
2022-01-17 20:00:12 1258
原创 LifecycleObserver监听Activity生命周期
一、自定义控件并实现LifecycleObserverimport android.content.Context;import android.os.SystemClock;import android.util.AttributeSet;import android.widget.Chronometer;import androidx.lifecycle.Lifecycle;import androidx.lifecycle.LifecycleObserver;import android
2022-01-17 19:51:26 1072
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人