自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 收藏
  • 关注

原创 依赖注入:从手动注入到dagger自动化

使用依赖注入的目的是为了分离关注点,即去耦合。

2025-01-15 18:18:55 645

原创 kotlin的dagger hilt依赖注入

dagger hilt帮助我们以简单的方式注入了依赖,省去了构造函数注入的操作(如大量的声明传参的依赖),因此我们能更为集中地管理依赖。更为重要的一点是,我们可以更便捷的控制依赖的寿命。以单例为例,在一个完整的项目中,例如数据库的单例只能存在一个,但是我们不会只有一个单例;同时我们可以确定特定依赖项的范围,比如限定某个依赖只能依附于某个activity,这样当activity被销毁时,该依赖的内存也会被清理,进而用于其他地方。

2025-01-13 17:46:38 1208 1

原创 compose的闪烁边框动画

此处我是使用了androidx.tv.material3库下的Card可组合函数,增加光晕的方式是修改了Card可组合函数的传参glow。Card可组合函数的源码如下。在为Android TV的Launcher添加卡片移动功能时,增加了个边框循环闪烁的动画,类似呼吸灯的效果。在此处我使用了size来变更光晕的大小,并无限循环size变量的大小变更。默认的情况下,三种状态都不显示光晕,即Glow.None。而为了实现循环动画的效果,我们需要开启一个无限循环的动画。为了实现呼吸的效果,需要修改光晕的大小;

2024-09-26 15:09:30 248

原创 在Application中全局获取context

首先自定义一个application,继承Application,并在AndroidManifest.xml文件中配置它。

2024-09-10 15:17:01 215

原创 Compose中对于KeyEvent的处理

在开发Android TV时,遇到了一个需求,需要对遥控器发出的上下左右按键点击事件做处理。此处我们可以在Modifier.onKeyEvent中对按键事件做处理。两个值做了过滤,前者包括KeyDown和KeyUp以及Unknown三个状态,分别代表按下按键、抬起按键以及未知的按键事件;在这个模板中我对按钮接收到上下按键不做处理,而这是通过返回true值实现的。此处我返回true可以使得焦点无法向上或向下传递,相应的,返回false将不会阻碍焦点传递。后续可以引用这个模板,并对其进行更进一步的定制。

2024-09-06 12:01:54 346

原创 利用libs.versions.toml配置gradle

该文件存储在项目级别的gradle -> libs.versions.toml路径下。在一个toml文件中包含三个级别:version、libraries和plugins。分别用于存储依赖库的版本号、名称以及插件名称。在新建项目时,我发现了一种较为简洁的gradle依赖配置方式——libs.version.toml。

2024-09-05 16:06:27 678

原创 Android TV的行添加和行中数据项添加

Presenter的作用是将View添加到Row中,类似RecyclerView的Adater。之后使用我们自定义的Presenter,用于手动添加单个view到Row中。首先需要为行(Row)创建自定义的Presenter。

2024-09-02 11:31:09 410

原创 Android的gradle镜像加速配置

在创建新项目时,往往需要联网下载gradle的文件,相当耗时。为此我们可以配置镜像,加速这一过程。

2024-08-29 16:40:20 592

原创 Android的OkHttp使用和原理

OkHttp的出现代替了HttpUrlConnection,被谷歌官方收纳为底层的网络框架。当网络出现问题时,OkHttp会静默重新恢复连接,因为是静默的,所以用户无感知。

2024-08-15 20:31:04 1729 1

原创 RecyclerView的缓存机制(面试常客)

在构建滚动列表时,我们常首选RecyclerView,出于它优秀的缓存复用机制。

2024-08-14 21:11:10 1736

原创 Android中的Binder

binder是Android平台的一种跨进程通信(IPC)机制,从应用层角度来说,binder是客户端和服务端进行通信的媒介。

2024-08-08 11:05:33 1896

原创 JVM虚拟机

jdk的体系结构示意图如下:可见最下层的jvm是jre(java runtime environment,运行时环境)的组成部分之一。当我们编写一段代码并运行时,会执行以下步骤:以helloworld.java(源代码)为例,我们编写的代码会首先被javac(java编译器)编译为java.class(java字节码)文件,接下来这个class文件就会被扔到jvm中去执行。java代码拥有跨平台的特性,即我们编写的java文件可以在各大操作系统中运行,而这个特性是依赖jvm实现的。

2024-08-06 15:53:48 1037

原创 RecyclerView的Adapter模版

