Android(安卓),是一个以Linux为基础的开源移动设备操作系统,主要用于智能手机和平板电脑。Android系统最初由安迪·鲁宾(Andy Rubin)等人开发制作,最初开发这个系统的目的是创建一个数码相机的先进操作系统;但是后来发现市场需求不够大,加上智能手机市场快速成长,于是Android被改造为一款面向智能手机的操作系统。於2005年8月被美国科技企业Google收购。
作者:HyejeanMOON转载地址:https://juejin.cn/post/7098975953199726606因为在iOS14中推出的小组件的功能,让大家重新开始关注起小组件了。虽然安卓是很久之前就有了小组件的功能,但是因为它的不美观和不实用,以及对开发者也不够友好,逐渐变成为废弃的状态。直到Android12,再一次更新了小组件的的相关功能,并且为了减少开发者的负担而推出了Jetpack Glance库。该库是基于Compose,是开发者利用Compose的命令快速上手进而减少开发成.
作者:字节跳动技术团队转载地址:https://juejin.cn/post/7078249602410889247文章标题很随意,些微有一些骗点击的“贼意”;但内容却是充满了诚意,想必你已经感受到了。这是一次源于头条 Android 客户端软件架构问题的探讨,之所以冠上“嘴炮”之名,是因为它有一些务虚;同时又夹杂了一些方法论,不仅适用于客户端软件架构,也适用于其他工作场景,希望对大家有所帮助。为了拉满读者的带入感,且以“我们”为主语,来看架构的挑战、判断和打法。我们的挑战期望高优秀的公司.
路只有一条:Read the fcking source code。翻译过来读源码,不论是看书,看博客,你的最终目的只有一个「学会看源码」,而不是「学会源码」。关于如何阅读源码,这不是一个简单的问题,我有几点经验 给大家分享:看不懂的多读。上面已经说过了,没有人一学就会;特别是对于初学者,你刚看系统源码,肯定一头雾水;万事开头难,在你觉得艰深晦涩的时候,你就当在背课文;Android Framework的代码时遵循一定规范的,你在背了一篇课文之后,再去读别的课文,读到一半的时候就算你看不懂,很有可能你就会
说起来,在不知不觉中,我竟然凑成了这沉浸式状态栏三部曲。其实最开始的时候,我主要是因为工作上的原因想要在Android版的Edge浏览器上实现首页图片沉浸式的功能。那么为了实现这个功能,我提前去做了一些技术调研,并将调研的结果整理成了一篇文章,具体可参阅 再学一遍android:fitsSystemWindows属性 。做完技术调研之后,接下来就是功能实现了。对于Android版的Edge浏览器而言,首页图片的沉浸式一直是部分网友长久以来的呼声,经过我的各种攻坚和踩坑之后,终于将这个功能完成了。具体可参阅
作者:newki转载地址:https://juejin.cn/post/7098915987311263781对于整个Android开发来说,整体的开发架构离不开三化这个名词:模块化,组件化,插件化。下面一起来看看它们是如何一步一步演变成今天的模样。一. 模块化软件开发不管是哪一个方向,大家都知道高内聚,低耦合的思想。模块化也是每一门语言,各个方向的开发者都会处理的问题。在Android开发方向来说,模块化就是把常用的UI,网络请求,DB操作,第三方服务等公共的部分抽取封装成模块,方便复用。.
标题太难取了,其实本文主要就是讲如何控制文本大小,让其自动适配宽度,其次我们还需要精准控制Text的高度和宽度间距等属性。一般我们的布局都是分 match parent 和 wrap content 而他们的自动方式又有所不同。下面看看都有哪些方式来实现!官方推出的TextView的Autosizing方式,在宽度固定的情况下,可以设置最大文本Size和最小文本Size和每次缩放粒度,非常方便的就能实现该功能。autoSizeTextType:设置 TextView 是否支持自动改变文本大小,none
对于Android开发,干上几年后,都要进阶,或者直接转行了。如果你还在干Android,想要进阶 对Framework的了解是必不可少的过程,下面就开始进入今天的主题吧。我们知道,对于任何程序语言而言,入口一般都是main函数。那Android的程序入口在哪呢? 他的main函数是怎么启动起来的呢?可能熟悉Android的朋友,知道一个应用程序的入口在ActivityThread中,那有个问题,ActivityThread中的main函数是何时被谁被调用的呢?将从本文中找到以上答案,如果已经熟悉了此过程的
在Android屏幕的空间中,大部分的区域我们都是可以随意绘制,只有一部分区域是显示的固定内容:其中标题栏是可选的,除了Material风格的应用应用的并不多,页面内容就是android.R.id.content是Activity的主要内容。而我们主要需要讨论的就是 状态栏和导航栏,因为这两个区域在不同设备类型,不同的Android版本和不同的厂商下大小和效果是不同的,等等。这些差异无疑增加了我们做页面适配的复杂程度,也更容易出现兼容问题。在2017年下半年iPhone X的发布,引入了刘海屏设备,导致了
作者:少数派对有一定经验的 Android 玩家来说,在下载 App 这件事情上,Play 商店依然是那个值得排除万难、能上就上的选择,没有之一。坊间还流传着各种关于「Play 版」应用的传闻:Play 版应用有 FCM 推送、Play 版应用更省电、Play 版应用没广告、Play 版应用有更适合现代设备的 64 位版本……这种「Play 版更好」的说法究竟是科技圈的都市传说还是确有其事?为什么国产应用在 Play 商店中正变得越来越少了?今天这篇文章,我们从一个对普通用户而言可能会有点陌生的.
前言Gradle 作为官方主推的构建系统,目前已经深度应用于 Android 的多个技术体系中,例如组件化开发、产物构建、单元测试等。可见,要成为 Android 高级工程师 Gradle 是必须掌握的知识点。在这篇文章里,我将带你由浅入深建立 Gradle 的基本概念,涉及 Gradle 生命周期、Project、Task 等知识点,这些内容也是 Gradle 在面试八股文中容易遇见的问题。从这篇文章开始,我将带你全面掌握 Gradle 构建系统,系列文章:1、Gradle 基础2、Gradle
作者:搬砖小子出现了转载地址:https://juejin.cn/post/6989536876096913439Kotlin Flow 基本上可以替代RxJava,其提供了诸多操作符来处理数据。本篇文章为其分一下类,演示下基本用法。恩…建议大家看一眼右侧的滚动条,然后点击下收藏。弃用的方法就不罗列了。Ctrl + F 快速查找1前置资料冷流
1) Handler线程的消息通讯的桥梁,主要用来发送消息及处理消息。2) Thread普通线程,如果需要有自己的消息队列,需要调用Looper.prepare()创建Looper实例,调用loop()去循环消息。3) HandlerThread是一个带有Looper的线程,在HandleThread的run()方法中调用了Looper.prepare()创建了Looper实例,并调用Looper.loop()开启了Loop循环,循环从消息队列中获取消息并交由Handler处理。利用该线程的Looper创建
组件化作为Android客户端技术的一个重要分支,近年来一直是业界积极探索和实践的方向。每个大厂内部的各个Android开发团队也在尝试和实践不同的组件化方案,并且在组件化通信框架上也有很多高质量的产出。本文主要介绍我们的组件化方案,希望对从事Android组件化开发的朋友能有所启发。近年来,为什么这么多团队要进行组件化实践呢?组件化究竟能给我们的工程、代码带来什么好处?我们认为组件化能够带来两个最大的好处:1.提高组件复用性可能有些人会觉得,提高复用性很简单,直接把需要复用的代码做成Android Mod
在 Flutter 中,若我们需要自定义画一张图,则需要用到 ,不过 并不是本篇文章的重点,所以我就直接贴出 的相关代码,保证能够正常绘制即可。绘制的效果:其中,最核心的绘制在 的 中。我们可以看到,canvas 绘制图片有三种方式:他们都有一个核心共同点,那就是需要绘制的图片数据,但是这个 Image 并不是我们经常在 UI 效果上写的 ,而是 ,所以获取图片数据的方式就不太一样。在这里我封装了一个图片转换工具:支持转换网络图片、文件图片、Asset 中的图片,只需要传入图片路径和图片的类
作者:唐子玄链接:https://juejin.cn/post/7085037365101592612引子LiveData 是能感知生命周期的,可观察的,粘性的,数据持有者。LiveData 用于以“数据驱动”方式更新界面。换一种描述方式:LiveData 缓存了最新的数据并将其传递给正活跃的组件。关于数据驱动的详解可以点击我是怎么把业务代码越写越复杂的 | MVP - MVVM - Clean Architecture。https://juejin.cn/post/68449041762.
本文现实讨论一下Java虚拟机的理解 以及 类Java加载过程,引申出热修复与插件化实现的核心点,类加载技术,分析思路之后使用ClassLoader+反射实现了基本效果在编程的上古年代,程序员直接面对硬件编程,机器计算机只认识0和1,不同硬件的指令都是不同的,所以代码完全不能复用。在Java诞生之初 有一个非常著名的口号 “一次编写,到处运行” ,它是如何实现的呢?人类编写的高级语言Java如何转化为机器认识的01呢我理解的答案是:分层最初的层次:代码—机器Java出现之后的层次:Java—Java虚拟机—
在Android 行业摸爬滚打了十年左右的我,时不时会被公司要求去做面试官面试别人。在这段期间我也收到了不少的简历,面试了各种技术不一的人。许多候选人的工作年限都不少,基本都是在3~5年左右,但他们做的都是一些非常传统的项目,如果想通过简历直接判断一个人的能力是很难的,何况现在大环境越来越难做,大家找工作也越来越难。所以想知道一个人的真实实力,还是要通过面试才知道真实水平。只有通过沟通才会发现他们的真实技术能力,在通过他们的年限和技术能力进行定位,看是否对应他们应聘岗位的等级。面试时我打算聊点基础的,先打开
我们在掌握了如何读取状态值,并知道如何根据不同场景选择不同类型的Provider,以及如何对Provider进行搭配使用之后,再来了解一下它的一些其它特性,看看它们是如何帮助我们更好的进行状态管理的。所有的Provider都有一个内置的方法来为你的不同Provider添加额外的功能。它们可以为 ref 对象添加新的功能,或者稍微改变Provider的consume方式。Modifiers可以在所有Provider上使用,其语法类似于命名的构造函数。目前,有两个Modifiers可用。一个Provider可
给大家带来一些音视频的面试题,或者说是一些开发思路吧,不希望它成为以后你面试的八股文…这次主要是视频秒开方面。秒开是指用户点击播放到看到画面的时间非常短,在 1 秒之内。为什么需要秒开?目前主流的直播协议是 RTMP,HTTP-FLV 和 HLS,都是基于 TCP 的长连接。在播放的过程中,若播放端所处的网络环境在一个较佳的状态,此时播放会很流畅。若网络环境不是很稳定,经常会发生抖动,如果播放端没有特殊处理,可能会经常发生卡顿,严重的甚至会出现黑屏。而移动直播由于其便捷性,用户可以随时随地发起和
转载地址:https://mp.weixin.qq.com/s/jTEXk_58KxMUgOL33VOn4wJetpack Compose 1.0 正式版已经发布快一年的时间了,我们看到社区正以极大的热情采纳和使用 Compose: Kotlin 语法的简洁性以及使开发界面变得更快速、更简单的声明式开发方式得到了广大开发者们的赞赏。Compose 在社区中的反响我们看到许多公司已经在大规模采纳 Compose 为其应用开发最新、最具创造性的功能。例.
随着 App 的业务增加、版本迭代以及冗余的 “远古时期” 代码,App 代码变得臃肿增量叠加、开发者需要了解各个功能、单测功能编译时长、没有统一快速开发框架,代码复用性低,组件化开发就很有必要。组件化开发框架可以细化为不同的部分,包括 Android UI、网络请求、数据库持久化、图片处理、View、工具类、sdk、内部统一风格组件等;框架包括但不限于通用功能,如果是部门内部项目中通用的功能,也可以独立出来成为一个通用的库存在。① ARouter:基因中自带支持从webview中调用、不用互相注册(不用知
作者:me虽然现在已经有很多不错的换肤方案,但是这些方案或多或少都存在自己的问题。在这篇文章中,我将对 Android 现有的一些动态换肤方案进行梳理,对其底层实现原理进行分析,然后对开发一个新的换肤方案的可能性进行总结。1通过自定义 style 换肤1.1 方案的基本原理这种方案是我之前用得比较多的一种方案。我在使用的时候也做了很多的调整。开源版本可以参考 Colorful 这个库。https://github.com/garretyoder/Colorful它的实现方式是:用户提前自定.
1 Flutter 3.0给我们带来什么影响5月12日,Flutter 3.0 在 Google I/O 开发者大会正式亮相,随着 3.0 版本的发布,Flutter 开发框架终于可以支持六大平台,实现了其跨平台稳定运行的愿景。Flutter 3 现已来临如今,Flutter终于在开发方式上实现了大一统,所有的本地开发均可用Flutter完成,开发者可以通过一套代码库,来支持 iOS、Android、Web、Windows、macOS、Linux 六大平台软件的开发,真正做到一个代码,处处运行的愿
转载地址:https://www.jianshu.com/p/01658bbd7ffa最近在网上看许多面经的文章,有拿到Offer的,也有凉经,这些文章中都有一个共同的特点,就是单单的只有面试题目。而没有什么面试过程中需要注意的细节和面试心得。那些文章给自己做刷题参考还可以。正是这样导致有些人在面试前几天就狂刷那些题,没有去注重面试过程中需要那些细节,到了正式面试的时候就很紧张,怕面试官太严格问的问题打不上,怕与人沟通太紧张,怕自己技术不过关,没错, 这些问题都是我们比较害怕面试紧张的原因,我相信还有许
现在很多应用为了拉新,直接就获取你手机通讯录,查看当前联系人是否是我们的用户,如果不是我们的用户,就邀请他注册我们的应用。常规操作了,微信也这么干过。本文的重点是我们自己的应用如何获取联系人呢?这就涉及到跨进程交互。我们自己的App和系统的联系人App通信,读取联系人App的数据。AIDL! 哟,会抢答了。
1前言大约在去年11月份,Google将官方网站上推荐的MVVM架构悄悄替换成了MVI架构。参考了官方与许多前辈的分享,便有了此文。不过下面的再前言应当是每个读者心中所需要认定的。2再前言总览我所有的博客,我很少写关于架构模式相关的文章。因为我觉得不管是从刚开始所使用的MVP、MVVM再到现在Google官方所推荐的MVI架构,我希望各位读者千万不要将教条主义当真理。官方推荐了MVVM就马上去踩MVP,官方推荐了MVI就马上去踩MVVM,甚至使用MVVM的开发者会鄙视使用MVP的,使用MVI的开发
LiveData 相信大家都非常熟悉了,但是由于协程与 Flow 的不断发展,之前所使用的技术也正在不断被替代,而 LiveData 的功能与 StateFlow 很相似,所以,很多人都在考虑使用 StateFlow 去替代 LiveData。这里,我们就分析下,LiveData 与 StateFlow 的优缺点,以及我们该如何抉择。关于 LiveData 与 StateFlow,网上说的最多的区别,其实就是「官方指导文档」中所讲解的这两点,这里我直接搬运过来:关于第一点,对于 LiveData 与 Sta
转载地址:https://juejin.cn/post/7100121390090551332背景Invalidate() 是 Android 中 View 的方法,通常我们使用它来完成UI的刷新,作用如果这个 View 可见那么 onDraw() 方法将在未来某个时间点被调用。问题invalidate() 会触发那些 view 的重绘,invalidate() 绘制流程是如何实现的?我们带着问题来从源码开始分析:源码分析一、View 与 ViewGroup 的层级在 Android.
作者:郭霖转载地址:https://mp.weixin.qq.com/s/M8SAk_svSmAQ11nrnrcg1g掰手指数一数,我入职微软也已经有一年半的时间了。从入职以来,我一直在从事于开发Android版的Edge浏览器。这么长时间下来,我也慢慢从完全不知如何上手,提个PR都困难,到现在能够负责独立开发一个比较大的功能模块了。不得不说,Edge是我见过的最复杂的一个项目,我是真的很难想象一个浏览器工程可以庞大到如此地步。Chromium本身就已经是一个巨型工程了,而Edge又要在其基础之.
近两年,音视频技术展现了迅猛的发展势头,在短视频、直播、在线会议、教育等行业都有亮眼的应用案例,已经逐渐成为新时代互联网的基础设施之一,从而使得市场对于视频研发人才的需求越来越旺盛。最直观的感受就是直接通过各大招聘平台去了解相关的就业形势。就拿 Android 开发为例,现阶段做音视频开发的薪资水平,至少比同资历的 Android 开发高出 30% 左右。然而音视频技术上手门槛也很高,涉及的技术多,学起来并不容易:音视频的采集、编码、传输、解码、渲染…等等。而且Android 音视频开发这块目前的确没