Android
文章平均质量分 84
金戈鐡馬
这个作者很懒,什么都没留下…
展开
-
Android蓝牙收发数据
Android蓝牙收发数据原创 2024-01-31 20:20:40 · 320 阅读 · 0 评论 -
Android登录拦截的场景-基于动态代理+Hook的实现
前面我们讲到了Intent原始的方法,虽然使用起来很麻烦但是还是能实现效果的,那有没有简便一点的封装?有的,其实就和本篇的标题一样,早前网上还有这样的一种方案,使用动态代理+Hook的方式,替换启动Activity的对象,把全部的startActivity都拦截掉,替换掉我们自定义的Activiy。如果都写死了所有的Activity跳转都写到一个拦截中,我们又如何实现拦截登录的功能呢?我们需要先使用动态代理+Hook的方式替换全部的Activity启动。原创 2023-12-11 15:09:58 · 603 阅读 · 0 评论 -
Android studio如何安装ai辅助工具
一定要先第三步再第四步,不然android studio起不来,could not find main class com/intellij/idea/main 报这个错,我按网上教程设了几遍环境变量都没啥用,我也不知道为什么,如果遇到了,可以把jbr_17改下名字,启动的时候找不到jbr_17就会用之前的,就启动起来了。在android studio的插件商店(这个应该都知道)搜索codegeex,然后install,就算基本完成了,到这里你就可以使用他的写注释功能了,但是不能代码提示,会说叫你选择。原创 2023-12-09 17:11:26 · 2207 阅读 · 1 评论 -
Android 幸运转盘实现逻辑
幸运转盘在很多app中都有,也有很多现实的例子,不过这个难度并不是如何让转盘转起来,真正的难度是如何统一个方向转动,且转到指定的目标区域(中奖概率从来不是随机的),当然还不能太假,需要有一定的位置偏移。效果预览本篇简单而快捷的实现了幸运转盘,难点主要是角度的转换,一定要分析出初始角度和目标位置的夹角这一个定性标准,其词作一些优化,就能实现幸运转盘效果。原创 2023-12-09 16:59:18 · 476 阅读 · 0 评论 -
浅谈Android 14适配
是申请图片和视频权限的,但是这样会有一个问题,当第三方应用申请到权限后,就拥有了手机相册中所有照片和视频的访问权限,这是十分危险的,也是非常不可控的,因为用户也无法知道第三方应用会干什么,所以谷歌在 API 34(Android 14)引入了这个权限,这样用户拥有了更多的选择,可以将相册中所有的图片和视频授予给第三方应用,也可以将部分的图片和视频给第三方应用。最后表达一下我对这个 API 看法,这个 API 设计得不是很好,比如应用想知道用户是否截图了,应用可能需要知道的是,截图文件的存放路径,但是。原创 2023-12-08 01:22:31 · 3868 阅读 · 0 评论 -
Android hook式插件化详解
其实原理很简单,如果宿主有 dexElements这个数组,那么我们的插件apk 也应该有这个数组,我们只需要把插件的 dexElements数组融合到宿主里面的,那么我们的宿主APP就可以加载到插件的类文件了。的源码发现,它是通过调用 **dispatchMessage() ** 来回调的,从代码里看到,有一个属性 "mCallback",如果我们设置了这个属性的值是不是就走我们自己的逻辑了?这个类呢,因为我们的 Activity 启动的时候就是这个类给调用的,我们要把之前替换成代理。原创 2023-12-08 01:21:57 · 1155 阅读 · 0 评论 -
关于Kotlin Coroutines你可能会犯的 7 个错误
在我看来,Kotlin Coroutines(协程) 大大简化了同步和异步代码。但是,我发现了许多开发者在使用协程时会犯一些通用性的错误。原创 2023-12-07 18:20:47 · 297 阅读 · 0 评论 -
Android Camera 预览尺寸的选取与旋转角度的设定
关于相机预览尺寸的选取和旋转角度的设定到这里便分析结束了, 这里再简单的回顾一下相机预览尺寸的选取统计相机支持的预览尺寸, 按照比例归类从用户传入的比例中找寻与 View 尺寸相当的作为预览尺寸相机旋转角度的设定sensor 坐标系sensor 坐标系图像映射到屏幕坐标系对图像进行校正以确认最终的旋转角度其中 旋转角度的设定 较之 尺寸的选取 要更为困难, 其中牵扯到坐标系的映射和映射后的旋转, 前置相机还需要考虑镜像的抵消, 不过所幸这里将其梳理清楚了。原创 2023-12-07 00:45:32 · 1460 阅读 · 0 评论 -
Android Native Crash 收集
不同的处理器,有不同的异常中断类型和中断处理方式,linux 把这些中断处理,统一为信号量,每一种异常都有一个对应的信号,可以注册回调函数进行处理需要关注的信号量。的结构体指针,它封装了 cpu 相关的上下文,包括当前线程的寄存器信息和奔溃时的 pc 值,能够知道崩溃时的pc,就能知道崩溃时执行的是那条指令,同样的,在本文顶部的那张图中寄存器快照就可以用如下代码获得。捕获到 Crash 的位置;架构的寄存器信息,要兼容其他架构的 cpu 在处理的时候,就得要寄出宏编译大法,不同的架构使用不同的定义。原创 2023-12-06 01:03:07 · 311 阅读 · 0 评论 -
Android 图形系统之 SurfaceTexture
SurfaceTexture是离屏渲染的核心,例如:我们可以把SurfaceTexture设置给Camera接收摄像头图像数据,并转换为OES纹理,然后可以利用OpenGL对OES纹理做进一步特效处理,最后上屏或者录制成视频。所以,理解底层原理有助于业务层开发和问题排查,希望本文对有心人有所帮助。原创 2023-12-06 01:02:36 · 744 阅读 · 0 评论 -
详解Android动态库的加载原理
源码版本:android-13.0.0_r41先通过相关的命名空间查找动态库;找到后打开动态库;把动态库加载到内存中,返回 handler;构建SharedLibrary,存有 3 中的 handler,然后保存到 libraries_ 中;检查是否有 JNI_OnLoad 函数,有就执行;4 中 SharedLibrary 析构的时候,调用 dlclose(handle) 关闭动态库;对动态库加载流程有了整体的认知;对于 ELF 文件结构,认识了一些常见的表和节区;原创 2023-12-05 00:25:16 · 1003 阅读 · 0 评论 -
Android中的动态代理详解
在说动态代理之前,先来简单看下代理模式。代理是最基本的设计模式之一。它能够插入一个用来替代“实际”对象的“代理”对象,来提供额外的或不同的操作。这些操作通常涉及与“实际”对象的通信,因此“代理”对象通常充当着中间人的角色。原创 2023-12-05 00:24:03 · 768 阅读 · 0 评论 -
Android-Framework学习笔记(八)—— Service的启动绑定过程
之前的文章Android-Framework学习笔记(五)—— 应用程序启动过程我们讲解过了应用程序(Activity)的启动过程,本篇我们来看看Service的启动/绑定过程。原创 2023-03-11 00:52:38 · 367 阅读 · 0 评论 -
Kotlin 协程四 —— Flow 和 Channel 的应用
使用 receiveAsFlow() 可以有多个消费者,但当向 Channel 中发射一个数据之后,收到该元素的消费者是不确定的。注意到它内部有一个方法 produceImpl 返回的是一个 ReceiveChannel,它的实现是收集上游发射的数据,然后发送到 Channel 中。使用 receiveAsFlow() 转换成的 Flow 可以有多个收集器收集,但是保证每个元素只能被一个收集器收集到,即单播式。这时候你可能有疑问了,这在流的内部不还是使用了基于接口的调用吗,分明没有更方便。原创 2023-03-13 13:35:58 · 701 阅读 · 0 评论 -
仿墨迹24小时天气自定义View
首先就是拿到icon所在矩形上方曲线的起始点,记住起始点的下标,x,y和icon,icon所在矩形上方曲线结束点的x轴坐标减去icon所在矩形上方曲线起始点的x轴坐标就可以拿到这个矩形的宽,宽除2在加上icon所在矩形上方曲线结束点的x轴坐标就是矩形中间点距离左边的边距,默认icon的left和right是在中间点的基础上减去10dp和加上10dp。这里前面和画曲线一样,原理就是先画出一个天气icon所在的矩形框上方的曲线,然后从曲线的末端向下画一条直线,在向左画至矩形框的左边界,然后封闭起来。原创 2023-02-27 00:01:56 · 355 阅读 · 0 评论 -
Kotlin 协程三 —— 数据流 Flow
Kotlin 协程中使用挂起函数可以实现非阻塞地执行任务并将结果返回回来,但是只能返回单个计算结果。但是如果希望有多个计算结果返回回来,则可以使用 Flow。Flow 可以非阻塞地执行多个任务,并返回多个结果, 在 Flow 中可以调用其它挂起函数。取出 Flow 中的值,则需要调用 collect 方法原创 2023-03-13 00:13:56 · 1266 阅读 · 0 评论 -
Android打造万能的BannerView无限轮播图
这个给ViewPager设置了一个平滑的缩放的动画,但是看到了一个ViewPager设置动画的一个坑,发现滑到第一张的时候,在向右滑动的时候,图片会滑出一点边缘。一般底部会有两种类型指示器,一是矩形的,二是圆形的,这个类实现了如何自定义矩形和圆形指示器,其实这个类也可以实现圆形的和带圆角的矩形的图片,用PorterDuffXfermode图层的概念。BannerAdapter这个类是轮播图的适配器,因为服务器返回的列表图片的url,显示的时候需要转成IamgeViw,用适配器设计模式转一下。原创 2023-02-27 00:45:00 · 978 阅读 · 0 评论 -
Kotlin中Any、Nothing、Unit 类型的概念和用法
这意味着 Any 是你在 Kotlin 中定义的任何类的父类,它与 Java 中的 Object 完全等效。在 Kotlin 中,如果你没有显式指定函数的返回类型,那么函数的默认返回类型是 Unit。这意味着如果函数的返回类型没有显式指定,Kotlin 编译器将使用 Unit 作为返回类型。这些方法可以在任何 Kotlin 类中使用,因为每个类都是 Any 类的子类。需要注意的是,必须明确指定 Nothing 作为返回类型,否则返回类型仍然是 Unit。在上面的示例中,这两个函数的行为是相似的。原创 2023-10-07 07:30:00 · 476 阅读 · 0 评论 -
Kotlin中reified 关键字
在开始之前,让我们先讨论一下泛型。泛型用于为类、函数或接口提供通用的实现。在上面的代码中,你可以传递任何类型的数据给方法。现在让我们尝试打印出 T 的类型。这是因为和 Java 一样,在 Kotlin 中,当你使用泛型时,类型信息会在编译时被擦除。这个过程被称为类型擦除。例如,如果你有一个,在运行时,它只被视为普通的 List,没有任何关于其类型参数的知识。这意味着你无法在运行时执行诸如检查对象是否为泛型类型之类的操作。原创 2023-10-06 00:30:00 · 381 阅读 · 1 评论 -
Kotlin中的泛型理解与应用
泛型是一种在编程中用于增加代码的灵活性和重用性的概念。它允许我们编写可以在多种类型上工作的通用代码,而不需要为每种类型都编写不同的代码。这些是泛型在Kotlin中的一些基本用法。通过使用泛型,我们可以编写更通用、灵活且可重用的代码。希望这些示例对你有所帮助!原创 2023-10-01 19:29:14 · 1262 阅读 · 2 评论 -
安卓Termux搭建Web服务器【公网远程手机Android服务器】
我们可以在Android手机上使用Termux来搭建Web服务器,同时做内网穿透,实现公网用户也可以访问,将Android变成小型的云服务器。由于上面创建的是免费随机隧道,所生成的公网地址会在24小时内随机变化,为了方便长久稳定连接,我们可以固定这个公网地址,配置一个cpolar固定的二级子域名【无需备案】,或者也可以配置使用你自己的域名来访问,这里我们以配置固定的二级子域名来举例。固定后我们使用固定的公网地址,在浏览器中打开,即可看到apache默认页面,这样一个固定的公网地址访问就设置好了。原创 2023-10-03 08:00:00 · 702 阅读 · 0 评论 -
Kotlin中的代理理解与应用
在 Kotlin 编程的领域中,存在着一个被称为代理(Delegates)的隐藏宝藏。那么什么是Kotlin中的代理?如何实现呢?Kotlin 赋予了我们创建自定义代理的能力,可以根据我们的愿望塑造属性行为println(person.name) // 名字被转化了:JOHN FLK在这段代码片段中,打造了一个名为 UpperCaseDelegate 的代理。这个代理为分配的值添加了大写形式,无论是在检索还是设置属性时。原创 2023-10-02 08:00:00 · 248 阅读 · 0 评论 -
Fragment之间进行通信的最佳实现方式
在Android应用程序中,片段(Fragments)是一种组件,用于构建灵活且可重用的用户界面。然而,当在应用程序中使用多个片段时,它们之间的通信变得非常重要。本文将介绍在Android应用程序中实现片段之间和片段与宿主活动之间通信的方式。原创 2023-10-01 01:28:41 · 409 阅读 · 0 评论 -
JNI基础知识总结
JNI(Java Native Interface)是Java提供的一种编程框架,用于实现Java代码与本地(Native)代码(如C、C++等)之间的交互。JNI允许Java应用程序调用本地代码,并且本地代码可以调用Java代码,实现更高性能的操作或访问底层资源。原创 2023-09-27 22:52:04 · 1697 阅读 · 0 评论 -
Android Studio升级到Android API 33版本后,XML布局输入没有提示
低版本的Android Studio升级到Android API 33版本后,XML布局输入没有提示。查一下我目前使用的Android Studio 是2021年发布,而Android API 33是2022年发布的,这是由低版本升级到高版本造成不兼容的问题。原创 2023-08-25 23:35:48 · 1312 阅读 · 0 评论 -
切底掌握Android中的Kotlin DSL
在这篇文章中,我们将学习如何在您的 Android 项目中编写 Kotlin DSL。这个文章会很长,所以花点时间,让我们一起来写你的 DSL。我们将讨论以下主题,什么是简单英语中的 DSL?您使用任何 DSL 吗?为什么我们使用 DSL?我们如何编写自己的 DSL基本示例说明。那么让我们开始吧。维基百科的定义说,领域特定语言( DSL) 是专门针对特定应用领域的计算机语言。这与广泛适用于跨领域的通用语言(GPL)形成对比。喜欢认真吗?原创 2023-06-23 19:56:01 · 1389 阅读 · 0 评论 -
Jetpack Compose 中组件使用教程(比较全面)
在本文中,我们将学习 Jetpack Compose,这是一个用于构建原生 UI 的现代工具包。通过这个完整的教程,我们将学习如何使用 Text、TextField、Preview、Column、Row、Button、Card、AlertDialog、MaterialDesign 元素等。因此,事不宜迟,让我们开始创建一个 Jetpack Compose 项目。因此,本章节是关于通过示例学习适用于 Android 的 Jetpack Compose。原创 2023-06-23 19:34:52 · 1292 阅读 · 0 评论 -
Jetpack Compose中的状态栏适配(Window Insets)
可以直接在布局中用上, 就获取了应该有的padding, 比如statusBarPadding是top, navigationBarsPadding是bottom.这都不用开发者自己想.或者更直接地用自己获取想要inset类型的相关尺寸.设置合理的bottom padding: 在哪里设置, 需要设置多少.让View主动bring自己到可见位置.Insets库里还提供了键盘随着滚动消失和出现的例子. 感兴趣可以看下.获取各种insets信息然后用提供.原创 2023-06-02 00:00:00 · 2083 阅读 · 0 评论 -
Jetpack Hilt 框架的基本使用
Hilt 是一个功能强大、用法简单的依赖注入框架,于 2020 年加入到 Jetpack 家族中。它是 Android 团队联系了 Dagger2 团队,一起开发出来的一个专门面向 Android 的依赖注入框架。相比于 Dagger2,Hilt 最明显的特征就是简单,并且提供了 Android 专属的 API。原创 2023-05-31 08:00:00 · 1612 阅读 · 0 评论 -
Kotlin 协程的基本概念及用法
在 Kotlin 中,协程就是基于线程来实现的一种更上层的工具 API,类似于 Android 自带的 Handler 系列 API。使用了协程的代码看似阻塞,但由于协程内部做了很多工作(包括自动切换线程),它实际上是非阻塞的。此处的 launch 方法含义是:创建一个新的协程,并在指定的线程上运行它。传给 launch 方法的连续代码段就被叫做一个协程,传给 launch 方法的方法参数可以用于指定执行这段代码的线程。协程在写法上和普通的顺序代码类似,可以让开发者用同步的方式写出异步的代码。原创 2023-05-30 21:38:58 · 4188 阅读 · 3 评论 -
Jetpack Compose UI预览
在学习jetpack compose如何编写ui之前,我认为还是应该先了解与Android studio配合的UI预览@Preview。这样就可以立刻看到UI效果,从而方便后续学习验证代码。注意:此功能从 Android Studio Dolphin 和 Jetpack Compose 1.2.0-beta01 开始提供简单的说,这个功能其实是多个@Preview 自定义组合在一起,这样你可以配置属于你需求的@Preview。并且可以选择满足在不同条件下的ui预览。原创 2023-05-23 00:30:00 · 1062 阅读 · 0 评论 -
Jetpack Compose动画实现原理详解
Jetpack Compose是Google推出的用于构建原生界面的新Android 工具包,它可简化并加快 Android上的界面开发。Jetpack Compose是一个声明式的UI框架,随着该框架的推出,标志着Android 开始全面拥抱声明式UI开发。Jetpack Compose存在很多优点:代码更加简洁直观、应用开发效率显著提升、Kotlin API功能直观、预览工具强大等。原创 2023-05-22 00:15:00 · 706 阅读 · 0 评论 -
详解Jetpack Compose中的Modifier修饰符
本文将会介绍Jetpack Compose中的Modifier。在谷歌官方文档中它的描述是这么一句话:Modifier元素是一个有序、不可变的集合,它可以往Jetpack Compose UI元素中添加修饰或者各种行为。例如,背景、填充和单击事件监听器装饰或添加行为到文本或按钮。 Modifier修饰符的作用是快速的修改组件的显示大小、边距、边框、背景颜色、剪裁、点击等等,Modifier在Compose的全部组件上都有存在,需要熟练的掌握。另外Modifier是可以被扩展函数扩展的原创 2023-05-21 00:15:00 · 1075 阅读 · 0 评论 -
详解Jetpack Compose中的状态管理与使用
引用一段官方描述,如下由于 Compose 是声明式工具集,因此更新它的唯一方法是通过新参数调用同一可组合项。这些参数是界面状态的表现形式。每当状态更新时,都会发生重组。因此,TextField 不会像在基于 XML 的命令式视图中那样自动更新。可组合项必须明确获知新状态,才能相应地进行更新。原创 2023-05-20 00:30:00 · 1352 阅读 · 2 评论 -
详解Jetpack Compose的标准布局
Compose是一个声明式UI系统,其中,我们用一组函数来声明UI,并且一个Compose函数可以嵌套另一个Compose函数,并以树的结构来构造所需要的UI。在Compose中,我们称该树为UI 图,当UI需要改变的时候会刷新此UI图,比如Compose函数中有 if 语句,那么Kotlin编译器就需要注意了。在Compose的世界中,没有类的概念,全都是函数,并且都是顶层函数,因此不会有任何继承和层次机构问题。原创 2023-05-19 00:15:00 · 1389 阅读 · 0 评论 -
Jetpack Compose中的附带效应简介及使用
附带效应是指LaunchedEffect、DisposableEffect、rememberCoroutineScope、rememberUpdatedState、produceState 、derivedStateOf的使用。附带效应这4个字在google官方文档上的表达与解释挺让人难以理解的。其实个人认为准确的描述应该是外部产生的数据向Compose状态作用域内传递。这里的外部数据是指网络请求数据、数据库数据、定时触发状态、子线程运算数据、Activity生命周期等等这些数据。原创 2023-05-18 01:16:27 · 970 阅读 · 0 评论 -
Jetpack Compose中的列表控件LazyRow和LazyColumn详解
如果你需要显示大量的条目(或一个未知长度的列表),使用像 Column 这样的布局会导致性能问题,因为所有的条目都会被组合和布局,无论它们是否可见。那么,在Compose中有没有像RecycleView的控件可以滑动呢?答案:是有的,它们分别是LazyRow和LazyColumn。原创 2023-05-17 00:15:00 · 3817 阅读 · 0 评论 -
Jetpack Compose中使用MD样式组件Scaffold及导航底部菜单的实现
Compose给我们提供了一个Material Design样式的首页组件(Scaffold),我们可以直接套用从而完成一个APP的首页界面由于Scaffold中还包含有其他的组件,所以讲解Scaffold先讲解前置的一些组件。原创 2023-05-16 00:30:00 · 1241 阅读 · 0 评论 -
Jetpack Compose中自定义布局
在compose中,Modifier提供了一系列函数,使用它们可以提供很多布局上的参数,比如padding等信息,通过自定义modifier来看下它是怎么工作的。通过扩展函数来扩展Modifier中的方法,因为modifier是链式调用的,我们扩展的方法也应该符合链式调用规则,方法用来辅助完成链式调用,它接受一个Modifier,返回一个与这个Modifier结合后的Modifier。里面的这个layout。原创 2023-05-15 00:15:00 · 139 阅读 · 0 评论 -
Jetpack Compose中的Layouts使用
您将学习如何使用Compose的最高层次的UI抽象,Material Design,以及低级的可组合工具,如Layout,它允许您测量并在屏幕上放置元素。在view的体系中, 创建custom layout需要继承ViewGroup, 在Compose中只需要使用Layout函数。原创 2023-05-14 08:00:00 · 214 阅读 · 0 评论