编程之家(jb51.cc)移动开发栏目主要收集最新编程资料,例如:iOS开发教程、Android开发教程、Swift教程、Hybrid教程、Cocos2d-x教程等。
boss 直聘 HR 推了简历给有关部门,简历通过后电话约的面试机会。当时约的是 10:30 的面试时间,所以只请了半天假。第一轮是两个面试官轮流问问题,第一面大约面了一个小时,大约等了十几分钟第二面的面试官把我叫到了 另外一个办公室,也是两个面试官轮流问了大概一个小时,面完二面后就差不多到了下午一点,面试官说我带你去食堂吃个饭,吃完饭面试官帮我约了下午两点的 HR 面。感觉整个流程下来非常爽,总共三轮面试,两轮技术面(每轮2个面试官),一轮 HR 面。1. mmap + native 日志优化?讲了传统日
Fragment 诞生之初就被定义为一个小型 Activity,因此它代理了 Activity 的许多能力(例如 startActivityForResult 等),职责不够单一。随着 Jetpack 各种新组件的出现,Fragment 的很多职责被有效地进行了分担,其本身也可以更更好地聚焦在对 UI 的划分而管理上面,以前的一些 API 也可以退出历史舞台了。本文就盘点一下 Fragment 那些被废弃的 API。以前, Fragment 的构造函数不允许携带参数,因为某些场景中 Fragment 会由系
消息总线又叫事件总线,为什么我们需要一个消息总线呢?是因为随着项目变大,页面变多,我们可能出现跨页面、跨组件、跨线程、跨进程传递消息与数据,为了更方便的直接通知到指定的页面实现具体的逻辑,我们需要消息总线来实现。从最基本的 BroadcastReceiver 到 EventBus 再到RxBus ,后来官方出了AndroidX jetpack 我们开始使用LiveDataBus,最后到Kotlin的流行出来了FlowBus。我们看看他们是怎么一步一步演变的。我们再初入 Android 的时候都应该学过广播接
组件化开发现在基本上属于基础操作了,大家一般都会使用 ARouter 、LiveDataBus 作为组件化通信的解决方案,那为什么会选择ARouter,ARouter又是怎么实现的呢?这篇文章主要就 搭建组件化开发的准备工作 、组件化跳转分析,如果理解了这篇文章,对于查看ARouter源码应该是会有很大的帮助的。至于ARouter等分析,网上有很多的讲解,这里就不分析ARouter源码了,文章末尾会给出ARouter源码时序图和总结,可忽略。ps: 为什么写本文,因为笔者最近被问道,为什么要用ARouter
LiveData是一个抽象类,我们一般使用MutableLiveData创建LiveData对象。MutableLiveData仅仅继承了LiveData,没有做其他额外的操作。1.首先assertMainThread()方法会先判断当前调用线程,如果不在主线程则会抛出异常2.然后通过owner获取Lifecycle当前所处于的状态,如果已经销毁(DESTROYED),则此时注册观察者毫无意义,直接忽略。3.将owner和observer包装成LifecycleBoundObserver对象。4.
历时大半个月,斩获2个大厂offer(京东、新浪),这里进行下简单的总结,希望能帮助到大家。总体来说,面试一般都是基于你的简历来进行的,一般先考察你的基础,然后考察你知识体系的完备程度,接着会考察你的极限,最后还会考察一些软技能,比如你的学习能力、协作能力、沟通能力、分析解决未知问题的能力、抗压能力等。凡事预则立,不预则废。面试之前,最好先系统的复习一下基础知识,然后再复盘下自己的项目经历,把亮点都发掘出来。复习周期个人建议是三个月到半年,时间不宜太久,久了就容易懈怠或者闭门造车,三个月的时候最好出去开始试
插件化技术最初源于免安装运行 的想法,这个免安装的 就可以理解为插件,而支持插件的 我们一般叫 宿主。想必大家都知道,在 系统中,应用是以 的形式存在的,应用都需要安装才能使用。但实际上 系统安装应用的方式相当简单,其实就是把应用 拷贝到系统不同的目录下、然后把 解压出来而已。常见的应用安装目录有:那可能大家会想问,既然安装这个过程如此简单, 是怎么运行应用中的代码的呢,我们先看 的构成,一个常见的 会包含如下几个部分:其实 系统在打开应用之后,也只是开辟进程,然后使用 加载 至进程
Fragment 间的通信可以借助以下几种方式实现:EventBus 的优缺点都很突出。 优点是限制少可随意使用,缺点是限制太少使用太随意。因为 EventBus 会导致开发者在架构设计上“不思进取”,随着项目变复杂,结构越来越混乱,代码可读性变差,数据流的变化难以追踪。所以,规模越大的项目 EvenBus 的负面效果越明显,因此很多大厂都禁止 EventBus 的使用。所以这道题千万不要把 EventBus 作为首选答案,比较得体的回答是:为了迭代更加敏捷,Fragment 从 AOSP 迁移到了 And
在Android系统中,我们知道UI线程负责我们所有视图的布局,渲染工作,UI在更新期间,如果UI线程的执行时间超过16ms,则会产生丢帧的现象,而大量的丢帧就会造成卡顿,影响用户体验。从上可知,大部分的卡顿原因都产生于代码编写不当导致,而这类问题都可以通过各种优化方案进行优化,所以我们需要做的就是尽可能准确的找到卡顿的原因,定位到准确的代码模块,最好是能定位到哪个方法导致卡顿,这样我们APP的性能就能得到很大的提升。在开发阶段我们可以借助开发工具为我们提供的各种便利来有效的识别卡顿,如下:具体使用可以看b
近期,无意间重新翻阅了一下 Android 官方文档,发现文章的目录结构有不少改动的地方。我尝试从这些改动的地方,一探 Android App 架构的演进方向。当然文档中包含的主题有很多,本文主要从架构相关的主题进行介绍。官方文档中,中文与英文中的目录结构并不相同,英文版本结构更加合理,中文文档结构应该是翻译进度问题有所滞后。也正是由于这种滞后的现象,才可以更加方便的对比出官方对于各项技术的思考。下面我们就看下具体的差异点在什么地方。在中文版本的文档中,架构相关的内容散落在核心主题的各处,而在英文版本中则将
目前,我在开发的一个 Android 项目需要各个功能做到线上动态化,其中,App 启动时显示的 Loading 模块,会优先检测加载远程的 Loading 模块,加载失败时,会使用 App 本身默认的 Loading 视图,为此,我编写了一个 LoadingLoader 工具类:LoadingLoader 工具类使用 Kotlin 的单例模式, 方法接收 2 个回调参数, 方法触发加载远程 Loading 模块,并根据加载结果执行回调,其中 用于防止该工具类被初始化多次。然后,在 App 的主入口 L
Lifecycle生命周期感知型组件,用来执行、操作、响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。本文Lifecycle版本为2.2.0:implementation ‘androidx.lifecycler:lifecycle-common:2.2.0’ //22.2.23 更新 2.5 ,2.2是用的比较多的版本Lifecycle使用非常非常简单。默认你已经使用过Lifecycle。但如果我问你以下几个问题。你能回答出来几个?如果我是面试官,遇到简历上写掌握Jetp
虽然现在已经有很多不错的换肤方案,但是这些方案或多或少都存在自己的问题。在这篇文章中,我将对 Android 现有的一些动态换肤方案进行梳理,对其底层实现原理进行分析,然后对开发一个新的换肤方案的可能性进行总结。这种方案是我之前用得比较多的一种方案。我在使用的时候也做了很多的调整。开源版本可以参考 Colorful 这个库.它的实现方式是:用户提前自定义一些 theme 主题,然后当设置主题的时候将制定主题对应的 id 记录到本地文件中,当 Activity RESUME 的时候,判断 Activity 当
Jetpack Compose是用于构建原生Android UI的现代工具包。 Jetpack Compose使用更少的代码,强大的工具和直观的Kotlin API,简化并加速了Android上的UI开发。这是Android Developers 官网对它的描述。本文不是教你Jetpack Compose 的一些基本使用方法,而是为啥我们需要Jetpack Compose 的一些简洁,让我们对Jetpack Compose 有更深层次的了解。在Android中,UI工具包的历史可追溯到至少10年前。自那时以
随着公司业务的扩展,货拉拉用户端apk包的体积也不断变大,过去一年,用户端android组进行了大量的瘦身工作,取得了较为显著的成果。再使用常规方法,已经很难优化包体积了。我们可以把一些使用频率相对较低的资源不打包进apk,并在需要时下载到本地(例如动画文件,字体,zip压缩包,so库等)我们注意到,货拉拉用户端apk中,使用了35个以上的so库,并且都支持arm64-v8a和armeabi-v7a这2种abi,结果就是so体积成倍上涨。单个文件的资源打包同字体资源多个文件的资源打包同帧动画资源。...
相较 iOS 早期便有的全局返回功能,Android 直到版本 10 才姗姗来迟。但 Google 给这个功能添加了视图、动画和角度展示,更是向用户开放了手势敏感度的设置入口。本文就这个系统功能一探其实现原理,了解之后:源码版本:目录前瞻:SystemUI App 的 在构造的时候通过 DI 创建 实例,其是整个返回手势的核心管理类。EdgeBackGestureHandler 类在构造的时候初始化一些手势判断需要的参数和变量。NavigationBarView 初次添加到 Window 上的时候会
从3月初开始复习,准备面试题。复习的滋尿主要是之前学习时做的一些笔记与一些行业大佬们给我一些面试文档,还有就是网上的其他博客资料。首先介绍一下自己基本情况:渣本毕业快4年,一直在小厂摸鱼混日子,学历和简历背景不是很好看,所以面试邀约也不是很多,面试也到处碰壁。从3月中旬开始面试,一直到4月底,到现在才有闲暇时间来写这篇面经。共面试9家公司,近20轮面试,拿到2个小公司和1个上市公司(不是出名的公司)的offer,最后准备去上市公司了。中间也投递了BAT、360、抖音、快手、平安等大厂的岗位,不过大部分没给面
自从 Jetpack Compose 的第一个稳定版本上线以来,已经过去了好几个月 (译注:本文写于2022年4月)。多家公司已经使用了 Compose 来参与构建他们的 Android 应用程序,成千上万的 Android 工程师每天都在使用 Jetpack Compose 。虽然已经有大量的文档可以帮助开发人员接受这种新的编程模式,但仍有这么个概念让许多人摸不着头脑。它就是,Compose 赖以运作的基础。如果您不熟悉此主题,我将在本文中详细介绍 。对于大多数用例,除非传入的参数变了,否则我们不希望重新
MotionLayout 的使用大家应该都会了,如果不会看这里。本文就不科普如何使用,什么属性是什么意思,怎么使用之类的了,这里只是探讨一下 MotionLayout 效果实现的几种方式。我们知道 MotionLayout 是 ConstraintLayout 库中的功能,我们可以直接使用 ConstraintLayout 来定义两组不同的 ConstraintLayout 布局,使用 ConstraintSet 来切换不同的布局。原始布局:改变后的布局:使用的时候:效果:需要注意的是这里的View
这波Handler让我错不急防~
Handler 可能导致的内存泄漏和解决办法
难道Android开发行业真的凉了吗?那身处于Android开发行业的人该怎么办?其实不管在任何行业,任何岗位,初级技术人才总是供大于求,都是不好找工作的,Android开发只是其中之一,同样,不管任何行业、岗位,技术过硬的也都是非常吃香的!说到底,是Android凉了吗?其实并没有!只是市场对于Android 开发者们的技术要求越来越高了,说到底看过硬的技术。如果你从事Android开发十年,技术还停留在最开始的前两年的技术,那你做不长久。技术不过硬,就算转去Java、大数据、人工智能,还是会问出类似的问
之前在项目上做内存泄漏优化的时候有一个关于RecyclerView内存泄漏,页面结构如图:LeakCanary捕获的引用链如下找出问题从引用链可以看出关键点在于GapWorker,首先看看这个GapWorkerRecyclerView在android 21及以上版本会使用实现预加载机制,在Recyclerview的方法中尝试将其实例化,并通过GapWorker的方法将Recyclerview自身添加到的成员变量链表中去,在会调用的方法移除其对自身的引用,实例保存在其类静态成员变量(ThreadLocal
是Android本地存储的一种方式,是以的形式存储在里,的使用示例及源码解析参见:Android本地存储之SharedPreferences源码解析。以下是的一些结论:为什么还会出现呢?我们来看下的逻辑(这里源码是看的的):将加入到队列中,在执行时利用机制可以实现对当前线程的阻塞效果,后续的中会将这里的取出来执行,即会阻塞等待写入磁盘。写入操作是通过在构造的子线程中完成的,写入成功后会通过释放中的锁,使得线程恢复执行。、执行时,都会调用到方法:、都是间接在中的执行的,这两个方法里都会执行到:这里
MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权、多任务多进程操作系统。Android–Linux 内存 应用层在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个覆盖块,覆盖块0最先运行,运行结束之后
无业游民,闭关两月,斩获Offer
那你在工作中、团队里、面试时,也就拥有了同行难以复制的核心竞争力。如果你正在进阶这一块,
前面基于代码片段进行了一些对比,最后以CounterDemo为例,看一个完整功能下Flutter、Compose和Swift的代码对比,React与其他三者代码风格差异较大,就不参加比较了。可以感觉到Compose代码最简洁也最直观,SwiftUI通过ViewBuilder机制也可以实现与Compose类似的DSL,表现也非常不错,Flutter由于模板代码较多,在简洁程度上表现最差。点击这里查看获取方式传送门直达!!!httpshttpshttps。...
本文主角是。它是RecyclerView对于item交互处理的一个「辅助类」,主要用于拖拽以及滑动处理。以接口实现的方式,达到配置简单、逻辑解耦、职责分明的效果,并且支持所有的布局方式。