
Android开发
文章平均质量分 82
一叶飘舟
目标赋予我们生命的意义和目的。有了目标,我们才会把注意力集中在追求喜悦,而不是在避免痛苦上。(急需找我,加微信:jdsjlzx)
展开
-
App处于前台,Activity就不会被回收了?
Android系统中,进程的生命周期由系统控制,处于体验和性能考虑,在APP中点击Home键或Back回退操作,并不会真的杀掉APP,进程依旧存在于内存中,这样下次启动此APP时就能更加快速。随着系统运行时间增长,打开APP越来越多,内存中的进程随着增多,系统的可用内存会越来越少。可以看到,adj是动态变化的,当App状态及四大组件生命周期发生改变时,都会改变它的值。下次GC,又会走一遍这里的代码,啧啧啧,相比起轮询高效多了。当然,不会那么蠢,还要开发仔自己在APP里回收内存,虚拟机自带。转载 2024-12-02 16:53:40 · 223 阅读 · 0 评论 -
Android 跨进程+解耦的数据持久化方案
如果提到跨进程你肯定会想到 AIDL , 没错我们确实是频繁使用到 AIDL 去 bind 服来完成跨进程通信。另外如果是一些持久化到本地的数据,bind service 的方式也不是最优解。这种解耦的支持跨进程的持久化存储方案:今天带来 ContentProvider+Room 来给大家出个示例。ContentProvider 是基于 Uri 的,天然就算是解耦的,不需要有任何的 sdk 或者 aidl 文件依赖就能达到耦合和跨进程。转载 2024-11-12 16:18:51 · 239 阅读 · 0 评论 -
android单元测试怎么读取assets目录下的文件
【代码】android单元测试怎么读取assets目录下的文件。转载 2024-08-22 17:01:55 · 287 阅读 · 0 评论 -
Android 如何通过AIDL分片传输大量 Parcelable 数据列表
下面就来讲述一个分片传输的处理方案,来解决这类数据过大的问题。转载 2024-07-10 10:37:00 · 405 阅读 · 0 评论 -
Android跨进程传图片或者大数据(解决TransactionTooLargeException)
优势效率相对最高传递图片没有大小限制劣势使用相对麻烦,需要自定义aidl相关代码可能有侵入性,必须在四大组件中接收。/***/原创 2023-11-22 15:29:55 · 3340 阅读 · 2 评论 -
ContentProvider的执行时机
这里先给出源码分析的结论:ContentProvider 的 onCreate() 方法先于 Application 的 onCreate() 方法执行,晚于Application的onAttachContext()方法执行。原创 2023-10-23 11:12:01 · 519 阅读 · 0 评论 -
ServiceLoader使用看这一篇就够了
想要实现上面的需求,首先要知道拦阻这个需求实现的问题,然后把这些问题都解决了,需求自然也就实现了。上面说了,正常情况下会那样输出,但是你运行程序你就会发现,马丹,怎么不起作用啊,我哪里做错了,都是按照文章步骤来做的。在ServiceLoader.load的时候,根据传入的接口类,遍历META-INF/services目录下的以该类命名的文件中的所有类,并实例化返回。最简单的方法,把资源下的META-INF文件夹拷贝到build目录下,然后再运行,发现可以了,这也就验证了,确实是这个问题造成的。转载 2023-02-27 22:54:04 · 1495 阅读 · 0 评论 -
BitmapPool 了解吗?Glide 是如何实现 Bitmap 复用的?
以上就是 Glide 中 Bitmap 复用的原理,希望本文对你有所帮助!转载 2023-02-19 01:08:47 · 1323 阅读 · 0 评论 -
Android Glide源码解析
源码方面主要从最基本的三个方法入手:with,load,into。Glide.with可以看到,每个重载方法内部都首先调用getRetriever()方法获取一个RequestManagerRetriever对象,然后调用其get方法来返回RequestManager。传入getRetriever()的参数都是Context,而RequestManagerRetriever.get()方法传入的参数各不相同,所以生命周期的绑定肯定发生在get方法中。下面,接着分析getRetriever()方法。转载 2023-02-19 00:17:40 · 829 阅读 · 0 评论 -
谨慎使用多线程中的fork
因为子进程继承的是父进程的锁的拷贝,所有上述并不是解锁了两次,而是各自独自解锁。context是由程序正确运行所需的状态组成的,这个状态包括存放在存储器中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器(PC)、环境变量以及打开的文件描述符的集合。在大多数操作系统上,为了性能的因素,锁基本上都是实现在用户态的而非内核态(因为在用户态实现最方便,基本上就是通过原子操作或者之前文章中提到的memory barrier实现的),所以调用fork的时候,会复制父进程的所有锁到子进程中。转载 2023-02-14 13:50:53 · 320 阅读 · 0 评论 -
android启动优化-异步启动框架Alpha完全解析
分析下来,这个异步启动框架应该算比较简单的,但是能解决问题啊!其实我们平时工作中也可以做一些积累,然后写成工具或者框架,如果能开源出来大家一起使用还真是一件不错的事情呢!转载 2023-02-14 00:09:11 · 994 阅读 · 0 评论 -
Android启动优化深入解析,全面掌握!
AOP简介:Aspect Oriented Programming,面向切面编程针对同一类问题的统一处理无侵入添加代码AspectJ简介:它就是辅助AOP用来实现切面编程//工程目录下的build.gradle//app module目录下的build.gradle添加完了依赖之后,再来介绍一下相关知识点,然后我们再到代码中去真正的使用它。Join Points:程序运行时的执行点,常用的可以作为切面的地方如下所示:函数调用、执行获取、设置变量类初始化。转载 2023-02-13 22:46:07 · 576 阅读 · 0 评论 -
Handler机制详解
Android的消息机制主要是指Handler的运行机制即:消息的发送、入队、出队、分发过程。转载 2023-02-13 19:11:47 · 2328 阅读 · 0 评论 -
面试题:android中A Activity 打开B Activity,为什么A Activity的onStop()方法最后被调用
当用户触发某事件切换到新的Activity,用户肯定是想尽快进入新的视图进行操作,上面已经说了,在onResume()一般会打开独占设备,开启动画等,当需要从AActivity切换到BActivity时,先执行AActivity中的与onResume()相对应的onPause()操作,比如关闭独占设备,关闭动画,或其它耗费cpu的操作;2、onPause() 的注释中,也明确地说了,在这个方法中执行停止动画等比较耗CPU的操作,如果不先执行这些操作,就先启动新应用,然后再来执行此操作,确实是不合逻辑;原创 2023-02-13 14:08:02 · 829 阅读 · 0 评论 -
Android性能优化之启动速度优化
文本主要会介绍三大块:1.简略介绍APP启动的完整流程,对整个流程有所了解,才知道在哪里可以进行优化。2.一些常用的APP启动优化的方案,主要分为三大块优化方向。3.一些不常见的APP启动优化的方案,甚至包含一些FW层的代码改动,有的可能是对应用开发者无效的,但是对于车载开发是有用的。转载 2023-02-11 16:13:10 · 3591 阅读 · 0 评论 -
移动端防抓包实践
通讯安全是App安全检测过程中非常重要的一项针对该项的主要检测手段就是使用中间人代理机制对网络传输数据进行抓包、拦截和篡改,以检验App在核心链路上是否有安全漏洞。保证数据安全通过charles等工具可以对app的网络请求进行抓包,这样这些信息就会被清除的提取出来,会被不法分子进行利用。不想被竞争对手逆向抓包不想自身App的数据被别人轻而易举地抓包获取到,从而进行类似业务或数据分析、爬虫或网络攻击等破坏性行为。转载 2023-01-13 17:02:16 · 1924 阅读 · 0 评论 -
Android DataBinding笔记
其中 MainActivity 的 ActivityMainBinding (这个叫做绑定类)是根据布局文件和其名称自动生成的,需要注意的是,任何情况下都不应该自己实现绑定类,这个一定要交给DataBinding来生成。官网介绍,DataBinding是用于将数据的和视图绑定在一起的支持库,特点是只需要在视图定义的xml中编写绑定信息,减少在代码中的视图于数据的交互逻辑。参考:https://blog.youkuaiyun.com/qq_40533422/article/details/106838495。转载 2022-11-26 11:52:22 · 7067 阅读 · 0 评论 -
Android企业微信分享到小程序
登录企业微信管理后台,选择企业应用,选择“企业微信授权登录”,在设置界面填写Android的 App的签名&包名,设置完成后系统自动生成应用程序schema。lib_wwapi-2.0.12.11.aar 将此aar包下载并导入到工程项目。文字类型分享、图片类型分享、网页类型分享等其他分享详看官方文档。Android应用 - 接口文档 - 企业微信开发者中心。原创 2022-11-16 11:46:54 · 1678 阅读 · 0 评论 -
android studio找不到aar问题解决
3.在 该module下的build.gradle 添加 dependencies。2.在该module下的build.1.将aar文件复制在lib目录下。重新build就可以解决问题了。原创 2022-11-09 15:47:08 · 5365 阅读 · 0 评论 -
Android开发 ConstraintLayout布局的详解
这里的定位属性指的是 layout_constraintTop_toTopOf 、layout_constraintTop_toBottomOf 、 layout_constraintStart_toEndOf 等等此类属性。为了方便后续理解,这里说明下此类定位属性的意思。此类定位属性在文本上想表达的是 当前View 在 定位View 什么位置上。这里举几个例子,例如:layout_constraintTop_toBottomOf 这个属性的意思是 当前View的上边(Top)在 目标Vi转载 2022-10-28 15:29:19 · 6592 阅读 · 0 评论 -
Android Studio使用Composing builds统一依赖管理
摘自 Gradle 文档:复合构建只是包含其他构建的构建.在许多方面,复合构建类似于 Gradle 多项目构建,不同之处在于,它包括完整的 builds ,而不是包含单个 projects。转载 2022-09-25 12:41:14 · 3280 阅读 · 0 评论 -
Android使用Jenkins打包自动维护sdk版本号
在时候使用Jenkins打包sdk的时候,有时候我们想在打包完成后更新一下sdk的版本号,这时可以这样做。在工程跟目录下新增jenkins_aar.sh:注意:SDK_BRANCH是从环境变量中读取的当前打包的分支名称在工程跟目录下新增version.properties:在工程根目录的build.gradle里面配置如下:原创 2022-06-01 11:29:29 · 929 阅读 · 0 评论 -
Android 网络性能优化-复用连接池和弱网优化
1. 概述复用连接池是一个优化连接的技术,在Android中,功能强大的OkHttp已经帮我们实现了这个技术,使我们不用再担心多请求时的性能低下。虽然已经帮咱实现了,但是我们可以学习学习(所以该篇比较简单),顺便可以重温下OkHttp的源码。该篇承接 Android 网络性能优化(2)DNS优化,在拿到服务器ip后,我们客户端和服务端需要建立Socket,走Tcp的三次握手,在请求完成后通过四次分手关闭Socket。下图为三次握手流程:如果程序产生了频繁的、数量较多的 网络请求,大量的连接每次都转载 2022-03-27 18:32:26 · 3155 阅读 · 0 评论 -
Android 网络性能优化-概述和DNS优化
1. 移动App网络优化背景对于Android来说,开发者可以轻松的打造一套 MVP + Retrofit + RxJava 的框架来处理所有的网络请求。因为 Retrofit下层封装的OkHttp是非常强大的网络库,而 RxJava又能够很好的帮我们处理线程切换的问题。但是对于大型的App来说,仅仅是使用这些是不够的,它太机械,不能帮我们处理复杂多变的网络情况。在我的上个公司,智能设备的网络连接是老大难问题,有时候设备连不上Wifi的情况下,开发人员去跟进,到最后总会丢出一句:“设备就是Pin转载 2022-03-26 19:07:52 · 2050 阅读 · 0 评论 -
Android向系统日历添加日程提醒事件
大家都知道,在 Linux 系统中,有环境变量和 Shell 变量这两种变量。环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路径等等这样的信息。而 Shell 变量仅在当前 Shell 中可用,可以用来存储当前用户的 ID 等信息。那么什么是环境变量,什么是 Shell 变量,该如何设置和查看这两种变量呢?接下来,让良许为你解答:环境变量环境变量是以键值对的形式实现的,是在整个系统范围内都可用的变量,并由所有派生的子进程和 Shell转载 2021-11-04 20:53:37 · 13051 阅读 · 3 评论 -
如何做到在子线程更新 UI?
一般来讲,子线程是不能更新 UI 的,如果在子线程更新 UI,会报错。但在某种情况下直接开启线程更新 UI 是不会报错的。比如,在 onCreate 方法中,直接开启子线程更新 UI,这样是不会报错的。override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textView转载 2021-09-04 10:08:09 · 1839 阅读 · 0 评论 -
Gson:java.lang.AssertionError: illegal type variable reference
1、问题现象:APP使用 XX加固助手 加固之后,在安卓 7.x.x 系统中会崩溃:错误信息为 java.lang.AssertionError: illegal type variable reference。未加固之前并没有出现这个问题。2、解决方案(1)方案一:网络搜索发现,大部分都说是开启混淆之后没配置好导致的,所以,根据网络搜索结果先检查 module 的 build.gradle 和 proguard-rules.pro 中的配置。如果 buid.gradle 中开启了原创 2021-06-24 17:20:46 · 844 阅读 · 0 评论 -
Andoid app三方库权限位置查找和处理
查找方案:第一种方法:使用AS Find in Path(Eclipse模式快捷键Crtl+H)全局搜索功能,选择搜索范围为scope,就能看到所搜权限在三方库中的位置,速度最快。第二种方法:打包过程中,会在build\outputs\logs文件夹中生成log文件,在log文件中搜索权限,可以对应到具体三方库,比第一种方案精确度更好。可以通过AS项目中的External Libraries找到权限所在的三方库,然后右键选择项目Properties来查看库下载到本机的位置,找到aar转载 2021-05-21 20:45:27 · 2080 阅读 · 0 评论 -
Android Native Crash的log分析和定位
非原创,学习于:https://blog.youkuaiyun.com/helldevil/article/details/6682211无论是开发还是测试,如果能掌握log定位是一件很好的事情。09-22 09:39:43.083 F/libc ( 9479):Fatal signal 11 (SIGSEGV),code 2 (SEGV_ACCERR),fault addr 0x7a05b46000 in tid 9714 (Thread-5),pid 9479 (m.xxxx.gallery)...转载 2021-05-14 15:48:07 · 3388 阅读 · 0 评论 -
Android中用反射获取View
延伸阅读:巧妙利用反射机制得到ListView中的view我们在使用ListView的时候,经常会使用的ViewHolder方式作为缓存,每次都需要手动的通过viewholder.icon = convertview.findVIewByid(id);一般的app都会有好几个页面会用到ListView,这样的话我们的代码量就会很大,有没有好点的办法呢,其实今天学习了反射机制,利用所有的控件的超类都是View这个特点,循环给ViewHolder里边的控件赋值,下边是具体代码:pu...原创 2021-03-26 22:55:59 · 2246 阅读 · 2 评论 -
解决WebView文件上传无法重复选择问题
Android开发使用WebView控件加载包含表单的 H5 网页,点击上传文件按钮,弹出对话框,选择从相册获取照片、拍照或打开手机文件管理器,从 Android 手机选取一张图片或一个文件,然后通过ValueCallback接口传递,在 WebView 加载的 H5网页 显示。这里有一个问题,点击“取消”或返回按钮,无法重复回调onShowFileChooser或openFileChooser方法,控制台打印:Attempted to finish an input event but the .转载 2021-03-23 16:23:45 · 1837 阅读 · 0 评论 -
为何大厂APP如微信、支付宝、淘宝、手Q等只适配了armeabi-v7a/armeabi?
0. 前言前几天啊,在公众号发了一篇文章《优化ApK大小之ABI Filters 和 APK split》,评论区收到了一些留言说,文章讲得不够深入,关于系统是如何选择不同abi下的so库的?当前APP该如何适配?该去掉哪些该保留哪些?都存在一些疑问。因此,决定亲自更文一篇,系统地讲一下关于Android CPU架构方面的一些东西,以及结合大厂APP如微信、支付宝、淘宝等APP的适配情况,分析我们开发APP中该如何适配。本文涉及以下几个问题:什么是ABI? ABI有何作用? 目.转载 2021-03-16 16:32:39 · 1232 阅读 · 1 评论 -
android开发中混淆后Gson序列化、反序列化的那些坑
GSON的序列化与反序列化GSON是一个很好的工具,使用它我们可以轻松的实现序列化和反序列化.但是当它一旦遇到混淆,就需要我们注意了.一个简单的类Item,用来处理序列化和反序列化public class Item { public String name; public int id;}序列化的代码Item toSerializeItem = new Item();toSerializeItem.id = 2;toSerializeItem.name = "原创 2021-02-28 14:58:06 · 3971 阅读 · 2 评论 -
LayoutInflater中inflate方法两个参数和三个参数的区别
关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个东东。本篇博客我们不讲源码,只看使用。源码的解读会在下一篇博文中带来。inflate方法从大范围来看,分两种,三个参数的构造方法和两个参数的构造方法。在这两类中又有细分,OK,那我们就把各种情况都来演示一遍。1.三个参数的inflate方法方法头如下:public View inflat.转载 2021-02-13 16:13:07 · 435 阅读 · 0 评论 -
Mac下配置Android环境
Kotlincould not find the require JDK tools in the Java installtion '/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home' used by Gradle. Make sure is running on a JDK, not JRE.最近在Android开发中使用gradle打包时遇到了上面的问题,排查很久,总算找到了原因:没有配置JAVA_HOME环境变量.原创 2020-11-20 20:15:50 · 2371 阅读 · 1 评论 -
Androidx 切换多语言失效解决方案(appcompat版本有关)
项目经过Androidx改造后,多语言切换会失效,这里汇总下。当引用了androidx.appcompat:appcompat:1.1.0时,BaseActivity中实现下面方法:@Overridepublic void applyOverrideConfiguration(Configuration overrideConfiguration) { // 兼容androidX在部分手机切换语言失败问题 if (overrideConfiguration != null) {原创 2020-10-26 10:59:11 · 6155 阅读 · 4 评论 -
Android URL中参数的获取、拼接及修改
1、获取参数Uri uri = Uri.parse(url);String type = uri.getQueryParameter("key");2、拼接Uri.Builder builder = Uri.parse(url).buildUpon();builder.appendQueryParameter("key", value);3、修改public static String replace(String url, String key, String value)转载 2020-08-10 14:22:30 · 4017 阅读 · 0 评论 -
Gson 解析 Json,容错才是关键,举几个常用的实例!
在上篇文章中,提到了GSON 在 JSON 序列化和反序列化之间,数据容错的情况,最简单的利用@SerializedName注解来配置多个不同 JSON Key 值,或者再使用@Expose来配置一些例外的情况。更复杂一些的数据,可以使用 TypeAdapter 来解决,TypeAdapter 可以说是一颗 GSON 解析 JSON 的银弹,所有复杂数据解析以及容错问题,都可以通过它来解决。GSON 数据容错实例就像前文中介绍的一样,GSON 已经提供了一些简单的注解,去做数据的容错处...转载 2020-05-28 18:30:36 · 1475 阅读 · 1 评论 -
Gson在使用时怎么对JSON容错处理
序“JSON是一种具有自描述的、独立于语言的、轻量级文本数据交换格式,经常被用于数据的存储和传输。而GSON可以帮我们快速的将JSON数据,在对象之间序列化和反序列化。”GSON 的toJson()和fromJson()这两个方法,是GSON最基本的使用方式,它很直观,也没什么好说的。但当被问及GSON如何对JSON数据容错,如何灵活序列化和反序列化的时候,就有点抓瞎了。JSON数据容错,最简单的方式是让前后端数据保持一致,就根本不存在容错的问题,但是现实场景中,...转载 2020-05-28 17:02:42 · 2318 阅读 · 0 评论 -
遇到android.os.BadParcelableException: ClassNotFoundException when unmarshalling怎么解决
本文基于本人在项目开发中遇到的实际问题,对ClassNotFoundException异常发生的原因和解决办法做了探究。定位异常首先看看出问题的代码。Application 1 的部分代码:private MediaSessionCompat mMediaSession = new MediaSessionCompat(this, TAG); private void s...转载 2019-11-02 23:38:10 · 11435 阅读 · 2 评论