【代码】RecyclerView的Adapter模版。

2024-08-05 10:58:46 245

原创 为面试准备的一些内容

包括3个主要阶段:measure(测量)、layout(布局)和draw(绘制)。这些都是在View分层树(View和ViewGroup形成的树形结构)中逐层调用的。1)measure测量是为了确定每个View的宽高。ViewGroup会调用子视图的measure方法。

2024-08-02 17:11:21 857

原创 解耦一瞥:工厂模式

工厂模式,用于封装和管理类的创建,最终的目的是为了解耦,实现创建者和调用者的分离。该模式属于创建型模式,提供了创建对象的最佳方法,它本质是对获取对象过程的抽象。

2024-07-26 15:24:41 427

原创 运算逻辑符的短路特性

此处使用了“||”的或操作符。只要getPassword == null成立,isEmpty方法就不会被调用,也就不会返回空指针异常。isEmpty的字符串判空出现了空指针的问题,这是因为getPassword方法返回了一个null对象。通过利用短路特性,我们可以更加高效地进行条件判断,避免不必要的计算,同时避免空指针异常等问题的发生。使用这种写法时,即使 getPassword方法返回了null,也不会影响代码的执行。当我们使用逻辑与(&&)、逻辑或(||)操作符进行计算时,会出现短路特性。

2024-06-27 14:45:36 305

原创 Android使用data uri启动activity或service

在AndroidManifest.xml文件中,我们可以设定activity或service的data。在完成对activity或service的配置之后,我们可以通过adb shell命令启动他们。

2024-06-18 14:19:21 518 1

原创 Android动态设置淡入淡出动画

我们不应该像淡出动画那样,在动画结束时才设置可见度,因为组件不可见时,附加在它之上的动画自然也不可见了。此时不会是一个组件淡出,而是在动画时长结束后直接显示出该组件。对于一个组件,当我们要用一个淡出动画隐藏它时,需要设置的值包括透明度alpha和可见度visibility。但对于淡入动画,如果在设置淡入之前,已经使该组件淡出,我们首先要回调刚才设置的visibility为可见的VISIBILE,如此一来,才能使我们的淡入可见。设置淡出动画不是问题,难点在于淡入动画。

2024-05-21 17:32:39 636

原创 Android实现左右滑动手势退出

有时在外部会设置侧滑手势发送KeyEvent.KEYCODE_BACK键值,此时可以处理这一事件。

2024-05-21 17:20:05 459

原创 使用命令删除zip中的文件

