Android
文章平均质量分 65
wings专栏
程序亦非猿
展开
-
RecyclerView状态异常Cannot call this method while RecyclerView is computing a layout or scrolling
Cannot call this method while RecyclerView is computing a layout or scrolling原创 2022-10-08 15:26:30 · 5797 阅读 · 0 评论 -
Android代码混淆
Android混淆规则–proguard-rules.proandroid 混淆规则作用,AndroidProguard转载 2022-10-08 11:38:42 · 195 阅读 · 0 评论 -
Android代码混淆
Android混淆规则–proguard-rules.proandroid 混淆规则作用,AndroidProguard转载 2022-09-26 01:27:23 · 82 阅读 · 0 评论 -
Android实现圆形头像
ClipPathimport android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Path;import android.grap原创 2022-02-18 19:45:46 · 2239 阅读 · 0 评论 -
Android手机导出日志文件
我们平时排查一些app线上问题时,除了需要排查后端接口数据以外,还需要抓去用户手机端的日志文件来一起排查,如何抓去Android端日志文件,接下来一一讲解,以Macbook-Pro为例。方式一:使用USB连接在手机上启用USB调试在终端输入adb devices 获取日志只连接一个设备:清除已缓存日志:adb logcat -c获取日志并保存到本地:adb logcat >~/Desktop/a.txt (本地目录可自行定义)在终端使用快捷键 Ctrl+C 停止日志获取连接转载 2021-12-01 15:15:43 · 5045 阅读 · 0 评论 -
JavaPoet使用详解
JavaPoet 是用于生成 .java 源文件的 Java API。在执行诸如注释处理或与元数据文件(例如,数据库模式、协议格式)交互等操作时,源文件生成非常有用。通过生成代码,您无需编写样板,同时还为元数据保留了单一的真实来源。例子这是一个(无聊的)HelloWorld 类:package com.example.helloworld;public final class HelloWorld { public static void main(String[] args) {翻译 2021-11-23 23:25:19 · 5543 阅读 · 0 评论 -
约束布局Constraintlayout使用解析
1.简介约束布局ConstraintLayout 是一个ViewGroup,可以在Api9以上的Android系统使用它,它的出现主要是为了解决布局嵌套过多的问题,以灵活的方式定位和调整小部件。从 Android Studio 2.3 起,官方的模板默认使用 ConstraintLayout。ConstraintLayout 官方文档2.为什么要用ConstraintLayout在开发过程中经常能遇到一些复杂的UI,可能会出现布局嵌套过多的问题,嵌套得越多,设备绘制视图所需的时间和计算功耗也就越多。转载 2021-11-03 16:42:34 · 1385 阅读 · 0 评论 -
Android实现可以上下滑动的panel
背景用过美团和滴滴的朋友都知道,他们都有一个可以上下滑动的面板,能够实现上滑,下拉和悬停,那么要怎么实现呢,下面我们就来简单探讨下。使用ViewDragHelper实现思路:这是一个底部抽屉,它可以悬停在中间,随着滑动自然过渡到全屏。它是仿照DrawLayout设计实现的,只不过是竖直方向的,内部通过ViewDragHelper实现,具体参照以下实现Android 简易悬停抽屉控件 —— 仿知乎收藏夹 fashare2015 /HoverView umano /AndroidSliding原创 2021-10-07 22:26:06 · 1771 阅读 · 0 评论 -
Android EditText使用总结
设置EditText的背景通过设置以下属性来设置EditText的背景 android:background="@drawable/decoration"decoration.xml 的内容<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <原创 2021-08-13 18:40:16 · 3174 阅读 · 0 评论 -
Android ImageView的scaleType详解
ImageView 是 Android 中最常用的控件之一,而在使用ImageView时,必不可少的会使用到它的scaleType属性。该属性指定了你想让ImageView如何显示图片,包括是否进行缩放、等比缩放、缩放后展示位置等。Android 提供了八种scaleType的属性值,每种都对应了一种展示方式,下面就对每一种scaleType属性值进行解释。ImageView的scaleType的属性值有MATRIX,FIT_XY,FIT_START,FIT_END,FIT_CENTER,CENTER,转载 2021-07-22 18:28:32 · 27432 阅读 · 1 评论 -
修改CardView的阴影颜色
通过暴露自定义view的阴影属性或者反射来设置CardView的阴影颜色demo传送门参考如何设置 CardView 阴影颜色利用反射设置CardView阴影颜色原创 2021-05-26 16:32:31 · 1588 阅读 · 0 评论 -
Android的View加id与不加id的区别
【Android面试】(二):你不能不知道的view—加id和不加id的区别?原创 2021-03-24 14:47:57 · 416 阅读 · 0 评论 -
Android Studio中Gradle从命令行构建应用和配置编译版本
从命令行构建您的应用您可以使用 Gradle 封装容器命令行工具执行 Android 项目可用的所有构建任务。它可作为 Windows 的批处理文件 (gradlew.bat) 和 Linux 与 Mac 的 shell 脚本 (gradlew.sh) 使用,而且您可以从使用 Android Studio 创建的每个项目的根目录启动该工具。如需使用封装容器运行任务,请在终端窗口中(在 Android Studio 中,依次选择 View > Tool Windows > Terminal)使原创 2021-03-14 23:46:58 · 3453 阅读 · 0 评论 -
Android应用内换肤
换肤简介换肤本质上是对资源的一种替换包括、字体、颜色、背景、图片、大小等等。比如View的修改背景颜色setBackgroundColor,TextView的setTextSize修改字体等等。换肤方案目前Android换肤有两种类型,静态换肤和动态换肤;静态换肤就是将所有的皮肤方案放到项目中,而动态换肤则就是从网络加载皮肤包动态切换;通常静态换肤是通过Theme实现,通过在项目中定义多套主题,使用setTheme方法切换的方式实现换肤;动态换肤是通过替换系统的Resouce动态加载下载到本地的原创 2021-03-07 22:43:52 · 851 阅读 · 1 评论 -
kotlin-android-extensions和ViewBinding
背景在kotlin-android-extensions和ViewBinding出现之前,我们进行View控件的实例化通常都是使用findViewById或者ButterKnife之类的第三方库,总的来说就是需要写很多重复且无意义的代码。接下来我们就来介绍kotlin-android-extensions和ViewBinding的使用。使用kotlin-android-extensions插件1.首先在模块的 build.gradle文件中启用 Gradle 安卓扩展插件即可apply plug转载 2021-03-04 13:49:05 · 1597 阅读 · 1 评论 -
Android10和Android11作用域存储Scoped Storage详解
理解作用域存储Android长久以来都支持外置存储空间这个功能,也就是我们常说的SD卡存储。这个功能使用得极其广泛,几乎所有的App都喜欢在SD卡的根目录下建立一个自己专属的目录,用来存放各类文件和数据。那么这么做有什么好处吗?第一,存储在SD卡的文件不会计入到应用程序的占用空间当中,也就是说即使你在SD卡存放了1G的文件,你的应用程序在设置中显示的占用空间仍然可能只有几十K。第二,存储在SD卡的文件,即使应用程序被卸载了,这些文件仍然会被保留下来,这有助于实现一些需要数据被永久保留的功能。然而,这些转载 2021-03-03 22:50:29 · 3801 阅读 · 1 评论 -
Android Jatpack App Startup使用详解
简介App Startup提供了一种在应用程序启动时初始化组件的简单、高效的方法。库开发人员和应用程序开发人员都可以使用应用程序启动来简化启动序列并显式设置初始化顺序。App Startup`允许您定义共享单个内容提供程序的组件初始化程序,而不是为每个需要初始化的组件定义单独的内容提供程序。这可以显著缩短应用程序启动时间。App Startup解决什么问题在学习App Startup的用法之前,首先我们需要搞清楚的是,App Startup具体是用来解决什么问题的。App Startup是一个可以用于转载 2021-03-02 23:29:29 · 386 阅读 · 0 评论 -
Android Jatpack DataStore使用详解
简介Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和流程以异步、一致的事务方式存储数据。如果您当前在使用 SharedPreferences 存储数据,请考虑迁移到 DataStore。注意:如果您需要支持大型或复杂数据集、部分更新或参照完整性,请考虑使用 Room,而不是 DataStore。DataStore非常适合简单的小型数据集,不支持部分更新或参照完整性。Preferences Dat翻译 2021-03-01 23:47:20 · 1370 阅读 · 1 评论 -
Android DeepLink多个参数传递
DeepLink在adb shell命令模拟时,如果有多个参数,& 符号之前要加 \ 进行转义,否则后面的参数收不到。解决方法:$ adb shell am start -W -a android.intent.action.VIEW -d "scheme://host?package=com.tencent.mm\&isNeedComment=true"...原创 2021-02-22 18:59:53 · 1989 阅读 · 0 评论 -
Android DeepLink使用
DeepLink 介绍DeepLink,即为深度链接技术,主要应用场景是通过Web页面直接调用Android原生app,并且把需要的参数通过Uri的形式,直接传递给app,节省用户的注册成本。DeepLink 通常运用于App社交分享、App广告引流、App裂变活动、Web to App、分享效果统计、沉默用户唤醒等场景,对广告引流、活动推广、新闻类、电商类、游戏类、视频直播类App的引流推广和转化都有着奇效。常见使用场景如下:电商类:在分享商品链接中点击,进入 App 内对应店铺或购物页面资讯类转载 2021-02-19 19:30:02 · 7903 阅读 · 0 评论 -
Android获取View宽高的常见方式
背景有时我们会有基于这样的需求,当Activity创建时,调用View.getWidth、View.getHeight()、View.getMeasuredWidth() 、View.getgetMeasuredHeight()来获得某个view的宽度或高度,然后进行相应的操作,但是我们在onCreate()、onStart()、onResume()中获取View的大小,获取到的值都是0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的v原创 2021-02-01 18:09:30 · 11624 阅读 · 0 评论 -
Android native工程引入flutter
Android的native工程以source源码的方式和aar方式引入flutter过程步骤请参阅将 Flutter module 集成到 Android 项目代码请看Demo传送门需要注意的是,以aar方式集成的时候,repositories的maven需要添加到app的build.gradle的android闭包内部,否则无法成功。...原创 2021-01-27 21:40:32 · 139 阅读 · 0 评论 -
Android应用内多语言切换
关于Android多语言支持的介绍,请参阅谷歌Android开发者文档,这里就不再介绍了,下面直接进入正题。实现方案1)在项目的资源文件夹里添加不同语言的value 文件夹strings.xml资源这个可以借助Android Studio来完成(res->New->Android Resources File->Locale)2)设置Configuration 中的 locale 属性Configuration 包含了设备的所有的配置信息,这些配置信息会影响应用获取的资源。例如原创 2021-01-17 20:10:44 · 1557 阅读 · 0 评论 -
Android卸载系统应用
adb无需root卸载系统应用我们都知道一般预置的 APP 是不能卸载的,需要有 root 权限,今天分享一个命令,帮你卸载那些你想卸载又不能卸载的系统预置的 APP。adb shell pm uninstall [-k] [--user USER_ID] 包名参数说明:-k 卸载应用且保留数据与缓存,如果不加 -k 则全部删除。–user 指定用户 id,Android 系统支持多个用户,默认用户只有一个,id=0。可以用这个命令,user 和 debug 版本都可以用,所有应用都转载 2021-01-15 15:36:29 · 2449 阅读 · 0 评论 -
AspectJ学习
Android AOP面向切面编程详解深入理解Android之AOP原创 2021-01-02 18:51:10 · 91 阅读 · 0 评论 -
ARGB透明度换算
ARGB 依次代表透明度(alpha)、红色(red)、绿色(green)、蓝色(blue)。以颜色值 #FF99CC00 为例,其中,FF 是透明度,99 是红色值, CC 是绿色值, 00 是蓝色值。透明度透明度分为256阶(0-255),计算机上用16进制表示为(00-ff)。透明就是0阶,不透明就是255阶,如果50%透明就是127阶(256的一半当然是128,但因为是从0开始,所以实际上是127)。透明度 和 不透明度 是两个概念, 它们加起来是1,或者100%.ARGB 中的透明度al原创 2020-12-18 18:23:09 · 1912 阅读 · 1 评论 -
Android滚动工具Scroller解析
Scroller是一个专门用于处理滚动效果的工具类,很多大家所熟知的控件在内部都是使用Scroller来实现的,如ViewPager、ListView等。如果能够把Scroller的用法熟练掌握的话,我们自己也可以轻松实现出类似于ViewPager这样的功能。先不说Scroller,其实任何一个控件都是可以滚动的,因为在View类当中有scrollTo()和scrollBy()这两个方法,如下图所示:这两个方法都是用于对View进行滚动的,scrollBy()方法是让View相对于当前的位置滚动某段转载 2020-12-02 20:34:23 · 463 阅读 · 0 评论 -
Android滑动事件冲突
如果对Android的触摸事件分发不了解的同学,请先了解完事件分发再看此文章比较容易理解。滑动冲突常见场景1.外层与内层滑动方向不一致,外层ViewGroup是可以横向滑动的,内层View是可以竖向滑动的(类似ViewPager,每个页面里面是ListView)2.外层与内层滑动方向一致,外层ViewGroup是可以竖向滑动的,内层View同样也是竖向滑动的(类似ScrollView包裹ListView)情况1和2的嵌套如下图就是这三种情况示意图滑动冲突解决方案外部拦截法:父View根原创 2020-11-07 16:07:23 · 577 阅读 · 0 评论 -
Android轮播图
youth5201314/bannerAndroid 手写一个轮播图(banner)框架Android App Banner,用它就够了。无限轮播、简单易用、扩展性强的BannerViewandroid banner安利一款轮播控件ViewPager2:打造Banner控件原创 2020-11-06 10:58:05 · 135 阅读 · 0 评论 -
Android Bitmap 全面详解
每一个 Android App 中都会使用到 Bitmap,它也是程序中内存消耗的大户,当 Bitmap 使用内存超过可用空间,则会报 OOM。 因此如何正确使用也是 Android 工程师的重点关注内容。Bitmap 占用内存分析Bitmap 用来描述一张图片的长、宽、颜色等信息。通常情况下,我们可以使用 BitmapFactory 来将某一路径下的图片解析为 Bitmap 对象。当一张图片加载到内存后,具体需要占用多大内存呢?getAllocationByteCount 探索我们可以通过 Bi原创 2020-11-04 18:33:45 · 6984 阅读 · 0 评论 -
Android中Window、Activity和View的关系
Activity 的 setContentView显然 Activity 几乎什么都没做,将操作直接交给了一个 Window 来处理。getWindow 返回的是 Activity 中的全局变量 mWindow,它是 Window 窗口类型。那么它是什么时候赋值的呢?startActivity 的过程,最终代码会调用到 ActivityThread 中的 performLaunchActivity 方法,通过反射创建 Activity 对象,并执行其 attach 方法。Window 就是在这个方法中原创 2020-11-03 16:47:49 · 1001 阅读 · 0 评论 -
Android touch 事件分发
Android touch 事件的分发是 Android 工程师必备技能之一。关于事件分发主要有几个方向可以展开深入分析:touch 事件是如何从驱动层传递给 Framework 层的 InputManagerService;WMS 是如何通过 ViewRootImpl 将事件传递到目标窗口;touch 事件到达 DecorView 后,是如何一步步传递到内部的子 View 中的。其中与上层软件开发息息相关的就是第 3 条,也是本文的重点。Touch事件我们知道一次完整的Touch事件序列为原创 2020-10-13 02:08:23 · 484 阅读 · 0 评论 -
Java线程池详解
背景Java 中线程的创建以及上下文切换是比消耗性能的,因此引入了偏向锁、轻量级锁等优化技术,目的就是减少用户态和核心态之间的切换频率。但是在这些优化基础之上,创建和销毁线程非常损耗性能,那有没有可能复用一些已经被创建好的线程呢?答案是肯定的,那就是线程池。另外,线程的创建需要开辟虚拟机栈、本地方法栈、程序计数器等线程私有的内存空间,在线程销毁时需要回收这些系统资源,频繁地创建销毁线程会浪费大量资源,而通过复用已有线程可以更好地管理和协调线程的工作。线程池主要解决两个问题:当执行大量异步任务时线程原创 2020-10-02 23:58:08 · 163 阅读 · 0 评论 -
MVP 中 presenter 生命周期的管理
我们经常在 Android MVP 架构中的 Presenter 层做一些耗时操作,比如请求网络数据等。然后根据请求后的结果刷新 View。但是如果按返回结束 Activity,而 Presenter 依然在执行耗时操作,那么就有可能造成内存泄漏,严重时甚至会造成程序崩溃,因为 Presenter 中的 View 已经变为 null。为了解决这个问题,我们需要将 Activity 的某些生命周期方法与 Presenter 保持一致。Lifecycle 绑定 Presenter 生命周期LifeCycle原创 2020-09-29 01:47:04 · 1641 阅读 · 0 评论 -
快速掌握Android Handler
Handler 现在几乎是 Android 面试的必问知识点了,主要场景是子线程完成耗时操作的过程中,通过 Handler 向主线程发送消息 Message,用来刷新 UI 界面。分析源码的时候最好是找到一个合适的切入点,Handler 源码的一个切入点就是它的默认构造器。从 new Handler() 开始在无参构造器里调用了重载的构造方法并分别传入 null 和 false。并且在构造方法中给两个全局变量赋值:mLooper 和 mQueue。这两者都是通过 Looper 来获取,具体代码如下:原创 2020-09-27 02:22:44 · 105 阅读 · 0 评论 -
Android动态权限适配
在 Android 6.0 也就是 API 版本 23 之前,App 需要的权限都会在安装阶段向用户展示。而在 App 运行期间则不需要动态判断权限是否已申请。从 6.0 之后的版本开始,App 需要在代码中动态申请相应的权限。权限分类Android 权限分 2 种:普通权限和危险权限,这 2 种权限都需要在 AndroidManifest 清单文件中声明。普通权限(Normal Permission)在程序运行时期自动获取,只需要在清单文件中声明即可。最常用的就是 INTERNET 网络权限。原创 2020-09-23 00:51:04 · 753 阅读 · 0 评论 -
Android网络请求优化
DNS 解析优化安全方面首先是防劫持,我们可以考虑使用 HttpDns。这里需要注意 HttpDns 只是一个概念,并不是一个现有的开源库。它与传统的 DNS 解析的区别在于 HttpDns 会绕过运营商的 DNS 服务器,直接与 DNS 服务器的 80 端口进行交互,有效地防止了域名劫持。目前业内主要由第三方厂商提供实现了 HttpDns 的 SDK,比较普及的是阿里云和腾讯云的 HttpDns Service。但是这两者的使用具有一定的成本:开发者需要在它们的平台注册并获取开发者 key,并且部分原创 2020-09-22 00:25:16 · 1591 阅读 · 0 评论 -
解决okhttp报java.lang.IllegalStateException: closed,java.lang.IllegalStateException: closed
解决okhttp 报java.lang.IllegalStateException: closed,java.lang.IllegalStateException: closed,原因为OkHttp请求回调中response.body().string()只能有效调用一次,我们可以把它保存起来 传递给下一个调用方在调用了response.body().string()方法之后,response中的流会被关闭,我们需要创建出一个新的response给应用层处理。代码如下: @Overridepubl原创 2020-09-21 01:53:08 · 2111 阅读 · 0 评论 -
Android Https的详解
Https的通信过程两种加密加密方式分两种,对称加密和非对称加密。这两种方式都有自己的优劣势, https中这两种方式都采用了。 我们约定S是服务端,C是客户端,客户端需要从服务端获取信息;对称加密这种加密方式比较简单,就是双方都持有密匙。S和C都持有密匙, S通过密匙加密明文传递给C,C获取加密后的信息,用密匙解密信息。优势: 加密速度快劣势: 密匙的传递是个问题,容易被截取,密匙一旦被截取后, 就能轻易破解信息。常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5原创 2020-09-20 16:45:04 · 3989 阅读 · 0 评论 -
Javassit学习
动态字节码生成技术Javassist使用方法总结Javassist 使用指南(一)Javassist 使用指南原创 2020-07-26 19:53:09 · 121 阅读 · 0 评论