自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 资源 (2)
  • 收藏
  • 关注

原创 LifecycleEventObserver和DefaultLifecycleObserver使用

摘要: LifecycleEventObserver和DefaultLifecycleObserver是AndroidX中用于监听生命周期的接口。LifecycleEventObserver通过单一onStateChanged方法处理所有事件,适合统一管理或分支逻辑;DefaultLifecycleObserver为每个生命周期阶段提供独立方法(如onCreate),结构清晰,推荐在常规场景使用。两者均通过lifecycle.addObserver注册,需注意及时移除观察者避免内存泄漏。选择依据:需事件集中

2026-02-01 11:22:08 401

原创 创建一个AAOS车载项目的步骤

本文详细介绍了Android Automotive OS(AAOS)应用开发的环境搭建与配置流程。主要内容包括:1)安装Android Studio及AAOS模拟器镜像;2)创建Automotive模拟器设备的方法;3)解决镜像缺失问题的两种方案(官方镜像和厂商镜像);4)创建车载应用项目的步骤;5)Manifest文件中声明车载特性的关键配置;6)简单车载Activity示例代码;7)应用部署到模拟器和真实车机的方法。文章还提供了常见问题的解决方案,如AVD启动异常的处理方法,并强调了车载应用开发中需注意

2026-02-01 10:27:52 1208

原创 Kotlin中suspend的学习记录

Kotlin协程中的suspend函数允许非阻塞式暂停与恢复执行,必须在协程或suspend函数内调用。关键点包括:使用Dispatchers指定线程类型(IO/Default/Main),避免阻塞操作;通过coroutineScope/supervisorScope管理结构化并发;正确处理取消与异常;区分launch(无返回值)、async(需await)和runBlocking(测试用)的使用场景。注意避免常见误区如线程选择不当、阻塞调用未隔离等。supervisorScope允许子协程独立失败,而co

2025-11-24 14:14:46 691

原创 Application.ActivityLifecycleCallbacks记录

Android提供了Application.ActivityLifecycleCallbacks接口,用于全局监听所有Activity的生命周期回调。从API 14开始支持,常用于统计埋点、前后台切换检测、Activity管理等场景。注册方式是在Application的onCreate()中调用registerActivityLifecycleCallbacks(),无需手动注销。该接口包含7个回调方法,分别对应Activity创建、启动、恢复、暂停、停止、保存状态和销毁等生命周期阶段,所有回调都在主线程执

2025-10-10 14:31:44 222

原创 安卓AIDL跨应用通讯的实现

AIDL服务端实现摘要 本文介绍了Android AIDL服务端的实现步骤: 创建AIDL文件:在aidl目录下定义IPartnerService和IPartnerCallback接口,以及PartnerData的Parcelable声明。 配置Gradle:启用aidl编译并设置源文件路径。 实现Parcelable:创建PartnerData类,实现Parcelable接口以支持跨进程传输。 服务端实现:继承Service,通过RemoteCallbackList管理回调,处理数据收发、命令执行等逻辑,

2025-10-10 14:31:25 1111

原创 Flutter图片提取文本记录

本文介绍了使用Google ML Kit实现图片文本识别的Flutter开发方案。主要包含:1)基础环境配置和依赖引入;2)英文数字识别的核心代码实现;3)中文识别需要额外添加text-recognition-chinese依赖库,并指定TextRecognitionScript.chinese参数。文中提供了完整的代码示例,包括图片选择、文本识别和资源释放的实现,并强调不同语言需要对应依赖库支持,否则会导致应用崩溃。该方案支持扩展其他语言识别功能。

2025-09-30 17:36:15 282

原创 安卓Handler+Messenger实现跨应用通讯

本文介绍了Android中使用Messenger进行跨进程通信的实现方法。服务端创建MessengerService处理客户端消息,包括消息类型定义、Handler实现和Service生命周期管理。客户端通过MessengerClient连接服务,实现双向通信,包含连接管理、消息发送和响应处理。关键点包括:1)服务端需设置android:exported="true";2)使用replyTo实现双向通信;3)Android 11+需在manifest声明queries。示例代码完整展示了

2025-09-30 17:35:09 640

原创 安卓自定义悬浮窗的实现

摘要:这段代码实现了一个可拖动吸附悬浮窗控件InAppEdgeMagnetView,它继承自FrameLayout,主要功能包括:1) 支持通过触摸拖动悬浮窗;2) 靠近屏幕边缘时自动吸附;3) 底部触发回弹效果;4) 状态保存与恢复功能。控件包含一个圆形ImageView作为悬浮按钮,提供设置图标、点击监听等方法。通过记录触摸位置和计算阈值实现吸附效果,并封装FloatState类来保存悬浮窗的位置、吸附状态等信息。

