![](https://img-blog.csdnimg.cn/20200209101840206.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
android笔记
文章平均质量分 77
android学习笔记
爱炒饭
每天进步一点点
展开
-
uiautomator实现控件查找与点击
android自动化测试原创 2022-12-17 13:51:24 · 642 阅读 · 1 评论 -
ndk之C调用java方法以及动态注册
一、静态注册和动态注册ndk开发需要在java层和native层相互调用代码,如何确定native方法与jni函数之间的映射关系呢?这就涉及到jni函数的注册,注册方式有两种:静态注册和动态注册。静态注册采用基于约定的命名规则(Java_开头,后接类的全限定名加下划线,方法名这三个组成部分组成,如下代码所示),可以通过javah或IDE自动生成native方法对应的函数声明。优点是简单;缺点是不灵活,修改java类名或jni方法名时,需要同步修改对应的native函数命名。extern "C"JN原创 2022-01-30 16:55:27 · 2023 阅读 · 0 评论 -
AS Arctic Fox配置360加固命令行模式gradle插件
在Gradle中创建自己定义插件,Gradle提供了三种方式:在build.gradle脚本中直接使用在buildSrc中使用在独立Module中使用本文介绍的是第三种,第三种方式的插件可以上传到本地或者网络上供其它工程或者项目使用一、配置流程1.1插件module代码编写新建一个module,java module或者android library module都可以,反正后面会修改插件module的build.gradle文件,去掉相关依赖。在插件module的main目录下新建groo原创 2022-01-24 20:20:23 · 2251 阅读 · 1 评论 -
mmap实现进程内写数据和读数据
使用mmap函数可以实现内存映射,腾讯的mmkv就是基于mmap函数实现的匿名共享内存实现的,android中的binder也用到了mmap函数。本文在同一个进程内(进程和子进程间)实现了一个mmap共享内容的demo。首先声明一个mmap java工具类BinderHelper.java//BinderHelper.javapackage com.example.mmapapp;public class BinderHelper { // Used to load the 'native原创 2022-01-07 20:33:45 · 2202 阅读 · 0 评论 -
dialog token null is not valid; is your activity running源码分析
大家直到在android中普通dialog(不是系统级dialog)构造函数的context必须是activity类型的,不能是application类型的context,为什么呢?本文从源码角度来分析下,分为androidX场景和非androidX场景。下面是一个简单的普通dialog弹出,关键在于第一Builder的构造参数是application的context,毫无意外,运行会报错。AlertDialog alertDialog = new AlertDialog.Builder(getAppl原创 2021-12-11 15:55:32 · 3322 阅读 · 1 评论 -
Handler.post不执行
使用HandlerThread的Looper创建一个Handler的对象mIoHandler,然后通过点击事件go触发该mIoHandler的post方法去执行一个Runnable,该Runnable会持有锁等待直到被唤醒(模拟耗时操作),点击事件undo则可以试下唤醒锁等待的功能,代码如下mIoHandlerThread = new HandlerThread("io");mIoHandlerThread.start();mIoHandler = new Handler(mIoHandlerThre原创 2021-11-23 20:34:40 · 3661 阅读 · 0 评论 -
命令模式以及在android中的使用
一、原理命令模式将任务请求封装成命令对象,命令对象中封装有任务处理者对象,调用者持有这个命令对象,这就使得调用者和处理者没有直接联系,降低了耦合度。同时,根据不同的请求可以参数化命令对象,可以将多个对象放入到集合中排队执行。命令模式的UML图如下,安利一个UML绘制网站https://app.diagrams.net/。命令模式可以适用组合的方式将发出请求的对象和执行请求的对象解耦,这样后面拓展新的命令比较容易;缺点就是会出现过多的具体命令类以及处理者类。二、实践那上课为例吧,现在有个一个调用者-原创 2021-08-24 20:37:48 · 398 阅读 · 0 评论 -
单例模式以及在android中的使用
一、原理程序中某个对象可能比较消耗内存或者创建多个对象实例会引起运行错乱,此时就要求程序中只有一个该对象的实例,也就是单例模式的由来。为了防止开发者创建多个实例,一般会将单例类的构造器设为私有(private),这样你在其它地方去new单例类会失败;然后创建一个该单例类的静态方法去初始化实例对象并返回实例对象,当然实例对象也要是private static的,这样就必须通过静态方法获取该类的实例对象了。考虑到创建对象的过程并不是原子的,也要兼顾多线程安全问题。二、分类有多种构建单例的方式,它们都有优缺原创 2021-08-14 16:27:54 · 1139 阅读 · 0 评论 -
View测量流程与困惑
周末重新温习了一下《Android开发艺术探索》的View测量部分,View的尺寸由父容器和控件本身的LayoutParams决定的。父容器调用View的measure方法,View的measure方法接着调用onMeasure方法,在onMeasure方法确定测量宽高后通过setMeasuredDimension方法设置宽高,整个测量流程是measure->onMeasure->setMeasuredDimension。//View.javapublic final void measur原创 2021-08-02 21:06:27 · 224 阅读 · 1 评论 -
责任链模式
一、原理当有两个或两个以上对象有机会处理某个请求时,可以将这些对象添加到一个对象链表,然后对链表中的对象依次遍历,如果某个对象可以处理请求则遍历结束,该请求被这个对象处理消耗掉;否则,如果该对象无法处理请求,就请求链表中的下一个对象,以此类推,这就是责任链模式。责任链模式可以将请求发送者和处理者解耦,请求发送者只和链表头发生联系,这样也便于链表的排序和增删,当然因为循环调用代码调试以及排错可能也麻烦些。android中用到很多责任链模式的地方,比如view事件分发、有序广播、以及okhttp中的拦截器原创 2021-07-24 20:41:38 · 130 阅读 · 2 评论 -
Scheduling restart of crashed service解决方案与源码分析
测试发现一个bug,service中某个方法由于空指针导致程序挂掉,接着触发程序的保活机制触发程序重启,但是这个异常service先启动访问未初始化资源导致程序连续循环重启,log中打印一个信息很关键。ActivityManager: Scheduling restart of crashed service com.shan.mvvm/.MyService in 1000ms for start-requested系统按照程序启动时要求重新启动了service。这就要提到Service的onStar原创 2021-07-17 10:30:43 · 10645 阅读 · 1 评论 -
子线程Looper.loop之后
android规定不允许子线程更新UI,在ViewRootImpl 类中很多操作UI的方法都会调用checkThread()方法检查线程,如果当前线程与创建ViewRootImpl (mThread )的线程不一致就会报“Only the original thread that created a view hierarchy can touch its views”//ViewRootImpl.javavoid checkThread() { if (mThread != Thread.cu原创 2021-07-05 21:11:14 · 1108 阅读 · 2 评论 -
电脑无法通过USB方式访问手机存储
本人电脑是win10系统,偶尔将安卓手机连接到电脑,USB用途选择“文件传输"或者连接方式选择“媒体设备(MTP)”之后,发现电脑无法显示手机图标,而且找不到盘符或移动盘的标志,通过驱动精灵、驱动人生等软件没解决问题,网上搜索了一下找到了解决方案,解决步骤如下:电脑->右键->管理->设备管理器,可以看到便携设备一列的下面MTP前面有个黄色感叹号。...原创 2021-06-23 21:12:38 · 15949 阅读 · 3 评论 -
面向切面编程:aspectJ在Android中的使用
一、 简介和使用场景aspectJ(https://www.eclipse.org/aspectj/)是eclipse社区中的一个开源工具,可以对java编程语言面向切面进行无缝拓展、完全兼容java语言,它可以对关注切点进行优雅处理,比如错误检查与处理、性能优化、监视与日志记录等场景。说到面向切面编程,大家可能会联想到著名的Spring AOP,Spring AOP是基于动态代理模式实现的。代理模式分为静态代理和动态代理,静态代理在编译期修改代码将指定对象注入到代码中,拓展性差、耦合性强;动态代理在运原创 2021-06-19 17:38:04 · 1137 阅读 · 5 评论 -
ThreadLocal和InheritableThreadLocal
一、引子最近在研究fps帧率时候了解到可以通过Choreographer刷新帧率的方法来统计界面刷新帧率,在当前应用确实可以,但是却不能监测其他app(比如QQ、微信、酷我音乐),为什么呢?难道说Choreographer不是全局变量。...原创 2021-06-12 18:28:49 · 1228 阅读 · 4 评论 -
apk的打包和优化
一、打包过程与工具借用下Android 打包流程一文画的apk打包流程图。原创 2021-06-04 20:07:31 · 678 阅读 · 1 评论 -
Android路由
一、模块化和组件化Android开发中,随着功能的不断增加,整个项目越来约庞大,导致代码结构混乱,修改繁琐,管理困难,android模块化开发的思想应运而生。模块化主要时为了解耦,将功能以模块的形式进行封装,模块间通过接口调用形进行通信,不同功能可以由不同的开发人员去开发、维护,每个开发人员只需关注自己负责的模块即可。 简单的模块化开发只需将不同的模块代码放在不同的文家夹路径下即可区分,但是复杂的项目或者便于独立依赖引用的需要可能需要将不同的模块功能放置在不同的library中,此时依赖和接触依赖只需在原创 2021-06-01 21:21:57 · 3138 阅读 · 11 评论 -
手动实现bindview
以前android开发中用到过xUtils3和butterknife框架来动态注册控件id,节省繁琐的findViewById操作,今天就来试着自己写一个findViewById操作包装库。首先需要知道xUtils3和butterknife使用注解在编译时自动生成模板代码来实现的,那么就需要注解,注解之前在《注解》一文中有介绍; 同时为了方便生成java文件可以使用javapoet,javapoet是由squareup公司开源的java代码生成器,可以去github上查看详细文档。1、总览总的工原创 2021-05-21 20:04:13 · 697 阅读 · 2 评论 -
Project Butter与invalidate
一、Project Buttergoogle希望摆脱android UI交互方面的滞后、卡顿问题,在android4.1提出了Project Butter,力争UI如黄油般丝滑。为了确保一致的帧速率,Android 4.1 将Vsync 计时扩展到了所有由 Android 框架完成的绘图和动画中。包括应用渲染、轻触事件、画面构成和显示刷新在内的一切操作均按照 16 毫秒的 Vsync 检测信号同步运行,因此帧不会提前或延迟。Android 4.1 还在图形管道中添加了三重缓冲,以实现更加一致的.原创 2021-05-12 21:20:25 · 238 阅读 · 5 评论 -
anr原因二:BroadcastQueue
本文基于android9.0源码分析。android出现经常与四大组件有紧密联系,主要有四种情况1、activity界面输入事件超时 2、broadcastReceiver发送以及接收事件超时 3、service处理事务超时 4、contentProvider处理事务超时。在上一篇文章《anr原因一:inputDispatcher》中对输入事件的anr源码进行了分析,本文则对broadcastReceiver产生的anr进行分析。一、发送广播先从发送广播说起吧,执行sendBroad原创 2021-04-29 17:53:35 · 812 阅读 · 1 评论 -
anr原因一:inputDispatcher
android出现经常与四大组件有紧密联系,主要有四种情况1、activity界面输入事件超时 2、broadcastReceiver发送以及接收事件超时 3、service处理事务超时 4、contentProvider处理事务超时。先透露一下,anr弹框最终会调用ProcessRecord的appNotResponding方法,搜索源码发现有四个地方调用了ProcessRecord.appNotResponding方法,这也验证了上面的说法。本文只分析activity相关的inputDisp原创 2021-04-23 15:49:18 · 2740 阅读 · 1 评论 -
AccessibilityService事件输入源码
android底层Input事件传递流程一文从源码角度介绍了android底层输入事件的来源与分发,那么本文就专门介绍下无障碍服务的来源与分发。本文基于android9.0源码进行分析,从AccessibilityService绑定到系统服务以及系统服务发送事件消息给AccessibilityService两个过程来分析。1、服务绑定在无障碍服务和悬浮框一文中介绍了应用层实现无障碍服务的一个例子。我们知道应用层要实现无障碍服务首先要创建一个AccessibilityService的子类,并在这个子类原创 2021-04-21 19:42:37 · 1284 阅读 · 1 评论 -
android底层Input事件传递流程
在android事件分发机制一文中介绍了Touch事件的分发,那么Touch事件从哪里来的呢?本文基于android9源码进行分析。一、IMS首先,触摸事件肯定需要驱动去接收,android是在/dev/input节点获取事件。由于WindowManagerService.java(后面简称WMS)负责界面窗口的管理,既然是屏幕事件那么肯定和WMS有关了,WMS是在SystemServer.java的startOtherServices方法中启动的,WMS的构造参数有InputManagerSe原创 2021-04-16 15:22:35 · 1189 阅读 · 1 评论 -
RxJava(被)观察者创建与线程调度
本文使用rxjava2版本进行讲解:implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'implementation 'io.reactivex.rxjava2:rxjava:2.1.8'0、 代码实例//被观察者Observable observable= Observable.create(new ObservableOnSubscribe<String>() { @Override public v原创 2021-04-03 18:06:18 · 423 阅读 · 0 评论 -
okhttp执行与拦截器
本文使用okhttp3源码来讲解1、同步和异步的区别(1)同步方法execute()okHttpBuilder.build().newCall()会创建一个RealCall对象//OkHttpClient.java@Override public Call newCall(Request request) { return RealCall.newRealCall(this, request, false /* for web socket */);}然后看下RealCall的原创 2021-03-18 20:49:00 · 284 阅读 · 1 评论 -
无障碍服务和悬浮框
一、无障碍服务开启AccessibilityService是一个抽象类,应用需要创建Service来继承AccessibilityService并实现抽象方法。1、创建HongBaoService.java2、AndroidManifest.xml中声明并配置<service android:name="com.yhao.floatwindow.HongBaoService" android:enabled="true" android:exported=原创 2021-02-05 08:55:26 · 2956 阅读 · 11 评论 -
数据双向绑定:DataBinding VS Livedata+ViewModel
一、DataBindingDataBinding是选择一个可以修改的控件,比如EditText、CheckBox等,对比单向绑定,需要多一个=符号,并且变量模型使用ObservableField,就能保证View层和ViewModel层的状态同步了。BaseObservable 单向绑定,在中间又要写注解,又要加注解,然后还得用notifyPropertyChanged();和notifyChange();进行刷新。这样整体下来是比较麻烦的,所以,可以用ObservableField...原创 2020-12-26 19:06:47 · 3768 阅读 · 1 评论 -
android studio Live Templates
android studio中有一些模板可以加快开发者的开发效率,比如下面android自带的模板,输入const就会提示常量定义模板,具体内容在Templates text中展示,还有fbc,foreach等,可能大家平时没注意。当然,开发者也可以自定义模板。1、位置通过Settings ->Editor -> Live Templates可以进入模板展示界面2、创建模板组既然是自己自定义模板,那就创建一个模板组吧,方面后续创建多个模板3、创建模板模板组原创 2020-11-07 17:45:21 · 296 阅读 · 0 评论 -
FileProvider安装应用
一、权限相关1、“未知来源”应用ndroid8.0及其以上系统,为了申请“未知来源”,需要在清单文件添加权限<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>然后代码中动态申请public void setInstallPermission(){ boolean haveInstallPermission; if(Build.VERSION.SDK_INT原创 2020-10-30 20:38:01 · 1752 阅读 · 0 评论 -
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES
通过android studio工具栏的Build -> Build Bundle(s)/APK(s) ->Build APK(s)得到一个app-release-unsigned.apk,安装此apk会报下面截图错误按照提示是由于apk中没有签名文件,解压并比较该apk和正常可安装apk可以看出确实缺少CERT.RSA以及CERT.SF文件。签名文件可以在java的bi...原创 2020-05-01 16:52:08 · 9146 阅读 · 1 评论 -
FileObserver使用
ContentObserver可以监听不同程序间指定uri或者cursor内容的变化,如果两个无网络连接的设备通过OTG线相连,并且两设备可以通过U盘路径的方式相互访问存储,那么两设备的不同应用通信可以尝试通过FileObserver或者ContentObserver来进行,本文主要讲解FileObserver。FileObserver是一个抽象类,可以创建FileObserver一个子类并且...原创 2020-04-03 19:02:53 · 959 阅读 · 0 评论 -
adb常用命令
adb shell dumpsys window | findstr mCurrentFocus查看当前界面的包名和类名原创 2020-02-22 17:27:26 · 760 阅读 · 0 评论 -
android性能优化之渲染优化和内存优化
卡顿:Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染。如果你的某个操作是大于16ms,系统在得到VSYNC信号的时候就无法进行正常的渲染,这样就发生了丢帧即卡顿现象。ANR:主线程在特定的时间内没有做完特定的事情, 通常在如下两种情况下会弹出ANR对话框:5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等). BroadcastReceiver在10s内无法结束...原创 2018-08-12 22:31:33 · 1344 阅读 · 0 评论 -
PorterDuff.Mode之动态扫描图
PorterDuff.Mode自android api1就引入了,主要是对两个图片进行交、并、异或等操作,主要有下列几种形式本文利用SrcIn实现一个人脸扫描的效果,步骤如下:1、准备两个人脸照片(一明一暗),暗照片作为背景,亮照片作为src前景显示2、然后通过SrcIn用一个透明矩形框(Dst)与亮照片(src)取交集即可得出一个亮照片的局部区域3、再给透明矩形一个上下的速度...原创 2018-08-04 21:13:57 · 293 阅读 · 0 评论 -
android资源替换方案overlay
Android overlay机制的目的是为OEM厂商提供一种替换原生系统资源的机制,它允许在不修改packages中apk的情况下,来自定义 framework和package中的资源文件,实现资源的定制。一、RRO原理应用运行时,通过 getString/getDrawable去调用某个资源,会将资源的resources ID 作为参数传给Framework层。Framework层查找资源时会...原创 2018-07-15 10:42:38 · 8650 阅读 · 4 评论 -
android自定义View之气球碰撞效果
最近项目需要做个许多小球碰撞的效果,就用自定义View撸了一个出来,效果如下这个效果也不复杂,说下算法步骤吧。1、小球数量ballCount,可以设个最大值,在这个阈值内去随机数2、小球圆心随机坐标(mX,mY)以及半径radius3、小球在x方向和y方向的随机速度mSpeedX,mSpeedY4、本次效果小球默认白色,通过alpha设置透明度,实际你们也可以通过随机颜色值达到五彩频繁的小球效果。...原创 2018-07-14 17:08:31 · 2101 阅读 · 0 评论 -
android加载大图
故事要从一场面试说起,如何加载一个大图而不会发生OOM?这里有两种途径,一、降采样大图;二、局部加载大图。由于android内存的限制,andoid系统给每个应用分配的内存是有限的,当直接加载一个占用内存加大的图片时就会发生OOM。一、降采样大图主要是利用BitmapFactory.Options对象的inSampleSize参数,根据空间尺寸与大图尺寸的比率来缩小大图,从而显示大图的缩略图。关键...原创 2018-07-02 21:42:44 · 1025 阅读 · 0 评论 -
JobScheduler、JobInfo、JobService三角关系
JobScheduler是Android L(API21)新增的特性,该框架将在执行作业(也就是JobInfo)时智能化,并尽可能地批量并推迟JobInfo,从而节省电量。Android8.0及以上建议使用JobScheduler来启动服务。JobScheduler是作业发布器,它的任务是分发设置作业JobInfo。JobInfo是作业包装体,它包含了任务执行的条件、开始时间、截止时间、具体任务、...原创 2018-06-29 21:30:28 · 3647 阅读 · 0 评论 -
Android中5种访问UI线程的方法
android提供了几种在其他线程中访问UI线程的方法。1、Activity.runOnUiThread( Runnable ) 2、View.post( Runnable ) 3、View.postDelayed( Runnable, long ) 4、Hanlder 5、AsyncTask原创 2016-09-28 20:09:04 · 1085 阅读 · 0 评论 -
implementation和api替代compile,compileOnly替代provided,runtimeOnly替代apk
Gradle 3.4 引入了新的Java 库插件配置,允许您控制到编译和运行时类路径的发布(适用于模块间依赖项)。 Android 插件 3.0.0 正在迁移到这些新依赖项配置。 要迁移您的项目,只需更新您的依赖项以使用新配置,而非已弃用配置,如下表中所列。新配置 已弃用配置 行为 implementation compile 依赖项在编译时对模块可用,并且仅在运...原创 2018-08-30 20:22:02 · 9391 阅读 · 0 评论