- 博客(73)
- 收藏
- 关注
原创 Launcher3模块化-应用列表
本文介绍了将Launcher3中应用列表功能模块化的实现方案。通过分析Launcher3的代码结构,作者识别出7个核心类并进行独立剥离,重点解决了原有代码耦合度高的问题。
2025-06-07 11:54:03
719
原创 Launcher3体系化之路
摘要:本文探讨了车机Launcher开发面临的挑战与解决方案。车企对智能座舱桌面有特殊需求,如手车互联定制、音源切换、媒体卡片、Widget编辑和复杂应用列表等。
2025-06-01 22:09:31
541
原创 RxJava源码学习
个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1 RxJava使用RxJava是响应式数据流驱动框架,Retrokit提供了对RxJava的支持。1.1 接入在app module的build.gradle中添加依赖:implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"implementation "io.reactivex.rxjava2:rxjava:2.0..
2020-08-12 21:03:05
299
原创 Retrofit源码学习
个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1 基本使用@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_retrofit); new Thread(new Runnable() { @O.
2020-08-12 20:56:19
354
原创 Android jni知识点
个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1、创建jni环境https://developer.android.com/studio/projects/gradle-external-native-buildshttps://developer.android.com/training/articles/perf-jnihttps://www.jianshu.com/p/127adc130508https://www.jians.
2020-07-01 19:41:10
892
原创 Android项目总结5
个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1、项目需求项目整体的需求是Android盒子支持上下左右控制云台摄像头,还要能相对和绝对控制摄像头的位置。相对控制,意思就是按着左方向键不放,摄像头一直往左边转,到最大值为止,反之亦然;绝对控制,意思是每次按一下方向键,就转一个角度就停下来。2、需求实现最终选择通过定制Android kernel层的uvc代码,编译kernel,打包固件,刷机,编写上层App,从上到下打通控制流程。3、.
2020-07-01 19:40:21
619
1
原创 Android项目复盘4
个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格UVC协议文档网址:https://www.usb.org/documents?search=&type%5B0%5D=55&items_per_page=50主要下载USB Video Class 1_5,关注下载zip包中的UVC 1.5 Class specification.pdf文件,里面有接口相关的解释。Android盒子控制摄像头项目已经差不多4年了,很多知识点.
2020-07-01 19:39:24
355
原创 Android项目复盘3
个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格3、健康数据记录项目这个项目遇到的主要问题是应用使用时长和使用次数不准确的问题。原因要从应用的业务逻辑以及源码中去查找。一般我们获取应用使用数据详情的方法是:@TargetApi(Build.VERSION_CODES.LOLLIPOP)private ArrayList<AppLaunchInfoBean> getAppLaunchInfoBean(long start, l.
2020-06-16 11:10:14
344
原创 Android项目复盘2
个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格2、系统数据检查2.1 dex更新我们开发的java代码通过编译生成.class文件,然后通过dx工具生成机器可以识别的dex文件。Android中采用ClassLoader加载dex文件,加载完成之后可以通过反射调用其中的方法,适合那些不依赖文件等资源的业务,而打点恰好比较适合使用dex加载的方式。Android中有PathClassLoader和DexClassLoader ,他们都继.
2020-06-16 11:09:21
234
原创 Android项目复盘1
个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1、商城项目1.1 RecyclerView首页加载商品item内存占用过高原因:首页包含了精选,banner,秒杀,热卖列表,但是每一个ViewType没有在RecyclerView中设置各自的类型,导致缓存的时候当做一整ViewHolder缓存,从而整体内存占用过高。尤其底部的热卖列表上拉加载的时候,显得尤为显著。1.1.1 源码追溯RecyclerView.Recycler.
2020-06-16 11:07:37
364
原创 Android RecyclerView源码学习
文章篇幅较长,文末有总结和流程图。个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1、用法一个比较简单的用法如下:class AndroidDeepLearnActivity : Activity() { lateinit var dlRecyclerView: RecyclerView lateinit var context: Context## 4、总结 private val images = ar.
2020-06-03 21:00:29
368
原创 flutter InheritedWidget机制
微信公众号:Android部落格,文末有二维码个人网站:chengang.plus1、用法用法示例:class InheritedData extends InheritedWidget { final String data; InheritedData({ this.data, Widget child, }) : super(child: child); static InheritedData of(BuildContext context) { .
2020-05-19 17:44:46
873
原创 flutter setState机制
微信公众号:Android部落格,文末有二维码个人网站:chengang.plus1、定义setState方法只能定义在State类中,执行这个方法之后,能够更新State限定的StatefulWidget及其子Widget树。在StatefulWidget执行createElement方法创建StatefulElement对象的时候,会回调到StatefulWidget的createState方法,也就回到了我们自定义Widget继承StatefulWidget的createState方法,从.
2020-05-19 17:43:40
1232
原创 创建个人网站
微信公众号:Android部落格个人网站:chengang.plus1、方案采用Github Pages + Jekyll的方式。2、安装Jekyll环境2.1 安装Ruby因为网络的原因,Ruby installer安装文件难得下载,下载网址是:https://rubyinstaller.org/downloads/或https://github.com/oneclick/rubyinstaller2/releases2.2 下载RubyGems下载地址是:https://rubyg.
2020-05-15 19:34:13
1370
原创 flutter通信机制-EventChannel
微信公众号:Android部落格个人网站:https://chengang.plus/流程图如下:1、使用方式当原生平台需要向dart发送消息时,需要用到EventChannel。1.1 Android端注册Android平台的注册方式:class MainActivity : FlutterActivity(){ val DATA_RESULT_CHANNEL = "com.yourname.yourname/typeData" override fun on.
2020-05-15 17:09:52
4059
原创 flutter通信机制-MethodChannel
微信公众号:Android部落格流程图如下:1、发送和接收1.1 flutter端发送消息方式是:class InteractUtil { static const platform = const MethodChannel("com.yourname.yourname/method"); factory InteractUtil() => _getInstance(); static InteractUtil get instance .
2020-05-09 19:21:44
7601
1
原创 flutter 绘制过程 系列3-绘制渲染
文章将同步到微信公众号:Android部落格流程图如下:1、预热帧1.1 scheduleWarmUpFramerunApp调用的最后一个方法是scheduleWarmUpFrame,从这里开始渲染之前遍历的widget。packages\flutter\lib\src\scheduler\binding.dart\ScheduleBindingvoid scheduleWa...
2020-05-07 17:42:07
677
原创 flutter 绘制过程 系列2-布局
文章将同步到微信公众号:Android部落格流程图如下:1、处理RootWidget1.1 scheduleAttachRootWidget回到runApp方法:packages\flutter\lib\src\widgets\binding.dartvoid runApp(Widget app) { WidgetsFlutterBinding.ensureInitial...
2020-05-07 17:39:34
786
原创 flutter 绘制过程 系列1-Binding
1、WidgetStatelessWidget和StatefulWidget都继承自Widget。Widget作为虚类,定义了Element createElement()方法,给继承者实现,返回Element对象。具体到StatelessWidget,实现createElement,返回StatelessElement对象。StatelessElement继承自ComponentEleme...
2020-04-30 16:30:50
1024
原创 iOS GridView表格视图
微信公众号:Android部落格一、背景电商类应用会有一个九宫格展示分类下的详细信息,如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHjM9OTf-1588140300104)(https://ftp.bmp.ovh/imgs/2020/04/cd5af6bad847d36a.jpg)]基于九宫格的需求,需要有一个九宫格类的View,当超过一页的...
2020-04-29 14:05:34
902
原创 iOS banner轮播
一、背景电商App一般都会存在图片轮播的场景,而iOS没有轮播UI组件,因此需要自定义一个UI组件以适应项目需要。二、框架整体框架是UIScrollView作为父视图,在视图中添加多个子视图,同时设置好子视图的frame,再设置滚动视图的内容宽度,让UISCrollView能够左右滑动。接下来添加一个定时器,按照设定的播放时间间隔重复触发,循环播放子UIView即可。三、定义属性将对外暴...
2020-04-27 20:16:21
1378
原创 flutter基础集锦
View篇有几种视图框架总体来说有两种,Column和Row,前者表示竖直方向,后者表示水平方向。怎么实现类似wrap_content和match_parent的效果Widget parent = Container( width: 360, height: 360, color: Colors.lightGreen, child: Column( mainAxis...
2020-04-09 15:36:37
772
原创 Flutter系统启动过程分析
启动过程分析原图地址是:https://ftp.bmp.ovh/imgs/2020/04/f92a2d6c47bcf3f6.jpg1、 初始化一般的,都有一个入口Activity,这个Activity继承自FlutterActivity。从入口Activity的oncreate方法开始分析,首先调用FlutterMain.startInitialization(this),如果我们自定义...
2020-04-09 15:26:13
1278
原创 Flutter-banner轮播
文章将同步更新到微信公众号:Android部落格问题背景因为最近做商城App,需要用到轮播,发现flutter的控件库里面没有这个控件(当然了,可能是我自己没有找到),于是就决定自己动手做一个banner轮播图片了。框架整体框架就是一个PageView,Indicator指示器,一个定时器。PageView用来展示需要播放的Widget,此处不一定必须限定死要展示Image....
2019-10-25 20:19:18
409
原创 Android-Fresco系列9 图片展示与释放
文章将会被同步至微信公众号:Android部落格先看流程图:一、回到起点起点是AbstractProducerToDataSourceAdapter,因为ImagePipeline的submitFetchRequest最终调用了CloseableProducerToDataSourceAdapter.create方法,发起了整个请求图片到解码图片的流程,而CloseableProduc...
2019-06-10 18:32:33
831
原创 Android-Fresco系列8 读缓存数据
文章将会被同步至微信公众号:Android部落格看流程图:一、读取解码内存缓存1. BitmapMemoryCacheProducer之前加载图片资源的时候有说到过,从缓存取数据,讲的是从内存取,在AbstractDraweeController的submitRequest方法中,先从缓存取数据,getCachedImage方法://PipelineDraweeController...
2019-06-10 16:05:26
510
原创 Android-Fresco系列7 解码数据内存缓存
文章将会被同步至微信公众号:Android部落格一、BitmapMemoryCacheProducer从第三篇文章中可以看到Producer的初始化顺序是BitmapMemoryCacheProducer->DecodeProducer,由此看到解码成功的图片还要经过内存缓存,等于是说光内存缓存就有两份,一份编码的,一份解码的。这边文章讲解码之后的数据缓存。经过DecodePro...
2019-06-10 15:21:17
489
原创 Android-Fresco系列6 图片解码
文章将会被同步至微信公众号:Android部落格先看看流程图:一、MultiplexProducer从EncodedMemoryCacheProducer传递来的数据,来到了 MultiplexProducer.ForwardingConsumer中。1) 初始化回去看看producer初始化的地方看看其中初始化顺序:EncodedCacheKeyMultiplexProduce...
2019-06-06 19:24:58
1059
4
原创 Android-Fresco系列5 编码数据内存缓存
文章将会被同步至微信公众号:Android部落格流程图如下:一、EncodedMemoryCacheProducer1) 数据来源从返回的数据流读取数据网络请求返回InputStream,按照常规思维,从这个stream里面读取数据到byte[]再保存就行了,但是sdk里面的处理更好。在NetworkFetchProducer中有数据返回之后,开始新建一个返回数据大小的输出数...
2019-06-06 15:49:30
590
原创 Android-Fresco系列4 磁盘缓存
文章将会被同步至微信公众号:Android部落格先看流程图:一、DiskCacheWriteProducer从NetworkFetchProducer传递过来的数据是EncodedImage类型,里面的未解码数据是CloseableReference类型。1) produceResults定义了一个DiskCacheWriteConsumer用于消费接收到的消息。//DiskCa...
2019-06-06 09:45:39
708
原创 Android-Fresco系列3 Producer
文章将会被同步至微信公众号:Android部落格先看流程图:一、发起请求记得在AbstractDraweeController的submitRequest方法中先获取一个DataSource对象(getDataSource()),然后定义了一个DataSubscriber对象,是以内部类的方式初始化的,最后调用mDataSource.subscribe().1) Controller...
2019-06-06 09:43:56
578
原创 Android-Fresco系列2 加载资源
文章将会被同步至微信公众号:Android部落格流程图如下:一、SimpleDraweeView加载图片val draweeView = findViewById<SimpleDraweeView>(R.id.my_image_view)draweeView.setImageURI("http://ww1.sinaimg.cn/large/610dc034ly1fjaxh...
2019-06-04 20:37:32
491
原创 Android-Fresco系列1 初始化
文章将会被同步至微信公众号:Android部落格先看流程图:一、开始使用在工程的app目录下的build.gradle添加引用:implementation 'com.facebook.fresco:fresco:1.12.0'Application类中的onCreate方法中添加初始化:Fresco.initialize(this)layout xml文件中添加...
2019-06-04 17:58:17
577
原创 Flutter-界面之间跳转
参考:https://flutter.io/docs/cookbook/navigation/navigation-basics一、概述Flutter中通过Navigator实现在两个界面之间跳转,分别是push和pop方法。直接上示例:import 'package:flutter/material.dart';void main() { runApp(MaterialApp...
2019-06-03 16:40:07
2391
转载 Flutter-动画
参考:https://flutter.io/docs/development/ui/animations一、动画类型动画分为两类:基于tween或基于物理的。1)补间(Tween)动画“介于两者之间”的简称。在补间动画中,定义了开始点和结束点、时间线以及定义转换时间和速度的曲线。然后由框架计算如何从开始点过渡到结束点。2)基于物理的动画在基于物理的动画中,运动被模拟为与真实...
2019-06-03 16:35:00
552
原创 Flutter-数据处理
文章将会被同步至微信公众号:Android部落格文章参考:https://flutterchina.club/json/更多信息可以参考flutter官方教程:https://flutter.dev/docs/cookbook一、文件IOPathProvider 插件提供了一种平台透明的方式来访问设备文件系统上的常用位置。该类当前支持访问两个文件系统位置:临时目录: 系统可随时清除...
2019-05-23 11:45:16
863
原创 Flutter-网络
文章将会被同步至微信公众号:Android部落格文章参考:https://flutterchina.club/networking/文章参考:https://flutter.dev/docs/cookbook/networking/fetch-data一、flutter中网络请求使用http库在pubspec.yaml中添加配置:dependencies:http: ^0.12.0...
2019-05-23 11:25:58
414
原创 Android OKHttp系列7-HttpURLConnection
文章将会被同步至微信公众号:Android部落格Android Http请求一个典型的请求方式是:private fun getContent(url: String): String? { var connection: HttpURLConnection? = null var info: String? = null try { connec...
2019-05-23 11:09:19
584
原创 Android OKHttp系列6-CallServerInterceptor
文章将会被同步至微信公众号:Android部落格概述开始写入request body数据,并读取服务端返回的数据上一篇文章说到有两个Http协议兼容处理请求,因此有两个流程图,基本是相似的处理流程:Http1CodecHttp2Codec1、Http1Codec(1)写请求头@Override public void writeRequestHeaders(Re...
2019-05-20 19:33:54
383
翻译 Flutter-国际化
可以参考flutter中文社区的做法:https://flutterchina.club/tutorials/internationalization/本文参考,但有自己的修改:https://www.didierboelens.com/2018/04/internationalization---make-an-flutter-application-multi-lingual/国际化还...
2019-05-17 18:07:24
345
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人