2025-08-27 16:31:19 281

原创 安卓接入通义千问AI的实现记录

本文介绍了如何使用Retrofit2框架实现阿里云通义千问API的网络请求。首先创建BaseNetworkApi基类封装Retrofit和OkHttpClient的通用配置,包括拦截器、超时设置等。然后实现具体的AiApi类,配置缓存、Cookie管理以及GSON转换器。通过自定义AiInterceptor添加授权Header,并定义AiService接口声明API端点及请求/响应数据结构。最后展示了如何调用API并处理响应结果,包括协程使用和异常处理。该方案提供了完整的网络请求实现流程,可扩展用于其他AP

2025-08-27 16:28:07 710

原创 安卓.jks文件查看公钥(Public Key)记录

本文介绍了使用OpenSSL和keytool工具生成安全证书的步骤:1.下载安装OpenSSL并配置环境变量;2.通过keytool命令查看jks文件别名;3.使用keytool导出指定别名的证书文件(.cer格式);4.最后用openssl命令查看证书公钥信息。整个过程涉及软件安装、环境配置和命令行操作,适合需要生成和查看证书的开发人员参考。

2025-08-21 10:43:20 417

原创 安卓view事件的分发和拦截机制

Android View事件分发机制详解:事件从Activity开始,依次经过Window、DecorView传递到ViewGroup和子View。核心方法包括dispatchTouchEvent(事件分发)、onInterceptTouchEvent(仅ViewGroup有,用于拦截)和onTouchEvent(事件处理)。ViewGroup分发时优先检查拦截,未拦截则分发给子View;子View处理则流程终止,否则由ViewGroup处理。OnTouchListener优先于onTouchEvent执行

2025-08-19 14:53:19 975

原创 安卓Fragmnet的生命周期

摘要: Android Fragment生命周期包含四个阶段:创建(onAttach到onActivityCreated)、可见(onStart到onResume)、暂停(onPause到onStop)和销毁(onDestroyView到onDetach)。关键回调方法包括视图创建的onCreateView、交互状态的onResume/onPause,以及资源释放的onDestroyView/onDestroy。建议在onDestroyView释放View资源,onDestroy处理Fragment级资源,

2025-08-12 14:09:49 296

原创 Handler导致内存泄漏的原因

Handler内存泄漏机制分析 Handler内存泄漏的核心原因是其匿名内部类隐式持有外部Activity的引用,形成引用链:静态Looper → MessageQueue → Message → Handler → Activity。当Activity销毁时,若Handler仍有未处理消息(如延迟任务),会导致Activity无法被回收。这种闭包机制使得匿名内部类自动持有外部类引用,而Message通过target字段关联Handler,MessageQueue以链表结构维护消息,最终由静态Looper长

2025-08-12 13:53:57 668

原创 安卓Handler和Looper的学习记录

Handler与Looper机制解析 Handler和Looper是Android消息处理机制的核心组件。Looper负责管理消息队列(MessageQueue),通过loop()方法循环取消息并分发给对应Handler处理。每个线程只能拥有一个Looper,主线程的Looper由系统自动创建。Handler必须绑定到特定Looper才能工作,通过sendMessage()发送消息到队列,并在handleMessage()中处理消息。子线程使用Handler需先调用Looper.prepare()创建Loo

2025-08-07 17:42:48 820

原创 原生安卓与flutter混编的实现

本文介绍了两种在原生安卓项目中集成Flutter模块的方法。方案一通过Gradle配置直接引入Flutter模块:1)创建Flutter Module项目;2)在settings.gradle中添加绑定;3)配置依赖并解决常见的仓库引用问题。方案二针对新版Flutter SDK,推荐使用AAR方式:通过flutter build aar命令生成本地Maven仓库,再在项目中引用生成的本地仓库文件。两种方案均详细说明了配置步骤,并提供了解决常见同步错误的方案,最终实现原生与Flutter页面的无缝跳转。

2025-07-31 14:35:27 803

原创 Flutter中使用retrofit和dio库实现网络请求

其中@JsonSerializable()注解和part ‘login_by_password_request.g.dart’;都是必需的,此时打开Terminal窗口,运行flutter pub run build_runner build命令,即可生成对应的.g文件,.g文件中自动完成了序列化和反序列化。其中result即为最终的返回数据,数据格式如下所示。

