
Android 项目开发笔记
在做 Android 开发过程中遇到的一些问题,记录下来
梁同学与Android
Android 领域优质创作者,专注于安卓原生开发,专注于 Scratch、Python、Scratch、C、C++ 青少年编程等级考试等。等级考试真题请见链接库:https://download.youkuaiyun.com/download/qq_43290288/88548582
展开
-
Android --- adb shell setprop 是设置系统属性的adb shell settings put 也是设置系统属性的,有什么区别,在项目中体现。
Android --- adb shell setprop 是设置系统属性的adb shell settings put 也是设置系统属性的,有什么区别,在项目中体现。原创 2025-06-03 11:02:21 · 461 阅读 · 0 评论 -
Android --- ObjectAnimator 和 TranslateAnimation有什么区别
ObjectAnimator和TranslateAnimation是Android两大动画类型。ObjectAnimator属于属性动画,支持修改任意对象属性(如位置、透明度、旋转等),动画效果持久且功能强大,适合复杂动画场景。TranslateAnimation属于视图动画,仅处理简单平移动画,不改变视图实际属性,动画结束后默认恢复原状,性能更高效但功能有限。ObjectAnimator适合多属性复杂动画,而TranslateAnimation仅推荐用于简单平移动画需求。两者主要区别在于功能范围、动画持久原创 2025-05-28 15:02:06 · 484 阅读 · 0 评论 -
Android --- CopyOnWriteArrayList 的使用场景及讲解
读操作不加锁:由于每次写操作都会创建一个新的数组,读操作可以在不加锁的情况下进行,因此对于读多写少的应用场景,CopyOnWriteArrayList 比其他线程安全集合(如 Vector 或 synchronizedList)效率更高。这意味着,所有的写操作都是不可变的,不会影响到正在执行的读操作,从而避免了线程竞争的问题。适用于读多写少的场景:由于写操作会复制数组,这会带来一定的性能开销,因此它非常适合读多写少的场景。需要线程安全的列表:在多线程环境下,使用它可以确保线程安全而不需要显式的同步。原创 2025-05-22 16:10:28 · 549 阅读 · 0 评论 -
Android --- View如何实现跟随手指滑动,scrollTo和scrollBy的区别
该代码片段展示了在Android开发中如何处理触摸事件以实现视图的滚动功能。通过重写onTouchEvent方法,代码捕捉了手指按下、移动和抬起的事件。在手指移动时,计算手指的位移(dx),并通过scrollBy(-dx, 0)实现视图的水平滚动,负号确保视图滚动方向与手指滑动方向相反,符合用户直觉。此外,代码还使用了Scroller类来实现平滑滚动效果,通过computeScroll方法持续更新视图位置,直到滚动结束。scrollTo和scrollBy的区别在于前者是绝对滚动到指定位置,后者是相对当前视图原创 2025-05-22 09:23:06 · 707 阅读 · 0 评论 -
Android --- FrameWork 入门:Product是什么?
源码路径:build/target/product/AndroidProducts.mkCOMMON_LUNCH_CHOICES就是lunch的列表实际lunch有好几十个,但上面只有4个选项啊?其实是在其他路径下还有这个配置文件,比如device/generic/x86_64/AndroidProducts.mk 也有配置,所以最终lunch列表就有很多。原创 2025-04-16 17:48:22 · 236 阅读 · 0 评论 -
Android --- SystemUI启动流程
一.SystemServer中的启动代码路径:frameworks/base/services/java/com/android/server/SystemServer.java二.SystemUI中的启动1.应用的启动肯定是初始化Application类代码路径:/code/app/src/com/android/systemui/SystemUIApplication.java主要为了注册开机广播,来获取开机完成的事件,用来作为启动各个服务的条件.2.SystemUIService的原创 2025-04-16 13:58:37 · 384 阅读 · 0 评论 -
Android --- FrameWork 入门:极速上手AOSP
2.VMware Workstation 下载。存储空间不低于500G,建议 1TB SSD。CPU不低于6核心,建议8核及以上。内存不低于32G,建议64G。2.修改repo自动更新镜像。3.初始化仓库并同步远程代码。网址如果失效可以联系我。这里最好不要小于20G。1.下载 repo工具。点击红框内的进行下载。原创 2025-04-16 16:50:21 · 398 阅读 · 0 评论 -
Android --- MediaSession的理解
https://developer.android.google.cn/media/legacy?hl=zh-cn原创 2024-12-27 16:48:27 · 149 阅读 · 0 评论 -
Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
因为 ArrayList 不能自动移除无效的回调对象,因此服务 E 可能会试图与已经失效的进程通信,导致阻塞。如果你使用 ArrayList 存储跨进程的回调对象,当某个进程发生 binder dead(即进程崩溃或连接断开)时,ArrayList 无法自动移除失效的回调,这可能导致内存泄漏或者后续的通信失败。在进程间通信时,如果使用 ArrayList 存储 AIDL 回调对象,可能会导致一个进程崩溃后,ArrayList 中的其他元素(即其他连接到服务的客户端)也会受到影响,从而阻塞正常的通信。原创 2024-12-27 10:26:48 · 1468 阅读 · 0 评论 -
Android --- SparseArray替代HashMap来提高性能
总体而言,在Android这种内存比CPU更金贵的系统中,能经济地使用内存还是上策,何况SparseArray在其他方面的表现也不算差(另外,SparseArray删除数据的时候也做了优化——使用了延迟整理数组的方法,可参考官方文档SparseArray,读者可以自行把代码9中的hash.get和sparse.get改成hash.remove和sparse.delete试试,你会发现二者的性能相差无几)。通过结果我们看出,在正序插入数据时候,SparseArray比HashMap要快一些;转载 2024-12-27 10:07:40 · 148 阅读 · 0 评论 -
Android --- Kotlin,Fragment 怎么使用 ObserveForever 监听 Livedata
在 Kotlin 中,observeForever() 是 LiveData 提供的一个方法,它用于永久地观察 LiveData 对象的数据变化,不依赖于生命周期的管理。当我们使用 observeForever() 时,必须确保在不再需要时手动移除观察者,特别是在 Fragment 或 Activity 销毁时。需要注意的是,observeForever() 不会自动解除绑定(如在生命周期结束时自动移除观察者),因此必须手动移除观察者,以避免内存泄漏或不必要的资源消耗。原创 2024-11-27 11:46:06 · 862 阅读 · 0 评论 -
Android --- Textview 如果超过20长度显示省略号失效!
但是如果你加了:layout_weight就会失效,如下。原创 2024-10-23 15:20:18 · 207 阅读 · 0 评论 -
Android --- android所有版本,以及API级别,不断更新
原创 2024-09-24 08:46:51 · 281 阅读 · 0 评论 -
Android --- complieonly 和implement的区别
implementation:与compileOnly不同,implementation依赖的库不仅参与编译,还参与打包。这意味着,当项目依赖了一个implementation的库时,这个库不仅在编译时可用,而且在运行时也是必须的。这意味着,如果一个项目依赖了某个compileOnly的库,那么在编译时这个库是必须的,以确保代码能够成功编译。然而,在打包时,这个库不会被包含在内,因此,如果其他模块或工程没有显式地添加这个库作为依赖,那么在运行时就会出现问题,因为运行时找不到这个库。原创 2024-09-10 13:47:59 · 1556 阅读 · 0 评论 -
Android --- observer和observerForever的区别
也就是说,当 LifecycleOwner 不再处于活跃状态时(例如,Activity 被销毁),观察者会自动停止接收更新。使用 observeForever 时,观察者没有生命周期管理,需要手动处理添加和移除,适用于需要在所有情况下都接收更新的场景。用途: 注册一个观察者,不依赖于 LifecycleOwner,无论组件的生命周期状态如何,观察者都会持续接收数据变化。使用 observe 时,观察者与 LifecycleOwner 绑定,适用于需要自动管理生命周期的场景。原创 2024-09-03 15:04:52 · 1243 阅读 · 0 评论 -
Android --- 都有哪些情况会发生anr,怎么解决?
如果应用声明的服务无法在规定时间内完成Service.onCreate()和Service.onStartCommand()/Service.onBind()执行,或者Context.startForegroundService()在前台启动新服务但该服务在5秒内未调用startForeground(),则会发生ANR。Android发生ANR的情况主要包括输入调度超时、广播超时、服务超时等,解决ANR问题的方法包括避免在主线程进行耗时操作、导出ANR日志信息、分析系统资源信息、查看主线程状态等。原创 2024-09-02 15:49:24 · 855 阅读 · 0 评论 -
Android --- 解决LiveData数据倒灌的新思路
每次 setValue 的时候,就打开所有 Observer 的开关,表示可以接受分发。这种方式的优点是:改动小,不需要反射,也不需要用HashMap存储等,缺点是:有一定的侵入性,假如后面这个方法的访问权限修改或者包名变动,就无效了,但是我认为这种可能性是比较小,毕竟androidx库迭代了这么多版本,算是比较稳定了。updateData方法发送了一次数据,当下面调用LiveData的observe方法时,会立即打印==============第一次发送数据,这就是上面说的“数据倒灌”现象。转载 2024-09-02 12:43:21 · 477 阅读 · 0 评论 -
Android --- Fragment 提交的方法主要有以下几种
【代码】Android --- Fragment 提交的方法主要有以下几种。原创 2024-08-28 17:10:33 · 320 阅读 · 0 评论 -
Android --- livedata是粘性事件,什么叫粘性事件
在LiveData中,粘性事件的具体表现是,如果一个Activity(例如FirstActivity)发送了数据,然后用户导航到另一个Activity(例如SecondActivity),在SecondActivity中监听LiveData的变化,即使是在FirstActivity发送数据之后才注册监听LiveData的事件,也能收到之前的发射数据。这与常规的观察者模式有所不同,常规模式下,我们一般是先注册监听事件,然后才会有事件回调,并且注册事件是不考虑之前发生的逻辑的。原创 2024-08-27 14:49:05 · 592 阅读 · 0 评论 -
Android --- transaction.commitAllowingStateLoss();和transcation.commit 有什么区别
transaction.commit() 和 transaction.commitAllowingStateLoss() 是 Android FragmentManager 中用于提交 Fragment 事务的方法,它们之间的主要区别在于状态丢失的处理。总结一般情况下,推荐使用 commit() 来确保 Fragment 状态的一致性。只有在确定丢失状态不会对用户体验产生严重影响时,才使用 commitAllowingStateLoss()。原创 2024-08-27 12:30:46 · 965 阅读 · 0 评论 -
Android --- Fragemnt 的生命周期
在实际应用中,你可以重写这些方法来执行特定的操作,比如数据加载、资源释放、用户交互处理等。记得在重写这些方法时调用父类相应的方法,以确保生命周期方法能够正常执行。Fragment的生命周期。原创 2024-08-26 11:40:57 · 493 阅读 · 0 评论 -
Android --- Kotlin学习之路:协程的使用,什么是协程,为什么要用协程?(学习笔记)
协程是基于线程,它是轻量级的线程java用的是线程,kotlin用的是协程,协程是个并发管理工具,定位跟线程其实是一样的。其实就是把java的线程包了一层。之前我们做网络请求的时候,想把网络请求的结果响应在主线程中,应该怎么写?一般情况下我们会在主线程去开启一个子线程发起网络请求,然后将请求的结果在主线程显示比如Retrofit,会帮我们实现自动在主线程去发起网络请求,不用我们自己new Thread,然后。原创 2024-07-19 14:24:39 · 2173 阅读 · 0 评论 -
Android --- Kotlin学习之路:自己写一个SDK给别的APP用(暴漏一个接口,提供学生的身高数据)
今天又来肝kotlin了,主题是:用kt写一个SDK给其他人用,这个小技能在项目中会经常用到,应该有很多小伙伴还不会用,不会的请往下看—⬇。接下来,我们到另外一个app,把刚才打包好的hights-release.aar放到libs下面。接下来你就会在项目工程下面看到刚刚所创建的module,我这里是hights。下添加以下代码,为了后面打包用,写完下面代码,记得sync一下。最终打包好的aar就会输出到build/libs/下面。最后随便写个main,调用SDK中的方法就可以了。原创 2024-07-12 16:52:24 · 653 阅读 · 0 评论 -
Android --- Kotlin学习之路:基础语法学习笔记
----------------------------------------基础只是学习完之后训练的例子-------------------------------------------------println(“server respose result : ${if (isLogin) “登录成功” else “登录失败”}”)我们可以给jar包中的某个类添加方法,因为jar包中的那个方法本身是不可以修改的。println(“是否继续使用程序,继续使用请输入Y,不使用请输入N”)原创 2024-07-10 15:11:28 · 1206 阅读 · 0 评论 -
Android --- Android 8.0之后不允许在后台启动一个服务的解决方案
这些限制导致在后台运行的服务可能会被系统认为是无效的,从而限制或者终止这些服务。JobIntentService 是 Android 提供的一个服务类,专门用于处理那些需要长时间运行的后台任务,它能够利用系统的 JobScheduler API,在适当的时候执行任务,而不会像普通服务那样直接在后台无限期运行。如果你的应用确实需要在后台长时间运行,并且需要执行一些重要的任务,可以将服务设置为前台服务(Foreground Service)。前台服务会在状态栏显示一个持续的通知,用户可以随时看到服务正在运行。原创 2024-07-09 15:51:43 · 1103 阅读 · 0 评论 -
Android --- 运行时Fragment如何获取Activity中的数据,又如何将数据传递到Activity中呢?
在 Fragment 中,可以通过 getActivity() 方法获取当前 Fragment 所依附的 Activity 实例。使用 ViewModel 来管理数据,Fragment 和 Activity 都可以通过获取同一个 ViewModel 实例来共享数据。定义一个接口,在 Fragment 中实现该接口,并在 Activity 中设置接口的回调,这样可以实现 Fragment 向 Activity 传递数据的双向通信。原创 2024-07-09 14:27:23 · 1310 阅读 · 0 评论 -
Android --- Kotlin学习之路:Retrofit 异步网络请求
【代码】Android --- Kotlin学习之路:Retrofit 异步网络请求。原创 2024-07-08 13:20:23 · 189 阅读 · 0 评论 -
Android --- Kotlin学习之路:Okhttp 同步异步网络请求
【代码】Android --- Kotlin学习之路:Okhttp 同步异步网络请求。原创 2024-07-05 16:34:14 · 453 阅读 · 0 评论 -
Android --- Kotlin学习之路:ViewBinding+Adapter+RecycleView实现垂直列表
【代码】Android --- Kotlin学习之路:ViewBinding+Adapter+RecycleView实现垂直列表。原创 2024-07-05 14:31:18 · 566 阅读 · 0 评论 -
Android --- 新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死,鼠标和键盘都操作不了
大概原因就是,初始化默认Google的安卓模拟器占用的RAM内存是2048,如果电脑的性能和内存一般的话就可能卡死,解决方案是手动修改安卓模拟器的config文件,重启模拟器。新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死,鼠标和键盘都操作不了。1.点击模拟器右侧三个点 - Show on Disk。3.修改hw.ramSize = 256字段即可。下面有演示的是 2024版本的 AS。2.找到config文件。原创 2024-07-02 10:03:35 · 1790 阅读 · 1 评论 -
Android --- MVVM+DataBinding+Fragment+Retrofit+Adapter 简单示例
首先,我们将使用 Retrofit 进行网络请求,所以我们需要添加 Retrofit 的依赖。接下来,我们创建一个接口来定义我们的 API 请求。原创 2024-06-07 10:30:45 · 473 阅读 · 0 评论 -
Android --- 线程池概述
Executors:jdk1.5之后的一个新类,提供了一些静态方法,帮助我们方便的生成一些常用的线程池,ThreadPoolExecutor是Executors类的底层实现//构造方法public ThreadPoolExecutor(int corePoolSize,//核心池的大小int maximumPoolSize,//线程池最大线程数long keepAliveTime,//保持时间TimeUnit unit,//时间单位。转载 2024-06-04 10:45:12 · 98 阅读 · 0 评论 -
Android --- 图解四种启动模式及实际应用场景解说
而一般onCreate方法中会进行该页面的数据初始化、UI初始化,假设页面的展示数据无关页面跳转传递的參数,则不必操心此问题,若页面展示的数据就是通过getInten() 方法来获取,那么问题就会出现:getInten()获取的一直都是老数据,根本无法接收跳转时传送的新数据!系统会为它创建一个单独的任务栈,由于栈内复用的特性。假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!转载 2024-06-03 10:52:58 · 2599 阅读 · 0 评论 -
Android --- 自定义View的三种实现方式及自定义属性使用介绍
我们在使用Android原生控件的时候,经常可以看到在布局文件中可以设置很多的属性值,如转载 2024-06-03 12:18:30 · 2142 阅读 · 0 评论 -
Android --- 英文单引号用'替换报错:does not contain a valid string resource
Android --- 英文单引号用'替换报错:does not contain a valid string resource原创 2024-04-23 17:25:59 · 539 阅读 · 1 评论 -
Android --- Content Provider是使用示例,通俗易懂
当两个应用程序之间需要共享数据时,可以通过 Content Provider 来实现。在这个示例中,我们将创建一个简单的 Content Provider,让 App_B 暴露人口总数的数据,并由 App_A 来获取这个数据。原创 2024-01-30 15:38:25 · 916 阅读 · 0 评论 -
Android --- Activity/Window/DecorView/ViewRootImpl的创建时机以及View的绘制流程
【代码】Android --- Activity/Window/DecorView/ViewRootImpl的创建时机。原创 2023-12-01 16:38:06 · 934 阅读 · 0 评论 -
Andoird --- RecycleView 恢复上次滚动到的位置
【代码】Andoird --- RecycleView 恢复上次滚动到的位置。原创 2023-06-20 19:48:55 · 128 阅读 · 0 评论 -
Android --- 内存泄漏,如果查不到具体泄漏的原因怎么处理?
解决方案:通过反射把SearchActiity中的mActivityResultRegistry砍掉,因为查不到具体原因,只能这么做。原创 2023-06-08 09:31:58 · 542 阅读 · 0 评论 -
Andorid --- File->ProjectStructure->SDK Location->Gradke Setting下面的Gradle JDK不可选择,选了之后也不生效,解决方案
Andorid --- File->ProjectStructure->SDK Location->Gradke Setting下面的Gradle JDK不可选择,选了之后也不生效,解决方案原创 2023-05-19 17:15:36 · 490 阅读 · 0 评论