
android进阶
文章平均质量分 61
沙滩捡贝壳的小孩
所有努力都会一点一点汇聚,最终实现一点突破
展开
-
进程保活-账号同步实现
账户同步的作用 : 如果应用的数据发生了改变 , 可以通过账户进行同步 , 进而与服务器进行数据同步操作 , 执行同步时 , 系统会拉活对应的应用进程;实现的话,主要是应用 APP 中可以注册 " 账户服务 Service " , 应用安装后 , 如果系统发现应用中有该类型服务 , 就会为该应用开放添加账户的功能;系统通过 Binder 机制 , 操作用户的 " 账户服务 Service ";Google 官方提供了账户同步案例 ,, 已经停止维护了 , 但是项目还是有参考价值的;原创 2023-11-20 16:13:32 · 376 阅读 · 1 评论 -
Android 基本属性绘制文本对象FontMetrics
4. Leading文档说的很含糊,其实是上一行字符的descent到下一行的ascent之间的距离。6. 同上,bottom指的是最下字符到baseline的值,即descent的最大值。5. Top指的是指的是最高字符到baseline的值,即ascent的最大值。3. Descent是baseline之下至字符最低处的距离。2. Ascent是baseline之上至字符最高处的距离。1. 基准点是baseline。原创 2023-11-12 23:59:56 · 551 阅读 · 0 评论 -
SVGA自定义文字如何适配RTL
额,但是实际情况你会发现它内部的文字它也是倒过来的,嗯,倒过来的,通过查看源码,我们发现其实它这块设置的文字最终是会给你转个TextBitmap进行遍历绘制的。textBitmap,然后我们对这个bitmap进行再次翻转就好了,翻转代码已经写里头了,嗯,就这吧--!这块drawSprite就是根据imageKey,也就是设计师给我们准备的填充区域对应的key,对这块进行轮询绘制。正常我们是直接通过设置这块来根据设计师提供的key往里头塞文字的,这块区域也是设计师设置的。原创 2023-06-02 01:46:33 · 357 阅读 · 0 评论 -
使用TouchDelegate扩大控件的点击范围
当我们的控件太小,导致我们无法准确的点击,这时候我们可以在在外面再加一层布局,但这样性能不太好,或者加上padding,但影响这个UI布局。这时候我们可以TouchDelegate扩大控件的点击范围。这块其实是从之前的中的View的onTouchEvent中发现的意思是如果设置了tochDelegate的话,那么它剩下的事件分发就要在其onTouchEvent中事件分发了。原创 2023-03-16 23:11:46 · 245 阅读 · 0 评论 -
android 卡顿、ANR优化(1)屏幕刷新机制
本文通过阅读各种文章和源码总结出来的,如有不对,还望指出目录正文基础概念视觉暂留逐行扫描帧帧率、刷新率、画面撕裂画面撕裂Android屏幕刷新机制的演变单缓存(Android4.0之前)双缓存VSync(垂直同步)三缓存源码解析。原创 2023-03-08 21:10:51 · 902 阅读 · 0 评论 -
Android 事件分发机制(4)-常见面试题
事件分发机制主要涉及3个方法,3个对象,3个事件3个方法分别是dispatchTouchEvent 返回类型是布尔类型的,表示事件是否分发,如果为false的话,则返回上一层onInterTouchEvent 返回类型是布尔类型的,在dispatchTouchEvent内部调用,ViewGroup中调用的,表示事件是否拦截,如果拦截的话,会在ViewGroup中消费事件,执行ViewGroup的onTouchEvent方法,否则会继续分发给View。原创 2023-02-21 14:58:18 · 2593 阅读 · 1 评论 -
handler解析(5)常见面试题
在next取消息的时候,拿当前时间跟链表头的时间做对比,如果头部msg是有延迟的,而且延迟时间还没到的,则进行阻塞,然后等于是开了个定时器,等到时间到了的话,则进行唤醒操作,然后进行next操作取出消息,进行分发。message queue消息队列,以队列的形式对外提供插入和删除操作,内部实际是一个单链表的数据结构,其中的消息的插入是根据传入的when进行插入的,when最短的插入到头部,时间最长的插入到尾部,其余消息根据when的大小对消息进行排序插入,遵循先进先出的原则。静态内部类 + 弱引用。原创 2023-02-16 23:46:43 · 314 阅读 · 0 评论 -
handler解析(4)-Message及Message回收机制
Handler消息机制中Message及Message回收机制详解原创 2023-02-16 15:49:44 · 672 阅读 · 0 评论 -
handler解析(3)-同步消息、异步消息、同步屏障
Message分为3种:普通消息(同步消息)、屏障消息(同步屏障)和异步消息。我们通常使用的都是普通消息,而屏障消息就是在消息队列中插入一个屏障,在屏障之后的所有普通消息都会被挡着,不能被处理。不过异步消息却例外,屏障不会挡住异步消息,因此可以这样认为:屏障消息就是为了确保异步消息的优先级,设置了屏障后,只能处理其后的异步消息,同步消息会被挡住,除非撤销屏障。也就是我一般使用的Message,再通过Handler进行到消息队列,前提是构造Handler时候传的构造参数async为false。原创 2023-02-12 23:37:05 · 2160 阅读 · 0 评论 -
handler解析(2) -Handler源码解析
1.一个线程中只能有一个looper,这块是由ThreadLocal决定的,因为ThreadLocal中包含了一个ThreadLocalMap,在调用looper.prepare时将looper对象set进去ThreadLocal中2.UI线程,就是主线程是不需要在调用looper.prepare跟looper.loop()的,因为这2个在ActivityThread中的main方法中已经调用过了,其中looper.prepare调用的为looper.prepareMainLooper()原创 2023-02-11 17:08:41 · 691 阅读 · 0 评论 -
handler解析(1)——生产者消费者编程模式
某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。在生产者与消费者之间在加个缓冲区,我们形象的称之为仓库,生产者负责往仓库了进商品,而消费者负责从仓库里拿商品,这就构成了生产者消费者模式。转载 2023-01-31 12:00:01 · 521 阅读 · 0 评论 -
android 动态获取资源Id
这种主要是应用于for循环中遍历给view赋值用的,然后view又刚好取名为xx1-9这种,以前这种老是傻傻的一个个findVIewById,今天知道了谷歌是有对应的api去实现的,直接怼代码。这样就可以循环获取到9个控件了。原创 2023-01-10 22:11:40 · 433 阅读 · 0 评论 -
RecycleView左滑删除(仿QQ左滑删除)
实现原理其实很简单,主要是利用自定义HorizontalScrollView平移的方式实现,判断左滑的距离是否大于左滑显示的布局的宽度,如果是的话,则进行左滑操作,否则隐藏。下面开始直接上这个大佬写的代码,核心是这个自定义View。好吧,这个文章我只是转载的,为了方便自己以后参考转的。然后adapter中。原创 2023-01-04 23:43:20 · 1957 阅读 · 0 评论 -
SDK打包成aar后无法引用三方或者本身SDK项目中存在的aar的问题解决
因为公司最近说要把我上次研发的一款工具类的项目说做成SDK的方式,我当时就懵了?SDK我没弄过呀,然后拼拼凑凑的把项目整理成SDK了,然后到打包了,网上搜了七七八八的资料,后面发现原来SDK就是之前我自己有弄过的一个项目变aar的方式来的,Android 项目转打包成aar_沙滩捡贝壳的小孩的博客-优快云博客_android 项目转aar,嗯,就这篇,然后照着之前的步骤打包个aar包出来,然后问题就来了,打包出来后的aar包,嗯,没问题,哎,但是运行的时候,崩了,哎,一看错误AAPT: error:原创 2022-05-29 21:51:00 · 3645 阅读 · 6 评论 -
打包项目到本地maven仓库
这个主要是多人开发SDK的时候用的apply plugin: 'maven'ext { PUBLISH_GROUP_ID = '包名' PUBLISH_ARTIFACT_ID = '依赖库具体名称' PUBLISH_VERSION = '版本号'}// gradle uploadArchivesuploadArchives { repositories { mavenDeployer { repository(url:原创 2022-04-26 16:44:47 · 2658 阅读 · 0 评论 -
从零开始组件化(2)_路由跳转方式和手动搭建组件化路由
在上一篇文章组件化-从零开始组件化(1)_z936689039的博客-优快云博客中,我们已经搭建好整体框架了,然后问题就来了,因为组件化,各个业务组件是互相不依赖的,那假如涉及到跳转,我们应该怎么做呢,目前这块的做法有2种1.隐式跳转通过AndroidManifest中对要跳转的activity设置action值,然后跳转的时候,指定对应的action,从而实现跳转的,例如在要隐式跳转的activity中配置://清单文件注册<activity android:name=".Ma原创 2022-03-07 14:27:43 · 4367 阅读 · 0 评论 -
从零开始组件化(1)-搭建组件化框架
组件化、模块化本质上差不多,但是因为组件化可以转成应用的,方便团队化开发,同时个人开发的话也比较好提高效率,比如个人开发中,你开发了一款登录组件,然后其他项目要用了,或者其他同事要用了,你就可以直接把这个组件复制给它,然后那边的项目或者你的同事复制来后就可以直接用了,达到类似插拔一样的效果,极为方便,省去重复造轮子的麻烦,同时还可以降低项目复杂性,提升开发效率;上面只是我的浅显理解下面来说下具体怎么去实现,还有途中碰到的坑1.组件化编译版本、第三方库统一管理在app根目录下创建个配置的.原创 2022-03-04 23:39:02 · 3497 阅读 · 0 评论 -
tools-replace
当项目中引用了其他库时,若第三方库中的组件属性与本地库发生了冲突,这个时候运行或者编译可能会提示这个错误:/opt/android/app/src/main/AndroidManifest.xml:63:9-69 Error: Attribute application@networkSecurityConfig value=(@xml/network_security_config) from AndroidManifest.xml:63:9-69 is also present at [com.na原创 2022-03-04 14:33:15 · 3988 阅读 · 0 评论 -
组件化-gradle的ext在不同版本的gradle的用法
1.在gradle 6.5+的用法:ext{ build[compileSdkVersion:22]}引用的时候是:rootProject.ext.build.compileSdkVersion2.在gradle 6.5-的用法:def dep = [:]def build = [:]build.compileSdkVersion = 22ext.dep = dep引用的时候是dep.build.compileSdkVersion...原创 2022-02-28 11:50:38 · 1850 阅读 · 0 评论 -
什么是模块化,组件化, 插件化?
最近毕竟火的也就是组件化的应用了,可以大大加快项目的开发进度,对此本人亲自做了demo,有想了解的朋友请关注:https://github.com/wangpengfei1992/ModularizedDemo 废话不多说,解释一下这几个的概念和区别的个人理解.单工程模式移动开发诞生,我们开发移动项目,我相信大多用的是单工程单任务的开发模式,二话不说,直接就开始写起,是不是这样呢? new Project -> 分包 -> 写起。我相信都经历过,也写的比较爽,为什么呢? 这种模式不涉及.转载 2022-02-21 18:00:26 · 1133 阅读 · 0 评论 -
Android中的DrawRect()参数解析
官方文档中的定义:具体来说用图解释:其中X轴为手机顶部,y轴为手机左边,然后这几个参数意思其实也就是各个边,记住是矩形(4个边组成的矩形)的各个边比如第一个参数left,意思就是左边这个边到Y轴的距离,确定这个距离后,它代码会帮我们画一条线出来,然后再确定top那条边距离X轴的距离,确定后代码会画条线出来,然后之前已经连接好的left边会跟Top边连接在一起,同理,其他几个参数也是这个意思...原创 2022-02-14 01:46:57 · 2010 阅读 · 0 评论 -
自定义View-view的执行方法
@SuppressLint("HandlerLeak") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("tag","onCreate"); setContentView(R.layout.activity_main);}public class DemoView ex...原创 2021-12-03 02:11:37 · 273 阅读 · 0 评论 -
android 各个版本特性
一:介绍我们可以看到Android版本对应的Api版本二:Android 6.0Google I/O 2015大会如约已于2015年5月28日举行。在发布会上代号为“Marshmallow(棉花糖)”的安卓6.0系统正式推出。Android 6.0 的API级别:23新特性:1.运行时权限(最主要)此版本引入了一种新的权限模式,用户可直接在运行时管理应用权限。对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权原创 2021-11-29 21:13:36 · 8238 阅读 · 0 评论 -
Android事件分发机制(3)-处理滑动冲突
阅读本篇文章之前,建议先阅读Android 事件分发机制(1)-源码分析_z936689039的博客-优快云博客1.案例1原创 2021-11-28 22:58:57 · 239 阅读 · 0 评论 -
Android事件分发机制(2)-setOnCLickLinstener 执行流程
阅读之前建议先看从源码分析Android 事件分发机制_z936689039的博客-优快云博客,可以更方便的理解里面奥妙setOnCLickLinstener,只要写过 Android 的同学应该都见过,大家都知道是点击事件监听,但是是怎么实现的呢?对,你没有猜错,就是回调你在 onClick(View view)中写的方法,就是一个回调方法,然后通过这个方法实现了点击监听,那么问题来了,这个方法它没有在activity或者fragment里头出现,那它是怎么实现的呢,下面直接从源码的角度看这玩意咋原创 2021-11-28 14:31:53 · 2430 阅读 · 0 评论 -
Android 项目转打包成aar
我们在项目开发中会因为产品的各种奇葩需求,然后水平超长发挥开发出一个很牛逼的功能,然后下个项目,哎,我们发现它产品偷懒,哎,就是玩,一样的功能又给你出来了,那么我们以往的做法就是可能是说直接复制项目通过转为module的方式到新项目,这么做也行,但是复制过程中就有点麻烦了,而且还有个问题,编译的时候它会重新编译你这块项目,那么咋办呢,转aar就没这个问题啦具体做法:以下操作都是在app目录下的build.gradle下进行的1.将apply plugin: 'com.android.applic原创 2021-10-18 17:49:58 · 1201 阅读 · 0 评论 -
Gradle 中compile与provided
Gradle compile:jar包/依赖代码 在编译的时候需要依赖,在运行的时候也需要Gradle provided:jar包/依赖代码 仅在编译的时候需要,但是在运行时不需要依赖原创 2021-09-30 17:55:40 · 550 阅读 · 0 评论 -
Android跨进程启动app黑屏问题-终极解决方案!
当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?)。当然从桌面Lunacher启动一个App时也会出现相同情况,那是因为App冷启动也属于跨进程启动Activity。为什么没会出现这种情况呢?真正元凶就是Android创建进程需要准备很多资源,它是一个耗时的操作。黑屏(白屏)原因当A进程启动B进程中的一个Activity时,Android系统会先有zygote进程创建B进程,然后才能启动这个Activity。但创建进程是耗时的,在创建完成之前,新的Activi原创 2021-09-09 16:48:26 · 874 阅读 · 0 评论 -
Android实现自定义View转圆角
防止以后重复造轮子,直接这里搞个代码本质上只要绘制圆角边框就行了,嗯,知道原理了,那代码还不简单?淦,直接上代码 <declare-styleable name="OvalView"> <attr name="all_radius" format="dimension" /> <attr name="ul_radius" format="dimension" /> <attr name="ur_radi原创 2021-07-08 19:01:27 · 1075 阅读 · 1 评论 -
ViewPager判断左滑右滑
。百度坑人,首先就是,都是你抄我,我抄你的,额,不过还是借鉴了百度的方法,直接上代码,不懂的,核心在ViewPager的onPageScroller监听那,@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}里头有3个参数,第一个参数表示当前所处的是item的位置,类似recycleView的position,第二个参数是重点,左滑的话,这个参原创 2021-07-07 15:09:12 · 1506 阅读 · 2 评论 -
android View绘制和重绘常用方法
View绘制分三个步骤,顺序是:onMeasure,onLayout,onDraw。调用invalidate方法只会执行onDraw方法;调用requestLayout方法只会执行onMeasure方法和onLayout方法,并不会执行onDraw方法。所以当我们进行View更新时,若仅View的显示内容发生改变且新显示内容不影响View的大小、位置,则只需调用invalidate方法;若View宽高、位置发生改变且显示内容不变,只需调用requestLayout方法;若两者均发生改变,则需调用两者,按原创 2021-05-21 16:12:50 · 2444 阅读 · 0 评论 -
EditText悬浮标签动画实现
PS:篇幅都是自己的吐槽,烦的话,直接看底部代码,直接复制完事emm...因为UI大佬给的需求缘故,你看要这样的,前面+86-文字是固定的,然后又想实现TextInput中EditText获取到焦点后hint悬浮作为标签显示,这咋搞,我去,一开始我当时第一反应也是说用自定义EditText手动绘制固定文本的方式+TextInputLayout来说实现这个效果。但是发现一个问题,emmm..可能太年轻了吧,弄完后发现这动画效果是实现了,但是hint悬浮的位置是在固定文字的右边出来的,但是这明显不符合需求呀原创 2021-04-02 14:46:32 · 303 阅读 · 0 评论 -
小米、Vivo、Oppo后台弹出界面和锁屏权限检测
最近有个需求,是说要app退居到桌面的时候,收到消息要主动打开app内指定界面,这块理论上直接设置跳转界面就完了,事实在华为手机测试也没问题的,然后现实给你啪啪的打脸了发现到了小米,Vivo跟Oppo手机上,这个就不行了,我去然后经过了一番搜索,终于找到了,这块功能是在https://github.com/zhoulinxue/BGStart参考了这个大佬封装的库上面改的直接上代码: /** * 小米后台弹出界面权限检测 * @param context *原创 2021-03-16 19:11:16 · 4806 阅读 · 6 评论 -
android 自定义View知识点总结
参考文章:https://www.jianshu.com/p/705a6cb6bfee,结合自己的理解搞得分类自定义View的实现方式有以下几种类型 定义 自定义组合控件 多个控件组合成为一个新的控件,方便多处复用 继承系统View控件 继承自TextView等系统控件,在系统控件的基础功能上进行扩展 继承View 不复用系统控件逻辑,继承View进行功能定义 继承系统ViewGroup 继承自LinearLayout等系统控件,在系统控件的基础转载 2020-09-08 01:25:36 · 236 阅读 · 0 评论 -
android 顶部弹窗的2种实现方式
1.popWindowpublic class PopWindowUtil { private View view; private PopupWindow mPopupWindow; private int layou_id; private Activity mContext; private boolean isShowAsView;//是否在某个View下面显示 private boolean isMatchParent;//宽高是否是Ma原创 2020-08-31 21:05:44 · 2711 阅读 · 0 评论 -
android 10 定位权限适配
/** * 判断网络定位是否打开 * * @return 定位打开结果 */public static boolean isLocationEnable(Activity activity) { LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); boolean gps = locationManager.isProvide.原创 2020-08-12 21:52:00 · 2164 阅读 · 2 评论 -
android 加载长图
丢,这个问题纠结老长时间了,后面还是没百度,自己瞎琢磨弄出来,感觉自己棒棒的1.自定义View的方法,详情查看弘扬的博客,百度上广为流传的方法,额,这块得要在滑动这块处理下,要不然给人感觉是上下滑动时整体特别卡顿的,反正我比较渣,这块我没搞好。哈哈,贴出这份百度上广为流传的代码import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import原创 2020-06-14 19:04:56 · 305 阅读 · 0 评论