2025-02-20 19:08:18 1471

原创 FlutterAssetsGenerator插件的使用

点击images文件夹,鼠标右键点击Flutter:Configuring Paths,pubspec.yaml里自动生成图片依赖路径。在Plugins中找到FlutterAssetsGenerator插件,点击安装。在根目录下创建assets/images文件夹,用于存储图片。使用快捷键Alt + G 生成图片索引文件r.dart。更改生成的资源索引类可以修改名字。在需要的地方直接引用即可。

2025-02-20 19:06:20 676

原创 安卓代码自动提示功能失效记录

打开File -> Settings -> Editor -> General -> Code Completion,将Show suggestions as you type勾上即可。最近在使用体验过各类AI插件后,发现原有的代码自动提示功能失效。即原本只需打出部分字符,可以弹出所有可供选择的,如下所示。点击Ok后再次尝试,原有的代码提示就有了。其中淡灰色为AI插件提示的,下面的选择栏为studio自动提示的。

2025-02-11 13:20:58 529

原创 Flutter使用gen_l10n实现多语言支持

在MaterialApp或GetMaterialApp配置国际化支持。打开Terminal窗口,运行flutter gen-l10n命令。亦可实现一个公共方法,各个地方的调用均使用公共方法。7. 在需要使用的地方直接调用即可。运行后生成的文件目录如下。

2025-02-11 13:20:39 2521

原创 安卓使用Gitee搭建远程Maven仓

上一期讲到了Maven仓的本地实现,但实际开发过程中,使用本地仓进行合作开发是不现实的,这时,我们可以考虑使用第三方的代码管理工具去实现,例如Gitee。但是Gitee 并不是专门的 Maven 仓库管理工具,因此在使用上可能会有一些限制,并不能自动完成一个Maven仓,我们可以将本地构建的Maven项目代码上传到 Gitee 指定文件夹中,确保 pom.xml 文件正确配置了项目的基本信息和依赖即可。在项目的根目录下创建一个maven文件夹,用于存储后续生成的依赖文件。生成的文件结构如下图所示。

2025-01-21 17:39:47 1292

原创 安卓本地Maven仓的实现

在一个新的安卓应用项目project下的build.gradle文件中(新版是在settings.gradle中),引入本地maven仓。若你的Studio中没有,可能是未打开相应的开关,找到Settings中Experimenta,将如下图所示勾上即可。将生成的文件复制到一个方便的目录下,任意都可。之后点击Sync Now即可拉取对应的aar包了,在Gradle包中可以找到对应的包。在一切准备完成后,双击publish,成功后即可生成maven仓所有的所有文件。生成的文件结构如下图所示。

2025-01-21 17:39:30 916

原创 Android平台签名证书的生成

其中D:\work\new\test\TCDH_Partner.keystore表示旧文件,D:\work\new\test\TCDH_Partner.jks表示目标文件。执行后输入新口令和旧口令即可。D:\work\new\test\TCDH_Partner.keystore是证书文件路径,可修改为自己想设置的文件名称,也可以指定完整文件路径。partner是证书别名,可修改为自己想设置的字符,建议使用英文字母和数字。36500是证书的有效期,表示100年有效期,单位天。

2025-01-13 10:00:09 542

原创 Flutter中BLE蓝牙通讯的实现

之前用java写过安卓端的BLE蓝牙通讯测试的demo,最近学习了Flutter相关知识,准备以BLE蓝牙测试为例,写一个flutte的BLE蓝牙测试demo。① 创建一个HomeController来管理页面数据以及蓝牙的实际连接、通讯等。② 在ios下的Info.plist文件中添加ios设备所需权限。① 创建一个蓝牙管理类来管理连接的扫描、连接、通讯等。① 创建一个页面来展示蓝牙的连接和通讯状况。② 创建一个页面来实现蓝牙的扫描和连接。③ 在蓝牙扫描时调用权限检测。③ 统一管理蓝牙的UUID。

2025-01-13 09:59:42 3177 7

原创 Flutter中Get.snackbar和Get.dialog关闭冲突问题记录

之所以会产生冲突,是因为Get.snackbar在关闭时会会有一个动画,这个动画的默认持续时间为1s,这个动画的持续时间内,Get.snackbar并没有真正意义上的关闭,这时候我们调用Get.back()是无法关闭Get.dialog。在使用GetX框架时,同时使用了Get.snackbar提示框和Get.dialog加载框,当这两个widget同时存在时,Get.dialog加载框调用Get.back()无法正常关闭。2. 创建一个LoadingDialog去实现加载框。

