- 博客(283)
- 收藏
- 关注
原创 Kotlin的隐藏和封装
封装是面向对象的三大特征之一(另外两个特征是继承和多态)。封装是面向对象编程语言对客观世界的模拟。对一个类或对象实现良好的封装,可以实现以下目的:隐藏类的实现细节; 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。 可进行数据检查,从而有利于保证对象信息的完整性。 便于修改,提高代码的可维护性。为了实现良好的封装,需要从两个方面考虑...
2019-11-12 10:50:39 1176
原创 Android之Activity全方位解析
一、Activity的生命周期1、典型的生命周期在这张图中,总共7种状态:onCreate()与onDestroy()对应,存在状态onStart()与onStop()对应,可见状态onResume()与onPause()对应,前台状态,即可以进行点击操作等而对于onRestart(),其执行具体过程:onStop() -> onRestart() -> o...
2019-11-11 09:46:52 790
原创 做一个电商直播App,跟上这波双十一
又快到一年一度的双十一了。淘宝直播一姐曾在去年双十一,一个人卖出了3.3亿的销售额,创造了行业的销售神话。近两年,很多电商平台开始关注起直播互动电商,希望在直播中,也可以增加互动,例如在直播过程中,抛出限量优惠商品,实时发送抢购的消息给观众。于是我们做了一个简单的Demo。Demo大致的整体想法如下:以视频直播为主的互动模型基础上,结合语音转写功能进行设计,为主播摆脱Windows端繁琐操作,...
2019-11-09 11:07:28 986
原创 Android开发四年面试相关知识整理
Android 在 Android 9(Pie)[android:targetSdkVersion = 28]之后将网络通信默认配置为禁止了明文传输。所谓明文传输就是Http请求,所以如果我们开发版本高于 28 ,打包之后我们 app 中的 Http 请求都无法成功,将会抛出W/System.err: java.net.UnknownServiceException: CLEARTEXT c...
2019-11-08 10:47:03 734
原创 Android面试Service篇
Service是面试中经常问到的一个模块,从之前的简单使用,到后期的应用保活,当然现在Android系统对这种保活机制进行了优化和限制,我们先简单了解下Service的特性。接下来的文章主要以一问一答的方式进行介绍Service的特性,必要部分也会分析到Service的源码逻辑首先啥是Service?虽然大家都知道啥是Service,但是我也得甩个定义。 Service是Androi...
2019-11-07 09:57:34 842
原创 谈一谈Android Flutter混合开发问题
之前介绍过一些Android Flutter混合开发的注意点以及一些基本知识, 接下来介绍一下实际开发过程中,目前一定会遇到的两个坑。在Flutter开发过程中,如果是以module的形式进行依赖,是无法进行android原生部分的调试的,无法进行attach debug to android process操作; 为了解决这一问题,我们需要考虑使用aar的方式,以library的形式进行...
2019-11-06 10:23:52 877
原创 Android项目配置系统签名
简述公司开发一款产品,需要在应用内打开谷歌浏览器,并向浏览器网页中编辑框提交文本并执行回车事件,这时候我们想到了Instrumentation。Instrumentation接口原本是用来对软件进行测试而留出来的,但是可以模拟按键,前提是应用处于前台,当应用处于后台时,会提示Injecting to another application requires INJECT_EVENTS...
2019-11-04 14:29:34 474
原创 APP定位过于频繁,我用反射+动态代理揪出元凶
背景定位现在是很多APP最基本也不可或缺的能力之一,尤其是对打车、外卖之类的应用来说。但对定位的调用可不能没有节制,稍有不慎可能导致设备耗电过快,最终导致用户卸载应用。笔者所在项目是一个在后台运行的APP,且需要时不时在后台获取一下当前位置,再加上项目里会引入很多合作第三方的库,这些库内部同样也会有调用定位的行为,因此经常会收到测试的反馈说我们的应用由于定位过于频繁导致耗电过快。排查这...
2019-11-02 20:14:26 815
原创 Hook技术之hookActivity(android 9.0)
1.前言本文大部分内容来自于《android进阶解密》这本书,不同的是书中实现的是android9.0之前的hook,在android9.0中,activity的启动过程会有些不同,因此本文主要是讲解9.0的hook.2.activiy启动流程的不同之处1.简要分析不同之处在android9.0中,采用handler机制启动activity时,消息标识变为了EXECUTE_TRAN...
2019-11-01 11:23:31 1590 1
原创 面对Flutter,我终于迈出了第一步
哎,Flutter真香啊早在一年前想学习下flutter,但当时对于它布局中地狱式的嵌套有点望而生畏,心想为什么嵌套这么复杂,就没有xml布局方式吗,用jsx方式也行啊,为什么要用dart而不用javascript,走开,劳资不学了。然而,随着今年google io大会flutter新版本发布,大势宣扬。我又开始从头学习flutter了:用完flutter的感受是,一旦接受这种嵌套布局后...
2019-10-31 10:48:03 369
原创 Kotlin 在Android开发中那些让人舒适的地方
前言目前公司的项目已经全面使用Kotlin,转换的过程的确不是怎么让人舒适,但是让人欣慰的是结局是让人满意的。Kotlin的确可以让代码简洁,安全并且高效。这里分享一下,在使用Kotlin中那些让人觉得舒适的地方。字符模板 空安全 延迟加载 方便易读的循环 强大易用的迭代器 默认参数 DataClass 简短而强大的标准函数库 通吃的when(结合密封类会让代码更舒适) ...
2019-10-30 10:01:15 207
原创 flutter - 图文讲解表单组件基本使用 & 注册实战
图文讲解表单组件,创建表单组件、校验表单、复杂表单、复杂校验规则、动态控制表单实现一个注册界面创建表单组件创建form组件Form组件函数(准确说叫widget),然后写一个key,因为我们等下要操作它,然后写child,里面就是TextFormField组件。new Form( key: _formKey, child: Column(children...
2019-10-29 11:02:54 719
原创 Android 基础知识:四大组件之 Service详解
可以在后台执行长时间运行操作而没有用户界面的应用组件 Service 分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和 Service 的交互。 对于同一 app 来说,默认情况下 Service 和 Activity 是在同一个线程中的,main Thread (UI Thread)。一、启动过程同样 建议结合源码去看,...
2019-10-28 10:45:48 380
原创 Android如何加载大图,防止OOM
Android加载大图,防止OOM本文是根据Android开发文档写的,其中多次提到了堆内存,不太了解的同学可以先预习下JVM的内存模型,再来食用本文。什么是OOMOutOfMemory(内存泄漏),当Java虚拟机由于内存不足而无法分配对象,并且垃圾回收器无法再提供更多内存时,抛出异常OutOfMemoryError。为什么我们的移动设备加载大图需要处理在网络上有着许许多多的...
2019-10-27 20:27:37 448
原创 Handler消息机制源码全量解析
Android版本: 基于API源码26,Android版本8.0。本片文章的目的在于全面的了解Handler。它是如何传递消息的?是如何阻塞和唤醒线程的(仅限于Java层面)?MessageQueue到底是怎么存储和取出Message?延迟消息是怎么被发送的?一 、Handler定义:Handler是一套消息传递的机制。设计用来让工作线程跟主线程之间进行消息传递。同时也解决了多线程同...
2019-10-25 11:02:48 265
原创 1024程序员节:致敬最可爱的人和有温度的代码
今天是1024程序员节。这个节日诞生后的短短几年,程序员已经变成了网络上段子最多的群体之一。但是我却越来越深刻地感觉到,如果要问谁是这个时代最可爱的人,那一定是我们的程序员。也许有人觉得不以为然:你说的就是那些“码农”吗?他们看起来是那么木讷、邋遢、古怪,穿土气的格子衫,除了加班就是宅在家打游戏,找不到女朋友,年纪轻轻就开始秃顶...他们的工作既不崇高也不时尚,每天像机器一样,写着...
2019-10-24 13:50:58 697 1
原创 Android进程间通信的方式之AIDL
一、AIDL是什么它全称是Android Interface Definition Language,即Android接口定义语言,为了使其他的进程也可以访问本进程提供的服务,Android使用AIDL来公开服务的接口,它里面定义了本进程可以为其他进程提供什么服务,即定义了一些方法,其他进程就可以通过RPC(远程调用)来调用这些方法,从而获得服务,其中提供服务的进程称为服务端,获取服务的进程称...
2019-10-23 10:41:15 435
原创 Android Binder原理:学习Binder前必须要了解的知识点!
前言Binder原理是掌握系统底层原理的基石,也是进阶高级工程师的必备知识点,这篇文章不会过多介绍Binder原理,而是讲解学习Binder前需要的掌握的知识点。1.Linux和Android的IPC机制种类IPC全名为inter-Process Communication,含义为进程间通信,是指两个进程之间进行数据交换的过程。在Android和Linux中都有各自的IPC机制,这里分...
2019-10-22 11:14:49 440 2
原创 腾讯Android社招面试源码相关,对不起还是问到三次握手.四次握手了
一、如何优化自定义View在要在onDraw或是onLayout()中去创建对象,因为onDraw()方法可能会被频繁调用,可以在view的构造函数中进行创建对象; 降低view的刷新频率,尽可能减少不必要的调用invalidate()方法。或是调用带四种参数不同类型的invalidate(),而不是调用无参的方法。无参变量需要刷新整个view,而带参数的方法只需刷新指定部分的view。在...
2019-10-22 11:00:57 337
原创 Android-kotlin-coroutine协程的概念
一. 进程,线程,协程 概念进程与线程进程是资源分配的最小单位,线程是程序执行的最小单位。 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。为了加大一个应用可使用的内存通过多...
2019-10-22 10:55:18 382
原创 Android:6种方式让你高效 & 正确地获取View的坐标位置。快来看看!
前言获取View坐标在Android开发中非常常见。今天carson将详细给大家讲解 获取View坐标常用6种方式:getLeft()、getTop()、getRight()、getBottom() getX()、getY()、getRawX()、getRawY() getLocationOnScreen() getLocationInWindow() getGloba...
2019-10-22 10:35:48 1095
原创 技术面试官的疑问,程序员是不会做呢?还是不知道该怎么做
前言:曾经做技术面试官的时候,面试对象大多数是初级开发和高级开发,偶尔也会面试架构师。我发现,IT人的工资固然和相关技术的使用年限挂钩,但其技能无法跨越到更高层次的话,他们的收入也就会停留在当前级别,技术不行工作再久,工资也涨不了。比如,我就面试过不少工作了5,6年的程序员,他们的技能也就停留在增删改查阶段,那么只能领到初级程序员的工资。更可悲的时,在面试过程中我发现他们甚...
2019-10-21 11:42:31 234
原创 屏幕适配:修改屏幕像素密度,随便设dp
前提平时xml中view的宽高单位都是dp居多,我们的设计师一般会选择一款机型的屏幕尺寸作为设计的目标尺寸。那么,如何根据目标尺寸的屏幕密度,适配我们种类繁多的机型?实现目标将以dp作为单位,以目标尺寸标注的宽高,和当前机型的比例,动态进行屏幕适配。例如:设计尺寸为360dp宽,我们的view设置180dp宽。那么,该view在任何屏幕尺寸下,都将占用屏幕一半的尺寸;了解参数...
2019-10-21 11:24:30 1189
原创 Android | 代码混淆到底做了什么?
前言代码混淆对于每个入门的 Android 工程师来说都不会太陌生,因为在编译正式版本时,这是一个必不可少的过程。而且使用代码混淆也相当简单,简单到只需要配置一句minifyEnabled true。但是你是否理解混淆的原理,如果问你代码混淆到底做了什么,你会怎么说?1、混淆编译器如果以混淆编译器来划分的话,Android 代码混淆可以分为以下两个时期:ProGua...
2019-10-21 11:10:22 771 1
原创 一篇关于 Android 获取运营商的全面笔记
内容总览本文会给出在 Android 上获取运营商的方法,几个相近方法结果的差异,以及在多卡情况下有效的获取方式。最后额外提一下一种不需要请求设备识别码获取运营商信息的方法。提供可运行的 demo 源码。MCC 和 MNC首先介绍一下这两个码,也是获取运营商所必须的。MCC,Mobile Country Code,移动设备国家代码。MNC,Mobile Network Code,移...
2019-10-21 10:45:45 441
原创 图解算法:单链表两两反转 | 眼睛会了手就会系列
一. 序链表作为一种基本的数据结构,本身理解起来,很简单。它通过指针或者叫引用,将一组零散的内存空间(结点),串联起来组成一个数据存储结构。链表根据其指针的指向和丰富程度,可以分为单链表、双向链表、循环链表、双向循环链表。其差别就是,是否在单链表的基础上为结点,增加更丰富的指针,让其实现更丰富的功能。链表虽然很好理解,但是链表的代码,写起来却并不是那么容易,尤其上一些对单链表...
2019-10-18 14:10:13 174
原创 Android音视频开发;斗鱼直播实现
一、直播的本质实时推送/拉取音视频数据二、视频直播流程视频直播的流程可以分为如下几步:(1)采集(2)处理(3)编码和封装(4)推流到服务器(5)服务器流分发(6)播放器流播放1、采集视频的采集涉及两方面数据的采集:音频采集和图像采集,它们分别对应两种完全不同的输入源和数据格式。(1)两个传感器:CCD:图像传感器,用于图像采...
2019-10-18 11:51:04 1258
原创 AspectJ AOP教程:实现Android基于注解无侵入埋点、性能监控
AOP(Aspect-Oriented Programming),即是面向切面编程,AspectJ是实现AOP的一个重要的框架,它是使用AspectJ编译器(ajc),在编译时期,在关键的的地方插入部分代码,处理相关逻辑,比如可以用于打印方法执行的效率,权限检查等。在Android上的应用主要是做性能监控、基于注解的数据埋点等,Hugo 就是基于AspectJ实现。教程修改项目根目录的 b...
2019-10-18 11:33:10 592
原创 Android项目组件化/模块化,用LiveData打造属于你组件通信框架EventBus
预备知识Android 基础知识 LiveData的基本定义和用法 开源消息框架EventBus的基本了解看完本文能够学到什么Android项目组件化/模块化 组件通信框架Router/EventBus的探究 用LiveData来实现EventBus一、Android项目组件化/模块化开发Android项目之初,项目业务比较单一,采用单Project的形式存在,随着业务线越...
2019-10-18 11:23:54 871 2
原创 Flutter——实现闪烁效果
我们在加载列表的时候,数据没请求下来之前,一般会有个加载对话框的交互,也有闪烁骨架屏交互,下面我们在flutter中实现闪烁骨架屏的交互。1、添加依赖shimmer: ^1.0.02、获取依赖包flutter pub get3、导入需要使用的文件中import 'package:shimmer/shimmer.dart';4、使用class MyShi...
2019-10-17 17:30:57 3551 1
原创 Android 使用ARouter 实现登录拦截
引言App都是由大量的页面构成,部分页面用户可以以游客身份进行浏览,但是还有部分页面大都需要用户登录后才可以浏览。这时候就需要判断当前用户是否登录,如果用户未登录,则需要先登录;如果用户已经登录,则可以直接跳转。类似实现方式如下: if(LoginUtils.getInstance().isLogin()){ startActivity(new Intent(con...
2019-10-17 17:04:48 1946
原创 互联网首发 | 闲鱼程序员公开多年 Flutter 实践经验
简介flutter-boot核心解决了混合开发模式下的两个问题:flutter混合开发的工程化设计和混合栈。那flutter-boot是如何解决的呢?首先在工程化设计的问题上,flutter-boot建立了一套标准的工程创建流程和友好的交互命令,当流程执行完成后,即拥有了混合开发的标准工程结构,这一套工程结构能够帮助我们同时拥有flutter和native(原生)两种开发视角,本地flut...
2019-10-17 16:48:57 199
原创 Android入门知识:各种布局管理器的常见参数
先说一下一些可能通用的参数android:layout_width & android:layout_height:布局的宽和高,一般不用改,参数选 match_parent 就行android:background:布局的背景android:paddingBottom&android:paddingRight&android:paddingLeft&a...
2019-10-17 16:30:33 273
原创 Android进阶之Bitmap的高效加载
一、Bitmap的加载BitmapFactory提供了四个方法:docodeFiles decodeResource decodeStream decodeByteArray二、Bitmap的高效加载采用Bitmap.Options来加载所需尺寸的图片,主要使用它的inSampleSize参数,当inSampleSize大于1缩放。(inSampleSize会向下去2的指数)...
2019-10-16 21:01:00 250
原创 事件分发:事件的传递和传递路径
事件传递方向activity -> viewGroup -> view事件的传递入口事件触发 -> 硬件 -> Native -> 通过JNI ->Activity.dispatchTouchEvent() ->PhoneWindow.superDispatchTouchEvent() -> DecorView.superD...
2019-10-16 19:32:52 240
原创 Flutter 混合栈复用原理
本文将以 Android 视角,来扒一扒 Flutter 混合栈的前世今生。其实也就是从 1.0 正式发布到现在 1.9 版本的一些变更。本文将会从以下几个方面来分析:什么是 Flutter 混合栈 为什么会产生问题 处理混合栈的相关框架 官方的处理方案一、什么是混合栈一个新的技术的兴起,必然是一步一步向前的,Flutter 在成熟的 Android、iOS 的大环境下的生存,...
2019-10-16 16:50:07 395
原创 Android屏幕适配 重点盘点
引子屏幕适配是 android开发/面试绕不开的一个问题。本文 将屏幕适配的知识要点完整展现给各位读者。正文大纲android需要做屏幕适配的原因 基础知识点(很重要) 屏幕适配攻略正文android需要做屏幕适配的原因关键字:android碎片化android面世以来,google开源了android系统,各家厂商各自为政,导致屏幕尺寸没有统一标准,屏幕的...
2019-10-15 22:34:59 276 1
原创 Git新手教程-向仓库中添加commit
前言在该篇文章中,我们终于要来学习如何创建自己的提交(commit),在前面的文章中,我们已经学会使用 git init 命令来创建新仓库,使用 git clone 命令来复制现有仓库,使用 git log 命令来查看现有的提交。以及使用非常重要的 git status 命令来查看仓库的状态。本篇文章会在这些知识的基础上添加 git add 、 git commit 和 git diff 。 ...
2019-10-15 21:01:16 794
原创 Flutter适配深色模式(DarkMode)
前言也不知道写点什么,本来想写写Flutter的集成测试。因为前一阵子给flutter_deer写了一套,不过感觉也没啥内容,写不了几句话就放弃了。(其实本篇内容也不多。。。)那就写写最近在做的事情。没错,就是文章标题提到的适配深色模式(DarkMode),也可以说是实现夜间模式的功能。相信许多iOS的同学最近都比较关注,毕竟iOS 13上个月推送更新了。说适配的原因是因为在iO...
2019-10-15 20:05:17 687
原创 Flutter开始干系列-一个完整的登录实践
一、插件简介connectivity用于发现网络连接并进行相应配置。它可以区分蜂窝连接和WiFi连接,iOS和Android适用。注意 在Android上,这不保证可以连接到Internetshared_preferences包装NSUserDefaults(在iOS上)和SharedPreferences(在Android上),为简单数据提供持久存储。Diodio是一...
2019-10-15 17:30:46 974
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人