Android
文章平均质量分 56
小刚写代码
我亦无他,唯手熟尔
展开
-
Android 工程师需要了解的 Lint 知识入门篇
前言项目开发过程中,通过对代码规范的约束对于代码质量的提升是非常重要的。这其中除了人为的代码审查之外,我们还可以使用 lint 工具来定位并修改一些有问题的代码,帮助提高我们的代码规范程度。今天我们就一起来学学 lint 的使用。自动提示Android Studio 内置了很多常用的 lint 规则,我们在平时中都能使用到。比如我们直接调用一些可能引发空指针的方法,就会出现如下图中的提示。我们平时开发过程中需要关注到这些提示并进行对应的修改。手动调用除了自动提示,我们还可以在 Android S原创 2021-12-13 23:29:25 · 1633 阅读 · 0 评论 -
谷歌官方推荐的安卓数据库框架 Room 使用详解(二)
在第一篇中我们介绍了基本的使用,包括表的定义、DAO 的定义和使用、简单查询和添加的操作。接着这一篇我们继续看room 在使用过程中的更多操作方法。常用的操作数据方法插入上一节中我们的user 中定义有uid 作为主键,在项目中,这个uid 是后台出参,对于每一个用户都是相同的,这时候如果我们直接插入数据这条数据就会报错,因为主键相同。我们可以试一下。android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed原创 2021-11-22 23:44:44 · 2311 阅读 · 0 评论 -
甲方四个字,让我看了一圈 Android PMS 源码
背景这几天有一个拍照的需求,只需要简单的调用相机拍照就可以,直接通过intent 就可以完成。但是如果手机安装了多个相机时,会弹窗提示用户选择使用哪个相机,对于这一点,甲方说了四个字用系统的好吧,那就干吧。通过搜索,了解到可以添加包名来限制响应我们intent,那我们只要获取系统相机的包名就可以了。接下来我们看下整个流程。调用相机拍照这里我们可以构建intent ,新建一个临时文件,通过uri 的形式提供出去,等系统相机拍照完成后就会将图片保存到我们提供的uri 中,接着我们就可以直接使用了原创 2021-11-17 09:44:13 · 450 阅读 · 0 评论 -
谷歌官方推荐的安卓数据库框架 Room 使用详解(一)
Room 框架是 Android 官方推出一款数据库操作框架,里面封装了对于 Sqlite 的操作,可以快速、便捷的完成相关操作。今天我们就来了解并学习下这块库的使用和原理。上手使用添加依赖我们首先添加依赖,我这里用的版本是2.3.0 ,然后在项目的build.gradle 文件内添加依赖,如果没有配置kapt 处理器还需要添加kotlin-kapt 插件。添加完成后同步即可。plugins{ //... id 'kotlin-kapt'} dependencies{原创 2021-11-16 14:19:29 · 2723 阅读 · 0 评论 -
LiveData 源码解析
简单介绍LiveData 是一个基于观察者模式的组件,在 Android JetPack 组件中的一部分,在开发中非常实用。LiveData 就是一个数据持有类,可以分发数据,由于内部封装了生命周期回调,所以只会在适当的生命周期中回调数据,而不会在监听者销毁后回调而导致异常。下面我们就用一个简单的例子来分析一下 LiveData 的源码吧。相同页面传值我们首先在onCreate方法中进行监听,通过点击按钮改变数据,可以看到,每次改变数据后我们的回调都会打印。LiveDataTest.getLive原创 2021-08-31 22:47:21 · 140 阅读 · 0 评论 -
学点什么之 startActivityForResult 的新用法
简单介绍startActivityForResult 是用来启动另一个 activity 后接收回调的,这个方法在 activity 和 fragment 里面都可以调用。使用后在调用者的 onActivityResult 里面进行返回参数的处理即可。这样不可避免导致了调用逻辑和处理逻辑的分离,为我们代码的可阅读性增加了几分难度。Android 官方应该也是注意到了这个问题,在 AndroidX 中为我们提供了 Activity Result API 功能,封装了 startActivityForRes原创 2021-08-25 23:28:12 · 603 阅读 · 0 评论 -
Android 开发中实体类命名总结
Entity数据表对应到实体类的映射,包括 room 数据库等数据。Model展示在 view 层的数据,展示在页面的数据,包括 viewmodel 里面使用的。DTO数据传输对象 Data Transfer Object用于系统建数据传输的对象,数据传输目标往往是数据访问对象从数据库中检索数据。网络请求的数据等,包括出入参等信息。Bean对于 Bean 而言,只要是 Java 的类就可以称为一个 Bean它不仅仅可以包括对象的属性以及 get set 方法,还可以有具体的业务逻辑。其原创 2021-08-04 10:21:32 · 468 阅读 · 0 评论 -
快速入门 Kotlin 的扩展函数
fun User.validateBeforeSave() { fun validate(value: String, fieldName: String) { if (value.isEmpty()) { throw IllegalArgumentException("Can't save user ${id}:empty $fieldName") } } validate(name, "Name") validate原创 2021-05-23 11:21:15 · 223 阅读 · 0 评论 -
谷歌官方新推出的 RecyclerView ConcatAdapter 使用教程
本文同步发表于我的微信公众号,在微信搜索 不要注水 即可关注。谷歌官方新推出的 RecyclerView ConcatAdapter 使用教程ConcatAdapter 可以连接多个不同的 Adapter 并做展示,但是不支持不同的数据源混合展示。首先我们新建两个 Adapter// TextAdapterclass TextAdapter : RecyclerView.Adapter<TextAdapter.TextViewHolder>() { val textLis.原创 2021-05-21 12:06:22 · 656 阅读 · 0 评论 -
自定义 View 添加动画效果
自定义 View 添加动画效果今天看教程的时候看到了自定义 View 添加动画效果的方法,通过属性动画获取值,然后设置到自定义 View 中即可。部分代码如下: // 属性动画 ValueAnimator valueAnimator = ObjectAnimator.ofFloat(0, 3000); valueAnimator.setDuration(1000); valueAnimator.setInterpolator(new Dec原创 2021-05-21 09:32:00 · 454 阅读 · 0 评论 -
不是大牛,也能分析 ButterKnife 源码流程
ButterKnife 是一个可以自动完成页面 findViewById 的工具,来自大名鼎鼎的 JakeWharton 之手。当然现在(2021.4.14)已经停止更新了,贴一下 github 上的说明:Attention: This tool is now deprecated. Please switch to view binding. Existing versions will continue to work, obviously, but only critical bug fixes原创 2021-04-14 19:38:00 · 75 阅读 · 0 评论 -
不是大牛,也能分析 AsyncTask 源码流程
这几天在看一些教程,说到了源码分析的方法,其中之一就是不要纠结于每一行代码到底代表什么,而是要先搞清楚主要流程并学习里面的设计思想。并带着分析了一下 AsyncTask 的源码。分析之后确实感觉受益匪浅,虽然里面一些线程的知识并不了解,但是对整体设计和流程有了一个新的认识。所以为了分享下学到的东西,就记录一边,希望大家也能有所收获。注意 AsyncTask 在 SDK30 及以上已经被弃用,在开发中并不推荐使用了。首先,新建一个 AsyncTask 后,实现具体的方法,调用 execute() 方法原创 2021-04-06 18:39:37 · 79 阅读 · 0 评论 -
android 监听 app 启动和退出
最近有一个需求是需要在程序每次启动的时候检测一下更新,然后做出一些提示。开始是想到在 BaseActivity 里面处理,后来搜了一些资料后发现可以使用 lifecycle 实现。话不多说上代码,首先在 application 里面添加监听方法。class BaseApplication : Application() { private val checkObserver = CheckObserver() override fun onCreate() { s原创 2020-10-30 18:00:36 · 9040 阅读 · 2 评论 -
删除 ButterKnife 绑定过的View时候,运行报错
直接删除所有的会报错,先删除 @BindView 语句,保留ButterKnife.bind(this);然后重新编辑就可以了原创 2020-04-17 09:50:59 · 296 阅读 · 0 评论 -
错误 More than one file was found with OS independent path 'META-INF/atomicfu.kotlin_module'
在项目中添加了,kotlin coroutines 后编译错误 // Coroutines api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$rootProject.coroutines" api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.corou...原创 2019-07-28 11:59:35 · 910 阅读 · 0 评论 -
RecyclerView 有数据但是显示空白
转自 http://cgsdream.org/record_item?id=5b8e50b8fa11b81846a8f8da在开发过程中,我们很容易遇到一个现象:界面上 ViewPager 或者 RecyclerView 或者 ListView 显示空白,但是有数据,用 Layout Inspector 查看时,显示正常。 有时候滚动就能恢复正常。那这是什么原因呢?一个可能的因素就是多个 R...转载 2019-02-04 15:37:43 · 6880 阅读 · 3 评论 -
通过代码设置 TextView Drawable
Drawable drawable= getResources().getDrawable(R.drawable.drawable); drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); myTextview.setCompoundDrawables(drawable,null...原创 2019-02-04 15:50:54 · 1237 阅读 · 0 评论 -
Android Activity 学习总结第一篇
开篇语说到 Activity 首先提到的就是生命周期、启动模式、异常情况下的生命周期,这些都是比较基础而且重要的知识,需要熟练掌握。当然也是面试经常遇到的问题。接着就是整个 Activity 的启动流程了,包括启动层面的第一次进入 app 或者当初的启动一个 Activity 中的启动流程了,这都需要结合源码分析并学习。这个准备在第二篇开始学习。今天就来总结下基础部分的知识点。Activity...原创 2019-03-21 22:03:30 · 306 阅读 · 0 评论 -
Fragment 基础知识记录
目录前言Fragment 的加载方式静态加载动态加载通过 FragmentAdapter 加载Fragment 的生命周期Activity 和 Fragment 对应生命周期启动时的生命周期黑屏后的生命周期亮屏后的生命周期销毁时的生命周期总结前言Fragment 在开发中一直很常用,但是忏愧的是在我的开发中到现在还没怎么大量使用。导致的结果就是在面试时候一些基础知识都忘记了。今天就将这些基础知...原创 2019-03-22 14:39:20 · 156 阅读 · 0 评论 -
Android 系统的布局
文章目录前言LinearLayout 线性布局RelativeLayout 相对布局ConstraintLayout 约束布局FrameLayout 帧布局总结前言在开发过程中,第一个接触的就是布局了,最熟悉的布局文件就是 activity_main.xml 了。今天就来看看布局文件中常见的几大布局。早期官方给我们提供的布局包括:LinearLayout、FrameLayout、Absolu...原创 2019-03-26 10:39:24 · 157 阅读 · 0 评论 -
Android 开发中异步回调改成同步回调
前言在 Android 开发中,遇到的很多回调情况都是异步回调,比如访问网络、访问本地文件或数据库等等,在子线程中进行这些操作,然后等结果返回后,再来到主线程进行 UI 更新等动作。这也是习以为常的事情了,那么如何将这种异步回调改成同步式的回调呢,今天就来说说我所了解到的方法。基本介绍首先我们定义一个异步回调public class MyEvent { public void t...原创 2019-04-04 10:21:42 · 7476 阅读 · 3 评论 -
LayoutAnimation 实现 RecyclerView 入场动画
文章目录介绍LayoutAnimation 的具体使用1,定义 RecyclerView2,使用 LayoutAnimation 动画定义动画文件定义 LayoutAnimation使用 LayoutAnimation代码设置xml 文件形式更新数据时使用动画附从右侧滑入动画从底部进入动画参考介绍最近在学习动画相关的内容,在动画应用方面的一个常用的地方就是 RecyclerView 的入场动画...原创 2019-04-01 14:04:04 · 2343 阅读 · 1 评论 -
Android 中两种单例的写法
个人常用的有 DCL 和静态内部类实现的单例。分别记录一下。DCLpublic class DataHelper { private static volatile DataHelper instance; private DataHelper() { } public static DataHelper getDefault() { if (instan...原创 2019-04-08 10:08:47 · 210 阅读 · 0 评论 -
MVP 模式中解决 NPE 问题
网上搜集到三篇文章https://www.jianshu.com/p/a46d22fe9928https://medium.com/@trionkidnapper/android-mvp-an-end-to-if-view-null-42bb6262a5d1https://blog.csdn.net/qq137722697/article/details/78275882前两篇是用动态代...原创 2019-06-05 15:13:39 · 172 阅读 · 0 评论 -
Android 点击两次退出最佳实践
@Override public void onBackPressed() { long currentTime = System.currentTimeMillis(); if (currentTime - lastTimeMillis <= 3000) { super.onBackPressed(); ...原创 2019-06-19 15:32:07 · 215 阅读 · 0 评论 -
Android 开发常用的 adb 命令
查看系统 arm 版本adb shell getprop ro.product.cpu.abi卸载软件adb uninstall package name原创 2019-07-16 10:37:11 · 108 阅读 · 0 评论 -
Kotlin 和 Retrofit
如果在使用 Retrofit 中使用 Kotlin 定义接收数据的实体类,那么这些实体类的字段建议设置为可空类型。如果设置为不可空类型,如果后台返回的时候是空字段,那么 Retrofit 生成的这些实体类的字段也会是空的,虽然声明为可空了。...原创 2019-07-18 15:22:34 · 217 阅读 · 0 评论 -
View margin/marginTop 注意点
在 View 中调整布局的时候,如果同时设置了android:layout_margin="10dp"android:layout_marginTop="30dp"那么只有 android:layout_margin="10dp" 会生效,并不会叠加android:padding="10dp"android:paddingTop=&quo原创 2019-02-02 21:22:12 · 1567 阅读 · 0 评论