2025-01-11 14:16:43 860

原创 Flutter中Get.snackbar避免重复显示的实现

【代码】Flutter中Get.snackbar避免重复显示的实现。

2025-01-11 14:16:06 662

原创 Bito登录卡死问题

感觉像是这个插件的一个bug,没有任何办法,只能重启编译器,再次登录即可,在输入账号的过程中,可以提前在其他文本中编辑好复制过来,以免遇到卡死的问题。在Bito登录过程中,可能遇到输入邮箱输到一半,就突然卡死了,无论是怎么操作编辑框都没有响应。

2024-12-26 15:52:22 399

原创 开发过程中的AI插件推荐

这两款AI插件在使用过程中都为我提供了不少的便利,也大大提高了我的工作效率,弥补了许多开发过程中的知识盲区,但相对而言,相对来说,个人感觉CodeGeex还是不太够智能。4. Bito的回答在我意料之中,而CodeGeex的回答却让我略感失望和诧异,作为一款AI工具,既然已经更正错误的回答,在下一次问答中,还是回答错误,这是我不能理解和接受的,我一开始认为是不是我提问的方式有问题,于是我换了个方式进行提问,得到的结果还是一样的,如下。3. 至此,我对两款插件都是满意的,在我更正后,能正确回答。

2024-12-26 15:43:48 3354

原创 Java中String类型长度限制

Java中String类型在编译时的长度限制是65535。例如我们通过new String创建一个长度为3的字符串,这是正常的;如果我们创建一个长度超过65535的字符串,编译器也不会提示有问题,但是一旦编译就会发生报错。Java中String类型在运行时的长度限制是2^31 - 1。如果我们需要使用到一个长度超过65535的字符串,可以将字符串拆分成数个长度不足65535的字符串,让代码能正常编译,之后再进行字符串拼接即可。

2024-12-24 09:28:16 744

原创 解决Git拉取项目过大的问题

在使用Git拉取代码时,报错fatal: fetch-pack: invalid index-pack output。4.直至出现remote: Total 0 (delta 0), reused 0 (delta 0)则可进行下一步。2.进入所拉取项目的根目录分片段进行拉取,如可以先拉取100,如果还是不行,减小数值。1.选择一个目录,在该目录下先拉取项目最后一次提交项目地址。这是由于拉取的项目过大,一次无法将项目拉取下来导致的。3.拉取成功后,依次增加。6.执行命令拉取全部分支。

2024-12-24 09:27:49 1922 1

原创 RecyclerView滑至底部,最后一个item显示不全的问题

这是由于RecyclerView的高度使用了wrap_content,而外部包裹的约束布局ConstraintLayout固定写死了300dp,当RecyclerView中所有的item高度低于RecyclerView的高度时,这时,显示是没有问题的,但是没有滑动效果;直接将RecyclerView的高度设置为固定值,如200dp,将其包裹的ConstraintLayout设置为wrap_content,此时运行就没有显示不全的问题了。

2024-12-14 15:55:24 1008

原创 MagicIndicator自定义指示器标题样式的实现

此处传入的一个自定义的xml文件simple_pager_title_layout,此xml为一个简单的图片展示,在onSelected指示器选中时,加载了选中类型的图片,在onDeselected指示器未选中时加载了未选中类型 的图片,图片资源可自行去用List存储。除此之外,getIndicator返回bull,表示此处隐藏了指示器下标的实现,如果想实现一个自定义的指示器下标,可按实现指示器标题的实现,去自定义一个指示器下标。LinePagerIndicator就是一个简单的指示器下标,本期不做讲解。

2024-12-14 15:54:40 1080

原创 Flutter中GetBuilder 和 GetX 的区别

这和原生android中LiveData使用有很大的相似性,其中update方法的作用仅仅只是通页面进行更新,并不是只更新increment方法中提到的count,若MyController 存在其他已变更的值,也会一同在页面上更新,如下例所示。当我们先点击一次Test按键时,time的值已经变更为1,但由于页面未更新,页面上time显示的值仍为0,此时我们点击Increment按钮,会发现页面上time和count同时变更为1了。当响应式变量(使用 .obs 标记)发生变化时,会自动触发 UI 的重建。

2024-12-09 16:04:13 782

原创 高德地图3D地图SDK造成ANR问题记录