为实际的文件名和路径,使用正确的路径分隔符。如果文件夹名或任何路径组成部分包含空格或其他特殊字符,请使用引号。在Windows系统上,可能要安装额外的压缩工具如7-zip,才能在命令行中执行这类操作。执行这些命令时,它们会更新原始的 ZIP 文件,并从中移除指定的文件夹和包含的内容。始终建议在执行这类操作前备份原始的 ZIP 文件,以防不测。要删除zip文件中的某个文件,可以使用zip工具的-d(delete)选项。请注意,在 Windows 系统的命令行中,通常使用后斜杠(在上述命令中,确保替换。

2024-04-30 10:15:13 1374 1

原创 Java创建对象的最佳方式:单例模式(Singleton)

单例模式是java中最简单的设计模式之一,属于创建式模式,提供了一种创建对象的最佳方式。具体而言,单例模式涉及到一个具体的类,这个类可以确保只有单个对象被创建。它包含一个访问其唯一对象的方法,供外部直接调用,而不需要创建这个类的示例。简而言之,可以不再new一个他的实例,而是直接调用方法。

2024-04-24 11:26:28 2237 1

原创 adb、git常见指令

【代码】adb常见指令。

2024-04-22 17:24:45 180

原创 Android中的Context

而回到开发中的例子,比如我们在和朋友聊天时,此时的context就是聊天界面和相关数据的传输(如我们发送的消息、收到对方发送的消息),他在加载资源、启动Activity、获取系统服务、创建View等中都有一腿,不愧为上下文的称号。为什么说只是不适用于组件的开发?在Android开发中,当我们要创建或启动四大组件时,不能通过简单的new关键字实现,而是要通过他们的上下文环境,也就是我们要讨论的Context。Android的应用模型是基于组件的应用设计模式,而组件的运行需要一个完整的Android工程环境,

2024-04-15 19:45:40 415

原创 Android获取系统壁纸

【代码】Android获取系统壁纸。

2024-04-15 16:48:41 567 1

原创 Thread和Runnable

两者都创建线程的方式,不同之处在于前者是类,后者是接口。使用的时候重写他们即可。

2024-04-11 17:49:01 257

原创 使用Compose需要对build.gradle.kts的修改

【代码】使用Compose需要对build.gradle.kts的修改。

2024-03-18 16:35:15 170

原创 Android的LiveData

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保。若观察者(Observer)的生命周期处于或状态,则LiveData会认为该Observer处于活跃状态。LiveData只会将更新通知给活跃的Observer。您可以注册与实现接口的对象配对的观察者。有了这种关系,当相应的对象的状态变为时,便可移除此观察者。

2024-02-22 15:19:03 1993

原创 Android的ViewModel

ViewModel组件用于存储和公开界面所使用的状态(UI State)。界面状态(UI State)是经过ViewModel转换的应用数据。界面(UI)是相对于用户而言的,界面状态是相对于应用而言的,例如一个开关switch展现在用户面前,而switch是开还是关,就是switch的界面状态。因此,对于界面状态的任何改变,都会直接影响界面。ViewModel会存储应用相关的数据,这些数据不会在activity被销毁并重新创建时被销毁。

2024-02-21 17:04:55 1960

原创 Compose的gradle配置以及与Kotlin的兼容对应

要开始使用Compose,需要先向项目中添加一些 build 配置。

2024-02-20 09:57:55 1139

原创 Android的Compose

如果需要将一个函数转换为Composable function,我们需要添加注解“@Composable”。) {MessageCard("Android")//使用我们自定义的Composable function@Composable//添加注解,使该函数成为Composable function")

2024-02-19 15:53:20 6117 1

原创 Android的视图绑定

视图绑定(ViewBinding)在开发中起到的作用是。

2024-02-08 18:08:54 1313

原创 Android中的MVVM

开发常用的框架包括MVC、MVP和本文的MVVM,三种框架都是为了分离ui界面和处理逻辑而出现的。mvp、mvvm都由mvc演化而来,他们不属于某种语言的框架,当存在ui页面和逻辑代码时,我们就可以使用这三种模式。model和view分别指的是和,前者用于存储数据,后者用于展示前者的数据。在不同的框架模型中,model和view可能会有所差别,但基础功能基本不变,差别在于数据的传输方式。

2024-02-07 17:44:13 1080

原创 Android自定义按钮的实例xml

【代码】Android自定义按钮的实例xml。

2024-02-06 11:03:45 297

原创 ASOP的电池设置

中文直译为“油量表”。在Android中,通常是与电池电量相关的模块,主要是负责显示设备的电池状态信息。

2024-01-19 17:03:18 582

原创 Handler

我们知道,android是不允许在子线程中更新ui的,但是为了避免anr,我们有时候不得不在子线程中去执行一些耗时操作,然后根据这些耗时操作的执行结果来更新ui界面。对于这种情况,android提供了一套异步消息处理机制。

2024-01-05 11:06:39 565

原创 Android面试被问过的问题

组合控件继承空间自绘控件。

2023-12-11 00:29:11 888

原创 kotlin的retrofit

与okhttp不同的是,okhttp侧重的是底层通信的实现,而retrofit侧重的是上层接口的封装。

2023-12-05 20:58:45 634

原创 kotlin的多线程编程

如何启动这个线程?我们创建的myThread是MyThread实例,它是一个实现了Runnable接口的对象,所以我们可以直接把他传入Thread的构造函数中。接着我们再调用Thread的start方法,run方法中的内容就开始在子线程中运行了。

2023-11-30 20:42:36 1547

原创 kotlin中的序列化

我们可以在Intent中通过putExtra方法来添加要传递的数据,但该方法所支持的数据类型是有限的,当我们想传递一些自定义对象的时候,会发现无从下手。而使用Intent来传递对象,通常有两种实现方式:Serializable和Parcelable。

2023-11-29 21:39:13 1042 1

原创 kotlin中的service

虽然Service是在Activity里启动的,但是在启动了Service之后,Activity与Service基本就没有什么关系了。比如说,目前我们希望在MyService里提供一个下载功能,然后在Activity中可以决定何时开始下载,以及随时查看下载进度。新增了两个分别用于绑定和取消service的按钮,而与service绑定的,自然是activity,绑定之后就可以使用Binder中的方法了。修改完成之后,我们看看要如何在activity中调用service中的这些方法。

2023-11-28 14:52:41 606

空空如也

空空如也

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

TA关注的人

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