Android
文章平均质量分 90
JohanMan
这个作者很懒,什么都没留下…
展开
-
Glide源码解读之绑定生命周期
今天有空,稍微解读了一下glide加载图片框架源码,glide源码比较多,除了弄清楚主流程,对我编程有帮助的,我都会记录下来。我这里不会一步一步详细解读源码,因为其他博客一大堆,我这里主要讲解一下原理;绑定生命周期,不用我们自己在onStart,onStop去调用,这种思想很好,所以,值得借鉴。主要实现原理是创建一个无UI的Fragment添加(绑定)到当前的Activity(或其他Fragment),通过重写Fragment的onStart和onStop方法,通知RequestManager任务改变原创 2020-12-03 15:42:14 · 234 阅读 · 1 评论 -
PS 一键生成Android各个尺寸的图标
之前的项目都是用一套尺寸的图标做适配,优点就是减少APP的大小,还不用做多套适配图标,缺点就是每次加载图标都要做缩放,影响APP的性能。公司最近终于招到UI了,发现他的PS工具可以一键生成Android和iOS各种尺寸图标。最近新建一个项目,打算尝试自己生成Android各种尺寸图标。工具PS脚本这个PS脚本是我参照别人写的,直接共享出来:// 获取当前的文档var pngDoc = activeDocument;// 弹出对话框,提示输入文件名var destName = prom.原创 2020-06-29 11:29:46 · 1827 阅读 · 0 评论 -
Android 网络编程 - HTTP协议
HTTP(Hyper Text Transfer Protocol,超文本传输协议)协议是基于TCP/IP通信协议来传递数据,属于应用层的面向对象的协议。特点支持C/S和B/S模式。 灵活:HTTP允许传输任意类型的数据对象,传输的类型由Content-Type加以标记。无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节原创 2017-07-26 16:32:36 · 384 阅读 · 0 评论 -
Android Data Binding 配合BaseAdapter
Android 多多少少都会有 ListView,一般都写适配器 BaseAdapter,为了复用 Item 的 View,我们都会定义 ViewHolder 来保存 View。现在,我们用 Data Binding 来代替 ViewHolder。还是例子演示。定义主布局文件<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="h原创 2017-12-05 15:14:52 · 1196 阅读 · 0 评论 -
Android 使用ActivityOptions实现Activity转场动画
之前一直都是用这种方式实现Activity的转场动画:// MainActivityoverridePendingTransition(enterAnim, exitAnim);从Android5.0之后,Google提供了一种新的方式来实现:ActivityOptions。前提在使用前,需要声明允许使用ActivityOptions。 在styles.xml文件,设置App主题时,添加andr原创 2017-08-07 16:28:36 · 12772 阅读 · 0 评论 -
Android App字体不受系统字体大小影响
由于公司的App面向的用户有小部分人是“大叔”级别的,他们喜欢把系统字体设置得很大,为了App字体不受系统字体大小影响,于是在网上搜了一下,大概有2中解决办法。更新App的配置简单的来说,就是重写我们BaseActivity的getResources方法@Overridepublic void onConfigurationChanged(Configuration newConfi原创 2018-01-21 10:37:34 · 4248 阅读 · 0 评论 -
Android 检测UI卡顿问题
最近公司接到一些用户反馈说,App卡顿了,甚至App无响应,我们称其为ANR。先来说说ANR。ANRANR,即 Application Not Responding,应用程序无响应。Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。出现ANR的场景有一下几种:输入事件(包括按键分发事件)5秒内没有处理原创 2018-01-17 16:02:40 · 1037 阅读 · 0 评论 -
Android Hybrid的一些事
HybridHybrid,字面意思,“混合的”,在Android中,指的是混合开发,也就是Native和H5混合开发。主要是实现思想是用H5做页面,以JS为桥梁,调用Native方法,Native用WebView装载H5页面,控制H5页面,这样实现了H5与Native的交互。这样做的好处是各个端只需要一套页面,维护成本低,而且H5可以随便修改,App不用升级也可以更新,曲线实现了“热更新”原创 2018-02-01 14:57:37 · 893 阅读 · 0 评论 -
Android UI布局优化
个人在开发过程中,一直要求自己在UI方面不要做过多的嵌套,这点我对自己还是挺满意的!!因为UI过多的嵌套,虽然开发比较方便,可以提高开发速率,但是渲染时间过长,App甚至会出现卡顿,降低用户的体验!很多人都知道“include”,“merge”,但是“ViewStub”标签估计很多人和我一样,有眼不识泰山了(说来惭愧呀)。include使用include标签,主要的是为了UI的复用原创 2018-02-02 10:42:22 · 217 阅读 · 0 评论 -
Android Data Binding 进阶
学完 Data Binding 的基本使用方法后,我们来学学 Data Binding 的进阶。Data Binding 最大的作用就是减少我们在 Activity 写更新和设置 UI 代码,有时候,View的更新过程需要一些简单的逻辑,如判断空,拼接字段等,因此,Android 的 Data Binding 还提供了一些简单的表达式供我们在 xml 布局文件中使用。例子:数据类public cla原创 2017-12-05 14:55:59 · 421 阅读 · 0 评论 -
Android Data Binding 初探
关于 Data BindingData Binding 是实现 MVVM 开发模式的一种框架。自从遇到了 Data Binding,老实说,我都不太想用 MVP 开发模式了。在 Android 中,要实现 MVP 开发模式,得定义很多 View Interface,还要定义很多 Presenter 类,职责分离了,程序的耦合性也优于 MVC 开发模式,但是开发起来还是略显繁琐。不过哦,MVP 开发模原创 2017-12-05 11:34:23 · 361 阅读 · 0 评论 -
Android 构架师之路 UML
之前有使用过UML工具来表示类图关系,现在来小结一下工具的使用方法,以及其各种图形的含义。UML工具简述我使用UML工具比较小型,叫StarUML,下载地址:https://staruml.en.softonic.com/。 虽然比较小,但是对我来说,已经很实用了,我来简单演示使用方法。(1)安装,比较简单,一直下一步就行了。(2)打开StarUML,创建空项目,并修改项目名称。(3)添加Mode原创 2017-12-01 16:08:25 · 374 阅读 · 1 评论 -
Android 获取APK编译时间
由于项目中,需要显示APK编译的时间,方便用户知道APK时什么时候更新的。用手动的方式的话,经常会忘记!现在知道AS在build.gradle中可以定义变量,在此记录一下。在build.gradle定义时间变量:defaultConfig {....buildConfigField "String", "BUILD_TIME", getDate()}String getDate() {原创 2017-08-15 17:31:27 · 5581 阅读 · 3 评论 -
Android 热修复 Tinker接入方法
什么是热修复简单的说就是用户不用重新下载一个新的apk安装,而是直接下载一个补丁包,通过补丁来替换一些出现bug的类,当然下载补丁的过程用户一般是感觉不到的,表面上看是直接修复了bug。热修复原理简单的来说,就是把最后修改的类打包成dex,插入到ClassLoader的dex数组的最前面,当ClassLoader找类时,会按顺序遍历dex文件,然后从当前遍历的dex文件中找类,如果找到则返回,如果找原创 2017-08-15 11:13:10 · 1326 阅读 · 0 评论 -
Android Studio 一个工程打包多个不同包名的APK
公司最近有个特别的需求,同一套代码,稍做修改(如包名不一样,图标不一样,应用名不一样等),编译出几个不同的应用。刚好用AS重构完项目,在网上查阅了一些资料,终于搞定!!在这记录一下。AS主要是利用gradle来实现这个需求的,具体做法如下:修改app的build.gradle文件假设我们同一套代码编译2个app:app1和app2android { ... productFlavor原创 2017-10-12 17:09:13 · 12660 阅读 · 6 评论 -
Android 组件化之路 路由设计
基于公司业务发展,公司的APP需求不断增加,应用也略显“臃肿”。想着趁现在不那么“糟糕”,时间也比较宽裕,把项目结构整整,因而走上了组件化之路。模块化 VS 组件化模块化: 将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容。组件化: 基于可重用的目的,将一个大的软件系统按照分离关注点的形式,拆分成多个独立的组件。区别: 模块化和组件化本质思想是一样的,都是“大原创 2017-08-11 16:10:52 · 1323 阅读 · 0 评论 -
Android 混淆
最近一直在重构项目,许久没有写博客了,要不是今天遇到这坑,估计要等到重构完再统一记录!!这坑其实不难解决,但是要花点时间,所以很有必要记录一下解决的方法,顺便了解Android混淆相关知识。关于Android混淆,之前嘛,一直copy别人的,或者github的,完全不用自己理会。这次公司使用的老大自己编译出来的so,还带有一个java文件,其实就是JNI啦,平常编译时,也出现任何问题,但是混淆打包之原创 2017-10-09 17:30:15 · 326 阅读 · 0 评论 -
组件化之路 模块的设计
组件化最大的特点就是多模块,将项目的业务逻辑进行“分解”,那模块的设计显得很重要!我在重构项目时,最终将其分为5层模块:App模块主要有引导页和欢迎页,如果主页面包含多个Fragment(如QQ主页面,有4个子页面),而且不包含业务的,也可以放到App模块。App模块依赖各业务模块,把各个业务的Activity注册到AndroidManifest文件中。业务模块各个业务独立出来,自己干自己的活,所有原创 2017-10-16 10:59:33 · 741 阅读 · 0 评论 -
Android 打开手机QQ,实现类似于客服功能
项目中,遇到一个小问题,在此记录一下,就是实现客服的功能。由于项目并没有集成 IM 模块,所以利用手机QQ,实现客服功能!!实现比较简单:/** * 判断 用户是否安装QQ客户端 */ public static boolean isQQClientAvailable(Context context) { final PackageManager packageManager原创 2017-11-30 10:05:20 · 5357 阅读 · 3 评论 -
Android Hook技术初探
原谅我见识短浅,Android竟然还能这么玩!!什么是Hook首先我们来了解一下,什么是Hook?Hook有什么用?我们都知道有一种设计模式 - 模板方法模式,原理是父类定义多个方法,但是不实现任何内容,然后将这些方法组合起来,来实现某种功能。 其中的没有实现的方法我们就称之为“Hook”钩子方法,主要目的是留给子类定制自己的东西。而这里的Hook有点不一样,运用反射技术和代理模式,以实现改变An原创 2017-11-30 15:06:46 · 1025 阅读 · 0 评论 -
Android Retrofit源码解析
按照分析源码流程的“套路”,我们先来个例子:Apipublic interface SearchApi { @GET("/search") Call> search(@Query("key") String key);}使用Retrofit retrofit = new Retrofit.Builder() .bas原创 2018-02-05 10:35:59 · 1448 阅读 · 0 评论 -
视频播放器开发 - SurfaceView
最近打算开发一个属于自己的视频播放器,上网查了很多资料,好像都有SurfaceView的身影。虽然之前自定义摄像机有用过它,但是也是看着别人怎么用,没怎么去详细了解它,觉得是时候注意它了(并没有打算从源码角度分析它)。View的更新先聊聊View的更新!想更新View,必须主动调用View的invalidate()或postInvalidate()方法,然后onDraw()方法才会执行...原创 2018-03-16 16:14:23 · 610 阅读 · 0 评论 -
自定义Android视频播放器 - 切换横竖屏
前一篇自定义了SurfaceView,然后尝试横屏显示,虽然视频适配方面没有问题,但是没有占满整个屏幕。我分析了一下一般的视频播放器,发现:竖屏播放视频,播放器的宽度占满手机屏幕的宽度,播放器的高度根据视频大小决定,有可能超过屏幕的高度。横屏播放视频,播放器的高度占满手机屏幕的宽度,播放器的宽度根据视频大小决定,有可能超过屏幕的高度。根据以上两点,对自定义SurfaceView测...原创 2018-03-22 13:49:44 · 3850 阅读 · 1 评论 -
Android FFmpeg系列——4 子线程播放音视频
利用工作闲余时间,终于实现在子线程播放音视频!上一接学习了在 C 使用多线程,接着就是利用 C 多线程同时播放音视频(暂时还不同步)。不多说,直接上码。代码// C 层播放器结构体typedef struct _Player { // Env JavaVM *java_vm; // Java 实例 jobject instance; jobject...原创 2018-10-26 16:48:42 · 1736 阅读 · 1 评论 -
Android FFmpeg系列——6 Java 获取播放进度
一般播放器都能显示播放进度,这一节来实现这个功能。由于我是在 C 层播放视频的,至于播放到哪里,Java 层是不知道的,所以得利用 C 调用 Java 代码来实现。Java 代码/** * 同步播放音视频 * @param path * @param surface * @param callback */public native void play(String path, S...原创 2018-10-31 14:26:08 · 1275 阅读 · 1 评论 -
Android FFmpeg系列——7 实现快进/快退功能
实现快进、快退功能,其实就是设置视频的播放进度!基本思路如下:暂停 生产(读取帧)和 消费(解码播放);清空队列,包括视频队列和音频队列;调用 av_seek_frame 设置进度;唤醒,继续 生产(读取帧)和 消费(解码播放);思路很简单,我们一步一步实现!暂停 生产(读取帧)和 消费(解码播放)这里,我结合线程锁和条件变量来实现,暂时生产和消费:/** * 生产函数 ...原创 2018-10-31 16:35:24 · 2216 阅读 · 0 评论 -
Android FFmpeg系列——5 音视频同步播放
音视频同步播放是做播放器的难点之一,在博主用到的播放器中,有一款播放器我真的无法忍受,那就是百度云播放器!这里我真的得吐槽一下,卡顿之后,然后视频可以正常播放,但是没有声音,声音竟然没了!!你这么一个大厂,连这点都搞不定?!而且我还提过2次建议(因为实在忍不了,但是又必须得用),也不是出现的概率很低,真搞不明白!!好啦,吐槽完了,回归正题,我们来学习怎么实现音视频用不播放!首先,我们得先了解几个...原创 2018-10-19 10:15:45 · 1880 阅读 · 1 评论 -
Android JNI操作Bitmap实现黑白图片
最近想练习一下NDK,基于我接下来的目标是多媒体,多以想多点学习一下关于滤镜的知识,黑白滤镜是最简单的了。这里实现的是将一张彩色图片转成黑白图片,是黑白滤镜的基础!直接上码:// java 代码public void gray(View view) { Bitmap source = BitmapFactory.decodeResource(getResources(), R.dr...原创 2018-12-05 11:46:57 · 1588 阅读 · 0 评论 -
Android 自定义可手势移动、放缩ImageView
又很长的一段时间没写博客,趁着空闲之余,做一下一个常用的自定义View的记录。手势移动、放缩ImageView是一个很常用的控件,之前都是用别人写好的,发现对Matrix类不是很熟悉,估计以后可能会经常用到这个类,所以想深入了解一下Matrix原理和怎么使用!Matrix网上太多资料了,比如 Android Matrix矩阵,大家自行查资料,只有理解了Matrix变换矩阵,才能看懂下面的代码...原创 2019-06-22 16:53:28 · 641 阅读 · 0 评论 -
JNI 同一个Module生成多个so
终于解决困扰了我2天的问题!!!那叫一个激动!!最近做一个项目,需要在同一个模块中同时生成两个SO文件,刚开始没觉得怎么样,就在一个CMakeLists.txt文件这么写入:cmake_minimum_required(VERSION 3.4.1)# 这是第一个soadd_library( a-lib SHARED a.cpp)# 这是第二个soadd_lib...原创 2019-06-28 16:47:26 · 1115 阅读 · 0 评论 -
Android FFmpeg音频重采样
自己有个需求,要把采样率为44100的PCM重采样为16000的PCM,经过1天的探索,终于成功了!!网上的资料比较少,找到的都是比较零碎的知识点,只能慢慢摸索,想到这个,还是觉得有团队好,个人学习总是慢一点的,比较曲折,不过也能锻炼个人的学习能力!基本原理进入正题,所谓音频重采样,简单来说,就是在原来的PCM进行插值(低采样率到高采样率)或抽取(高采样率到低采样),但是如果我们只是线性插值...原创 2019-07-24 11:40:25 · 1968 阅读 · 2 评论 -
Android FFmpeg系列——2 播放音频
音频简介虽然听了很多音频,但其实对音频知之甚少,所以很有必要了解一下音频。Audio,指人耳可以听到的声音频率在20Hz~20kHz之间的声波,称为音频。音频录制播放音频之前,我们得先了解音频是怎么保存的。保存音频,其实也就是录音和制作。模拟时代模拟时代是把原始信号以物理方式录制到磁带上(当然在录音棚里完成了),然后加工、剪接、修改,最后录制到磁带、LP等广大听众可以欣赏的载体上。这一...原创 2018-10-17 11:34:12 · 1284 阅读 · 0 评论 -
Android FFmpeg系列——1 播放视频
由于公司项目原因,现在才得空来学习关于FFmpeg库的使用。前言在使用FFmpeg库的过程中,哎呦,各种心酸!!项目重新创建了N次,调试了N次,终于把视频流播放出来,心里甚是激动呀!环境搭建Android Studio 创建Demo项目,记得把 “Include c++ support” 勾上。这里主要说2点:项目目录结构;文件配置,主要是app模块build.gradle 和 C...原创 2018-10-16 17:54:42 · 6583 阅读 · 7 评论 -
Android OpenCV库使用
最近在做一个文字识别的工具,主要是想从图片中提取出对我有用的信息。文字识别用的是Tesseract的文字识别库,写了一个demo,发现识别的速度很慢,于是想是不是要对原图做些处理呢?!于是乎,找到了这个博文:Android中的文字识别(论文精简版),里面提到需要对原图片做基本的处理:对于图片的处理,使用的OpenCV库。所以在此记录一下在Android中怎么使用OpenCV库。...原创 2018-04-11 16:51:40 · 2874 阅读 · 1 评论 -
视频播放器开发 - VideoView
刚开始,还以为VideoView是Android提供我们另一种播放媒体的控件,看了源码之后,原来是MediaPlayer+SurfaceView的封装,只是方便我们使用而已,当然也有好处。既然是封装,那我们来看看VideoView是怎么使用MediaPlayer+SurfaceView的。源码分析源码虽不多,但是只分析有用的代码,直接上码:public class VideoView ...原创 2018-03-20 16:08:03 · 851 阅读 · 0 评论 -
自定义Android视频播放器 - 自定义SurfaceView
Android开发视频播放器,一般都是使用MediaPlayer+SurfaceView来实现,VideoView也是使用了MediaPlayer+SurfaceView方式(不信看源码)。所以,我打算使用MediaPlayer+SurfaceView封装自己的视频播放库。本章打算用之前的例子:视频播放器开发 - MediaPlayer在例子中,使用的是原生的SurfaceView,现将S...原创 2018-03-21 10:59:06 · 3658 阅读 · 3 评论 -
Android6.0 权限管理
Android6.0之后,为了用户的安全,对于一些敏感的权限,不仅要在AndroidManifest文件声明这些权限,而且还要在代码中动态申请这些权限。敏感权限:CALENDAR(日历) READ_CALENDAR WRITE_CALENDARCAMERA(相机) CAMERACONTACTS(联系人) READ_CONTACTS WRITE_CONTAC...原创 2018-04-03 15:11:01 · 339 阅读 · 0 评论 -
Android 微信支付
公司最近需要接微信支付,由于微信支付相关文档不全,在集成过程中,遇到了很多坑,这里记录一下,希望能帮到需要帮助的人。好了,开始吧!!1.申请微信开发者账号微信开放平台网址:https://open.weixin.qq.com/开发者对申请开发者账号已经不能再熟悉了吧,而且这步没什么坑,跳过!!2.创建移动应用(1) (2) 注意图标的尺寸:小图标28*28...原创 2018-04-11 10:09:05 · 759 阅读 · 0 评论 -
Android Xfermode
最近需要做类似于QQ裁剪头像的功能:以前的我,肯定会糊里糊涂的copy网上的资料完事!!这样完全学不到东西,所以这次认真点,学习里面的“精髓”,虽然不难!好了,这里会接触到Canvas的Xfermode与Layer的东西,在自定义View中可以实现很复杂的效果。Xfermode先稍微了解一下关于Xfermode,Xfermode称为图像混合模式,可以将不同的图像进行混合处理...原创 2018-04-12 10:43:08 · 643 阅读 · 0 评论 -
Android FFmpeg 编译.so库
编译了好几天,算是把它搞出来了!!环境准备 博主尝试在win7使用Cygwin编译,按照网上的说法,结果出现各种莫名其妙的错,比如 “找不到\r命令” 之类,大家可以尝试一下,反正我是怕了,所以博主决定在linux下编译。编译环境:Linux(博主是在VMware搭建的Centos环境)这里再做一下笔记,关于在VMware中window和linux文件共享的。(1)安...原创 2018-08-10 16:36:28 · 2732 阅读 · 0 评论