2.在特定的AMAP_KEY下,在onDestroy中调用mapView.onDestroy()时,造成ANR。重新运行项目,发现图层可以正常显示了,在调用mapView.onDestroy()也不会造成ANR了。在新接手的项目中使用到了高德地图的3D的SDK,其依赖导入如下。此时,我们改变依赖导入方式,重新同步一下即可。1.在特定的AMAP_KEY下图层无法显示。

2024-12-09 16:03:08 657

原创 javafx中root的invoke方法报错Method too large问题记录

简而言之,就是无论我们使用到的类型为什么类型,该方法都会使表格该列可进行编辑,并适配对应类型,这在平时使用是没有问题的。但是如果是在view的root初始化时,tableview中创建的列数太多,且每一列都是调用的.makeEditable()方法,该view的root在调用invoke方法时就会报错Method too large。在使用javafx绘制PC桌面程序页面时,使用到了tableview,tableview可以很方便的维护一个可编辑的表,简易代码如下。

2024-10-11 16:34:09 288

原创 PriorityQueue的使用

PriorityQueue 是 Java 中基于优先级堆实现的一个队列,可以用来存储一组元素,并按照一定的优先级顺序访问这些元素,优先级高的元素会被先访问。输入: heightMap = [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3],[3,2,2,2,3],[3,3,3,3,3]]输入: heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]总的接雨水量为1+2+1=4。如果队列未满,则将指定的元素插入到队列的尾部。

2024-10-11 16:31:25 721

原创 安卓沉浸式状态栏遇到的问题

在Activuty的onCreate方法中设置如下代码。在Activuty的onCreate方法中设置如下代码。在主题属性中加入如下属性。在主题属性中加入如下属性。

2024-09-19 14:52:37 940

原创 安卓LiveData与MutableLiveData的使用

LiveData还能知晓它绑定的Activity或者Fragment的生命周期,它只会给前台活动的activity回调,这样你可以放心的在它的回调方法里直接将数据添加到View,而不用担心会不会报错。LiveData与MutableLiveData的其实在概念上是一模一样的,MutableLiveData是LiveData的子类,MutableLiveData是是整个实体类或者数据类型变化后才通知,而LiveData可以具体到某一个字段,而且可以选择哪些变更需要通知变更,哪些不需要。

2024-09-19 14:52:17 1073

原创 安卓在子线程中使用Toast

在安卓中,ui更新必须在主线执行,Toast是一种用于在屏幕上短暂显示消息的机制,它依赖主线程来进行创建和显示消息。当我们在子线程中直接调用Toast时,就会触发Can‘t create handler inside thread that has not called Looper报错。这个错误时由于Toast内部使用了Handler来处理消息队列,并在主线程中显示Toast,而在子线程中没有默认的Looper对象可供Handler使用。新建一个Handler,用于子线程中使用Toast。

2024-09-12 17:27:12 1062 1

原创 安卓BLE蓝牙通讯

正常情况下,当触发触发onConnectSuccess回调时,设备已经连上的蓝牙的GATT,此时可认为蓝牙已连接,此时中心设备是无法和外围设备通讯的,还需根据蓝牙协议绑定指定的特征UUID,一般中心设备接收数据的为NOTIFY_CHARACTERISTIC_UUID,向外围设备发送消息的为WRITE_CHARACTERISTIC_UUID,大部分外设备还有描述符,例如接收数据需要的描述符NOTIFY_DESCRIPTOR_UUID等。断开设备后,进行重新扫描,再次连接时,可接收到Notify的消息。

2024-09-12 17:23:17 2830 2

原创 安卓BLE蓝牙断开连接的两种方式

其中newState为BluetoothProfile.STATE_CONNECTED时,表示有连接蓝牙GATT成功,BluetoothProfile.STATE_DISCONNECTED表示蓝牙断开连接,也就是当调用disconnect()方法方法时,会触发BluetoothProfile.STATE_DISCONNECTED,我们可以在触发BluetoothProfile.STATE_DISCONNECTED时,选择去释放资源,如bluetoothGatt.close()。

2024-08-30 17:40:12 2212 1

openssl-3-4-2下载

openssl-3-4-2下载

2025-08-27

BLE蓝牙测试demo

包含BLE蓝牙扫描、连接、通讯、断线重连、心跳监控等。

2024-09-12

appupdatelib版本更新包

appupdatelib版本更新包: 1.支持多线程下载 2.支持是否强制升级 3.支持断点续传

2023-04-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除