
android
文章平均质量分 85
_SkUnK
想成为大佬!
展开
-
如何写一个日志框架
整体功能设计1、支持控制台打印2、支持缓存到文件,支持日志文件上传3、支持接入APM性能监控需要考虑的细节有哪些?1、日志文件 和 APM 的区别是什么?APM 是通过上传部分关键日志,使得开发人员可以查询用户APP 的上传每条日志,进行问题排查;而日志文件是存在用户设备上的,一般情况下不会上传,只有需要的时候,通过开关设置,来触发指定名单用户的日志上传,用来获取更多信息来排查问题。2、写入日志文件的策略是什么?内存中日志最大数目是多少?什么时候触发写入文件?日志文件多大?线程怎么管理?最原创 2022-04-09 10:13:48 · 581 阅读 · 0 评论 -
Gson源码解析
这里写自定义目录标题遇到的问题Gson.fromJson() 源码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入遇到的问题在使用Gson将 Json字符创 转化为 Java 对象的时候,由于没有给字段加上@Serializab原创 2021-02-24 20:56:28 · 351 阅读 · 0 评论 -
Glide4缓存机制源码解析
这篇文章基于Glide4,只分析Glide4的缓存机制,如果大家还不了解Glide4源码,可以去看一下下面这两篇做一下铺垫:Glide4初始化Glide4数据模型转换与数据获取好了,直接进入正题~~这里以加载一张网络图片来讲解缓存过程,从前面的文章中可以知道,当第一次加载一张新的网络图片时,本地是没有这张网络图片的缓存的。所以会进入到SourceGenerator类的start...原创 2019-02-22 23:18:08 · 639 阅读 · 1 评论 -
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题
假设下面一种情况:当前Activity中持有一个fragment对象,且fragment中有一个AsyncTask异步任务正在执行,当配置发生改变时(比如屏幕旋转),假设消息队列的情况如下1.配置改变,用户旋转屏幕,但是此时AsyncTask已经运行2.Fragment的onDetach方法被调用3.AsyncTask的doInBackground方法完成,也就是后台任务执行完毕4....原创 2019-02-08 13:31:23 · 601 阅读 · 0 评论 -
使用BottomSheet和BottomSheetDialog实现嵌套滑动效果
先看效果: 这就是我们要实现的嵌套滑动效果,即在同一个事件序列中,先滑动外部控件,当外部控件滑到设定的高度时,滑动内部空间。我们都知道,在传统的时间分发机制中,某个View一旦决定拦截,那么这一个事件序列都只能由它来处理(如果事件序列能够传递给它的话)并且它的onInterceptTouchEvent不会再被调用。所以上面的效果用传统的事件分发是无法实现的。这时候就要用到我们的Nest...原创 2019-02-01 16:30:21 · 6207 阅读 · 1 评论 -
Android存储路径
总结存储路径,方便下次查阅,看了很多介绍存储路径的文章,但是还是自己验证一下来的爽快~这里分为内部存储和外部存储。内部存储:即手机自带的存储目录。外部存储:如SD卡。不管现在的手机是否有可移动的SD卡,总是有外部存储和内部存储。先上图:内部存储(一)非私有目录:不会随着 APP 的卸载而删除1. Environment.getDataDirectory()...原创 2018-11-22 18:02:45 · 49919 阅读 · 0 评论 -
组件化入门——手把手写一个Demo
组件化开发就是基于可重用的目的,将一个大的软件系统分离,拆分成多个独立的组件。组件可以是模块、web资源、软件包等。最近想知道组件化是什么东西,于是看了很多博客,设计到很多理论知识,但是越看越懵。还不如找个Demo学一下,学的过程又遇到很多新的东西,特此记录一下!顺便也可以作为新手入门组件化的文章(不要脸- -)。。。我觉得看再多还不如跟着写一个Demo来的实际点。所以,开始吧!我们先...原创 2018-11-21 22:11:06 · 1918 阅读 · 0 评论 -
Android——View绘制流程
ActivityManagerService在介绍ActivityManagerService之前,我们先简单了解一下Android Zygote系统启动过程。在Android系统中,所有的应用程序进程和系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的,因为Android系统是基于Linux内核的,而在Linux系统中,有一个init进程,他是内核启动的第一个...原创 2018-11-07 20:13:42 · 522 阅读 · 0 评论 -
简单使用Camera自定义相机
最近需要使用到自定义的相机,由于网上的教程大多讲不清楚,于是自己去找了个开源的自定义相机学习了下。现在起码知道怎么用了,所以在此简单记录一下,顺便加深一下理解。先看效果图:首先,想要使用相机,那我们需要的就是一个能够显示摄像头拍摄到的图像的控件,这个控件就是SurfaceView。那么SurfaceView是什么呢? 从这里我们可以知道①SurfaceView继承自View,②S...原创 2018-10-27 06:03:58 · 1256 阅读 · 0 评论 -
前台服务Service更新Notification进度条
在弄音乐播放的app的时候,我们时常需要用一个前台Service来播放音乐,同时管理和更新Notification,而且,Notification的点击事件需要用Broadcast来传递。今天就手把手来看看如何在Service中管理Notification以及Broadcast!首先,我们先来看看Notification的布局,xml文件如下:<?xml vers...原创 2019-03-26 11:44:22 · 2788 阅读 · 0 评论 -
关于MediaPlayer播放音频的使用及状态管理
最近在app播放音频的时候,时常出现 IllegalStateException,在网上看了别人写的博客,想了解一下MediaPlayer的生命周期及使用时要注意的点,没想到查的资料说法都不一样(后面会指出),索性去看了官方文档,特此记录~~~使用MediaPlayerMediaPlayer类是媒体框架最重要的组成部分之一。此类的对象可以以最少的设置来获取,解码和播放音频和视频。它支持几种...原创 2019-03-27 22:13:21 · 1795 阅读 · 0 评论 -
Activity状态保存onSaveInstanceState()
当 Activity pause 或 stop时,Activity 的状态会得到保留。 因为当 Activity pause 或 stop时,Activity 对象仍保留在内存中 ,所以它的成员和当前状态的所有信息仍处于活动状态。 因此,用户在 Activity 内所做的任何更改都会得到保留,这样一来,当 Activity 返回前台(即resume)时,这些更改仍然存在。不过,当系统为了恢复内...原创 2019-04-10 23:02:08 · 670 阅读 · 0 评论 -
Android——一个Demo带你了解MVVM模式
最近学习MVVM模式,特此记录~~本文目的:①主要通过一个 MVVM的 Demo来了解一下我们在平时该怎么使用它②对比 MVP和 MVVM的区别好了,废话不多说~开始吧首先我们来看一下 MVP和 MVVM的结构图:图片来自https://mp.weixin.qq.com/s/PspA4DYPhzLtsJGJykGY0w可以看出两者的区别并不大,MVP的 Pr...原创 2019-04-07 15:37:28 · 1339 阅读 · 0 评论 -
自定义右上角数字圆点ImageView——NumImageView
我们经常会遇到需要在图标的右上角显示一个小红点或者包含数字的小红点,在网上搜罗了一番,然后决定自己来写一个~~效果图如下:可以是圆点、数字加圆点、数字加椭圆字体大小颜色和背景大小颜色都可以调整。源码地址:https://github.com/SkUnK-cc/MyWidgetLib如何使用?首先引入依赖implementation 'com.github....原创 2019-04-14 17:18:21 · 1723 阅读 · 0 评论 -
拍照并使用OkHttp上传图片到服务器
之前遇到需要上传图片到服务器的需要,特此记录~首先是调用相机拍照,首先创建一个 imageUri,并作为参数传入intent,这个 imageUri就是拍照时候照片的存储路径,拍摄完后就可以从这个 imageUri 获得照片的路径等信息了。 private void takePhoto() { File outpuImage = FileUtil.createLoo...原创 2019-04-14 18:07:20 · 1965 阅读 · 3 评论 -
自定义实现播放暂停Drawable
本文一步步解析自定义播放暂定 Drawable,该 Drawable 可以用于控件的背景,和自定义View是大同小异的。这篇文章的来源是一个开源项目的动画效果,我下载下来看了下,感觉是个入门自定义View很好的例子,所以写了这篇文章~~那个开源项目的名字是 Timber,是个音乐播放器!废话不多说,进入正文~~先看效果图放个大一点的好,当我第一次看到这个效果的时候,...原创 2019-04-19 17:07:21 · 658 阅读 · 0 评论 -
沉浸式状态栏详解
要想知道各式各样的状态栏怎么实现的,我们先要了解一下下面几个方法的作用!setSystemUiVisibility这个方法可以改变系统UI的可见性。使用如下:int flag = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;getWindow().getDecorView().setSystemUiVisibility(flag);系统为这个方法...原创 2018-10-08 22:29:49 · 365 阅读 · 0 评论 -
Android——new Canvas(Bitmap)中对canvas和bitmap的理解
最近刚接触自定义View的时候,看到Canvas有一个构造函数需要传入一个Bitmap,不解。于是有了这篇文章!我们先看Canvas的定义:The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canva...原创 2018-09-28 19:02:02 · 9343 阅读 · 2 评论 -
关于Handler 或 内部类 的内存泄漏:The xxx class should be static or leaks might occur
这篇文章是翻译过来的!我们先来看一下下面的代码:public class MainActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // ....翻译 2018-07-25 13:16:14 · 497 阅读 · 0 评论 -
关于EditText 焦点 及 软键盘弹出引起不适 的几点
防止 EditText 自动获取焦点:在 EditText 的父布局 加入两行: android:focusable="true" android:focusableInTouchMode="true" 在 EditText 中,EditText 第一次点击时, setOnClickListener 不触发原因是需要先获取焦点(未获取焦点时候),再次点击触发setOnClick...原创 2018-07-24 14:45:32 · 669 阅读 · 0 评论 -
Android-仿网易云歌手资料页面的实现-NestedScrolling
一、简介先来看看效果图:按照上图:按照传统的事件分发去理解,我们滑动的是下面的内容区域,而移动的却是外部的ViewGroup,如果采用传统的事件分发,是外部的Parent拦截了(Parent的onInterceptTouchEvent返回true)内部的Child的事件,但是,上面的效果中,当Parent滑动到一定的距离时,Child又开始滑动,整个过程是同一个事件序列。传统的事件...原创 2018-07-22 17:34:29 · 1292 阅读 · 2 评论 -
关于Android NestedScrolling及其各个方法的理解
一、概述NestedScrollingParent 和 NestedScrollingChild 两个类是Android在support.v4中提供的,这是一套全新的嵌套滑动机制,用来实现一些传统的自定义ViewGroup事件分发处理所不能完成的效果。按照传统事件分发角度来看,事件是由父View发起的,如果父View需要自己做滑动效果就要拦截掉事件并通过自己的onTouchEvent方法进...原创 2018-07-22 15:37:27 · 513 阅读 · 0 评论 -
Notification跳转到Activity的几种情况及传值问题!
多个Notification跳转到一个Activity!今天遇到一个关于Notification跳转到Activity的小问题,起初运行的时候,点击Notification上的按钮,跳转到相应的Activity,之后发现当有多个Notification时,把每个Notification上的按钮都点击一遍,出现了多个相同的Activity!于是乎,就写了这篇文章。跟大家一起探...原创 2018-04-22 18:09:14 · 5285 阅读 · 2 评论 -
OkHttp3源码解读(一)同步与异步
OkHttp3系列OkHttp3源码解读(一)同步与异步OkHttp3源码解读(二)请求响应与拦截器OkHttp是一个很常用的网络请求库,支持HTTPS。缓存、异步/同步请求。协议类型是Http/1.0,Http/1.1,SPDY,Http/2.0,WebSocket。Http/1.0 每一次请求创建一个TCP连接。Http/1.1 起,默认使用Keep-alive机制建立长连接,...原创 2018-08-19 11:19:12 · 1076 阅读 · 0 评论 -
Android SDK作用和结构
本文主要介绍一下SDK目录结构!现在对SDK目录做一下总结阐述!SDK目录add-ons这里面保存着附加库,第三方公司为android 平台开发的附加功能系统。比如GoogleMaps,当然你如果安装了OphoneSDK,这里也会有一些类库在里面。docs这里面是Android SDKAPI参考文档,所有的API都可以在这里查到。extras该文件夹下存放了Andr...转载 2018-08-26 14:57:34 · 10712 阅读 · 0 评论 -
Fragment与Activity之间生命周期的关系
本篇文章讲Fragment生命周期和Activity生命周期的关系,如图:可以看到Fragment的生命周期和它所在的Activity的生命周期是相关联的看Demo:public class MainActivity extends BaseActivity{ private FrameLayout fragContainer; @Override p...原创 2018-08-26 15:51:28 · 3330 阅读 · 0 评论 -
OkHttp3源码解读(二)请求响应与拦截器
OkHttp3源码解读(一)同步与异步上篇文章对比了同步与异步请求流程的区别,最终都是通过getResponseWithInterceptorChain()方法返回得到响应,这个方法涉及到了okhttp的核心,也就是拦截器,接下来我们了解一下其工作原理。Response getResponseWithInterceptorChain() throws IOException { ...原创 2018-08-19 23:00:56 · 911 阅读 · 0 评论 -
Retrofit源码解读
本篇文章使用的是Retrofit 2.3.0版本。Retrofit是基于okhttp的一个RESTful的HTTP网络请求框架的封装,内部的网络请求还是由okhttp完成的,对OkHttp不了解的可以看看:OkHttp3源码解读(一)同步与异步 OkHttp3源码解读(二)请求响应与拦截器Retrofit封装了接口层的请求参数以及请求结果的解析及转换(支持Gson、XML、JSON、p...原创 2018-08-23 22:11:03 · 572 阅读 · 0 评论 -
Activity启动模式SingleTask和Intent.FLAG_ACTIVITY_CLEAR_TOP区别
Activity启动模式介绍 Android 启动模式之前,先介绍两个概念task和taskAffinity task:翻译过来就是“任务”,是一组相互有关联的 activity 集合,可以理解为 Activity 是在 task 里面活动的。 task 存在于一个称为 back stack 的数据结构中,也就是说, task 是以栈的形式去管理 activity 的,所以也叫可以称为“...原创 2018-08-29 21:21:31 · 6967 阅读 · 2 评论 -
PopupWindow使用
我们常见的PopupWindow使用如下:PopupWindow popupWindow = new PopupWindow(contentView,width,height);popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));popupWindow.setOutsideTouchable(tr...原创 2018-09-06 14:50:40 · 482 阅读 · 0 评论 -
Fragment中getContext得到的context从哪来?
我们先看下fragment的getContext方法: @Nullable public Context getContext() { return mHost == null ? null : mHost.getContext(); }可以看到context是由mHost的getContext方法得到的,Ctrl+左键发现mHost是一个Fragm...原创 2018-09-10 21:19:50 · 6343 阅读 · 5 评论 -
Android使用OkHttp3实现多文件下载、断点续传
最近在音乐app中遇到在线歌曲下载问题,于是有了这篇文章。这篇文章借鉴了https://blog.youkuaiyun.com/cfy137000/article/details/54838608,在此感谢,自己在此基础上修改了一点。代码用Kotlin写的,这里只上核心代码。class DownloadManager { //这里采用单例模式 companion object {...原创 2018-09-18 19:21:34 · 4348 阅读 · 7 评论 -
自定义ViewPager导航控件
项目中我们经常会使用viewpager+fragment,这时候就需要一个导航控件,本文介绍如何自定义一个导航控件。先看效果图:先看xml布局文件:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com...原创 2018-09-19 23:13:01 · 498 阅读 · 0 评论 -
RxJava2源码解析
本篇文章的目的:①了解RxJava的基本流程②了解RxJava中线程调度的实现③了解了上面那些,其他的操作符对你来说就不是问题了RxJava基本流程我们从基本的使用作为入口:Observable.create(new ObservableOnSubscribe<String>() { @Override publ...原创 2018-09-21 15:10:57 · 375 阅读 · 0 评论 -
Android——主线程的loop为什么不会造成死循环?
线程是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出。MainThread的loop为什么不会造成死循环?因为这个loop处理一切的事件,包括绘制,点击事件等等,它停止了,那整个android程序就退出了。但这...原创 2018-10-05 16:25:45 · 1135 阅读 · 0 评论 -
RecyclerView-实现多种item布局
多种布局主要重写Adapter中的 getItemViewType 方法: @Override public int getItemViewType(int position) { return mDatas.get(position).getViewId(); }这里我给列表每个元素设置了视图id,在getItemViewType 中直接返回对应视...原创 2018-07-26 20:30:34 · 670 阅读 · 0 评论