- 博客(56)
- 收藏
- 关注
原创 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的OkHttp使用和原理
OkHttp的出现代替了HttpUrlConnection,被谷歌官方收纳为底层的网络框架。当网络出现问题时,OkHttp会静默重新恢复连接,因为是静默的,所以用户无感知。
2024-08-15 20:31:04 1729 1
原创 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
原创 为面试准备的一些内容
包括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
原创 使用命令删除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
原创 Android中的Context
而回到开发中的例子,比如我们在和朋友聊天时,此时的context就是聊天界面和相关数据的传输(如我们发送的消息、收到对方发送的消息),他在加载资源、启动Activity、获取系统服务、创建View等中都有一腿,不愧为上下文的称号。为什么说只是不适用于组件的开发?在Android开发中,当我们要创建或启动四大组件时,不能通过简单的new关键字实现,而是要通过他们的上下文环境,也就是我们要讨论的Context。Android的应用模型是基于组件的应用设计模式,而组件的运行需要一个完整的Android工程环境,
2024-04-15 19:45:40 415
原创 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
原创 Android的Compose
如果需要将一个函数转换为Composable function,我们需要添加注解“@Composable”。) {MessageCard("Android")//使用我们自定义的Composable function@Composable//添加注解,使该函数成为Composable function")
2024-02-19 15:53:20 6117 1
原创 Android中的MVVM
开发常用的框架包括MVC、MVP和本文的MVVM,三种框架都是为了分离ui界面和处理逻辑而出现的。mvp、mvvm都由mvc演化而来,他们不属于某种语言的框架,当存在ui页面和逻辑代码时,我们就可以使用这三种模式。model和view分别指的是和,前者用于存储数据,后者用于展示前者的数据。在不同的框架模型中,model和view可能会有所差别,但基础功能基本不变,差别在于数据的传输方式。
2024-02-07 17:44:13 1080
原创 Handler
我们知道,android是不允许在子线程中更新ui的,但是为了避免anr,我们有时候不得不在子线程中去执行一些耗时操作,然后根据这些耗时操作的执行结果来更新ui界面。对于这种情况,android提供了一套异步消息处理机制。
2024-01-05 11:06:39 565
原创 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关注的人