Android
文章平均质量分 66
shanshan_star
我只是一个小菜鸟,希望被各个大神的光环笼罩。
展开
-
Android Kotlin Gson解析踩坑记录
一、背景一般我们在进行网络请求拿到返回结果之后,我们期望能够转化成对应的Java实体类,在这个转化过程中,可以使用自动解析的方式,也可以使用三方提供的工具类,比如Gson、FastJson等。针对于Gson解析,可能都有遇到某个字段类型不匹配导致整个json解析失败的问题,这不是我们期望的,我们期望的是一个字段解析失败不影响其他字段的解析。那这种情况下怎么办呢?下面就是踩坑记录和解决方案二、问题 & 解决方案1. 绕过Kotlin非空判断问题问题描述data class User(原创 2021-03-07 11:07:53 · 2283 阅读 · 0 评论 -
Lifecycle全面剖析
一、简介Lifecycle 库是2017年 Google I/O 开发者大会上发布的一个库,目的是让除了 Activity 和 Fragment 外的其他组件也能感知到生命周期。那为什么要用Lifecycle呢?举一下我们最常用的 MVP 例子,没引进 Lifecycle 之前,我们需要在 Activity 或者 Fragment 销毁的时候,即 onDestroy 的时候手动调用 Presenter的onDestroy 方法,这里会带来一些问题,每一次在 Activity 或者 Fragment 销原创 2021-02-21 16:13:41 · 774 阅读 · 0 评论 -
Android混淆相关
背景写这篇文章的背景是开发过程中对线上apk包进行反编译后发现所有的类名居然都没有被混淆,猜想可能是混淆配置出了问题,但是由于项目的现状是集成了将近600个的aar形成的apk, 混淆规则高达2w行,所以尽管能定位大概方向,但这仍然是一项耗时耗力的工作。于是就此展开了问题排查思路及过程集成工程打包后会在build/outputs目录下会生成总的混淆文件proguard-all-configuration.txt, 这个文件包含了打包过程中各个aar通过consumerProguardFiles配置的混原创 2021-02-21 13:33:04 · 485 阅读 · 0 评论 -
SharedPreferences源码解析和可能ANR的情况及建议
ANR使用不当可能会造成ANR,为什么这样说呢?下面我们分析源码:一般来说我们是通过Context实例获取SharedPreferences对象的,即: public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);上面是Context类里面的抽象方法,所以我们需...原创 2020-03-10 21:56:14 · 345 阅读 · 0 评论 -
Handler,Looper,MessageQueue,ThreadLocal的关联
一.前言本以为这些东西是老生常谈,并且作为Android开发的基础入门知识,是必须熟练掌握的,但是发现每每提起Handler及Looper,ThreadLocal的原理,总是要去翻阅资料,或者查看源码再捋一遍,干脆花一点时间整理一下,等下次再忘记拿出来稍稍翻阅一下就ok了。二.原理浅析分析一件事情往往需要带着问题去分析,下面我们将从以下几个问题进行分析:为什么主线程直接new Handl...原创 2019-11-20 15:21:29 · 944 阅读 · 0 评论 -
Android中Binder浅析(进程间通信)
一、概述因为进程间的资源是不能共享的,所以为了保证进程间能达到通信的目的,每个系统都存在自己的IPC(Inter-Process Communication)机制。Android系统中,涉及到进程间的通信底层都是依赖于Binder机制。二、BinderIPC 原理每个Android进程,只能运行在自己进程所运行的虚拟地址空间,这个虚拟地址空间包含用户空间和内核空间。对于用户空间,不同...原创 2018-11-29 14:52:04 · 252 阅读 · 0 评论 -
更优雅的使用startActivityForResult及权限请求
一、问题所在Android页面之前的数据回传我们一般使用startActivityForResult来处理,这没什么问题,但问题就在于我们所有的处理结果都放在onActivityResult中,在里面根据不同的requestCode作不同处理,这种方式看起来非常不优雅,因为有时候onActivityResult里面逻辑一大堆,而且跟调用方距离相差甚远,代码对应非常麻烦,找着找着就不知道找到哪里...原创 2018-11-29 14:02:57 · 2263 阅读 · 1 评论 -
Android WebView与javaScript交互
操作前提webview.getSettings().setJavaScriptEnabled(true);通过webView调用JavaScript方法webView.loadUrl("javascript:METHOD")或者 webView.evaluateJavaScript("javascript:METHOD",CallBack) //只能在4.4以上调用,效率高,能拿到返回结...原创 2018-11-29 12:27:08 · 209 阅读 · 1 评论 -
详细整理lanchMode和Intent.flag
##详细整理lanchMode和Intent.flag一说到启动模式,大家都认为这是Android里面最基本的东西,这些东西自己很清楚,但是真正用起来的时候可就懵逼了,我也是在使用的时候才发现自己并不是那么清楚,所以才整理成一篇文章方便自己和大家能更好的理解。一、lanchModeActivity启动模式是指在清单文件中配置lanchMode,比如<activity android:...原创 2018-11-20 11:24:50 · 172 阅读 · 0 评论 -
日常小tip记录
Android各种目录的区别context.getDir("test", MODE_PRIVATE).getAbsolutePath() ----> /data/user/0/<packagename>/app_testcontext.getFilesDir().getAbsolutePath()----&g原创 2018-09-07 18:49:16 · 219 阅读 · 0 评论 -
事件分发机制与NestedScrolling机制
事件分发机制与NestedScrolling机制一、事件分发机制1.理论分析事件分发涉及的是View和ViewGroup,相关事件:dispatchTouchEvent、onInterceptTouchEvent、OnTouchEvent,其中onInterceptTouchEvent只有ViewGroup才有这个方法。当一个Touch事件到来时,它会从Activity向下依次分发,分发的...原创 2018-12-14 16:03:06 · 338 阅读 · 2 评论 -
AOP浅析以及Android对AOP的应用
一、前言大家都知道OOP,即Object-Oriented Programming,面向对象编程。本篇我们要讲的是AOP,即 Aspect-Oriented Programming,面向切面(方面)编程。平常我们开发都是用OOP的编程思想,这种思想的精髓是把问题模块化,每个模块专注处理自己的事情,但是在现实世界中,并不是所有问题都能完美的划分到模块中。比如日志输出,这些可能是每个模块都是需要的功...原创 2018-12-09 13:07:37 · 359 阅读 · 0 评论 -
Flutter打包aar并且集成现有Android项目
一、前言Flutter现在已经很火了,但是如果我们要想使用Flutter开发,在新的Flutter项目上集成以前的所有代码肯定是不现实的,同时又不想将Flutter直接侵入到我们的项目结构中去,于是最优解就是将开发的Flutter项目单独编译成aar,然后以组件的形式被主工程依赖。这样做的好处是显而易见的:对Flutter进行探索开发的同学可以在自己的Flutter工程内编写dart代码,独立...原创 2018-12-29 16:24:25 · 7627 阅读 · 12 评论 -
Flutter编译模式
一、编译模式的分类编程语言达到可运行的过程需要经过编译,因为机器最终认识的是二进制,所以编译就涉及到编译模式,编译模式分为两类:JIT和AOT。JITJIT全称Just In Time(即时编译),典型的例子就是v8,它可以即时编译并运行JavaScript。JIT模式的优势:可以动态下发和执行代码,不用管用户的机器是什么架构。JIT模式的劣势:JIT编译器会发给很多时间和内存进行编译,...原创 2019-01-02 18:37:55 · 439 阅读 · 0 评论 -
Flutter学习知识点总结
一、Dart语言简介Dart语言是一种真正面向对象的语言。下面我挑几点比较重要的简单实用的介绍一下,因为文章后面会涉及这些语法。函数式编程说Dart是真正的面向对象的语言就在于它把函数也认为是对象,类型为Function。这意味着函数可以赋值给变量或者作为参数传递给其他函数,这是函数式编程的典型特征。//将函数赋值给变量var say= (str){ print(str);};...原创 2019-02-22 16:27:59 · 963 阅读 · 0 评论 -
Android sdk适配指南心得
6.0适配权限适配自己封装的库 XstartActivityForResultAndXPermission7.0适配8.0适配1、Android O 适配详细指南主要关注一下透明Activity崩溃问题2、Android 8.0去除“允许未知来源”选项,需手动确认。如果我们的App具备安装App的功能,那么AndroidManifest文件需要包含REQUEST_INSTALL...原创 2019-02-20 15:35:40 · 960 阅读 · 0 评论 -
Android共享元素动画
Andriod 5.0及之后,开始支持共享元素动画,该动画主要用于两个activity之间,两个Activity可以共享某些控件,Activity A跳转到Activity B的时候,A的某个控件能自动移动到B的相应控件的位置,产生动画。在要共享的控件加上属性transitionName ,ActivityA和ActivityB的布局文件都要加,并且对应做动画的view的属性值要一样。 &...原创 2019-09-12 14:44:57 · 2218 阅读 · 0 评论 -
Android热修复技术(三)字节码注入
前言首先我们考虑一个问题,为什么需要进行字节码注入代码?那是因为apk在加载外部dex包的时候程序会出现崩溃(5.0以下),那为什么会崩溃呢? java.lang.IllegalAccessError:Class ref in pre-verified class resolved to unexpected implementation1. 崩溃原因—>类预校验问题引起的...原创 2018-09-11 17:11:58 · 1918 阅读 · 0 评论 -
Android热修复技术(二) Groovy语法及打Patch包
一、前言上篇我们讲到了patch包的打包是通过dex命令来生成classes.dex之类的dex文件,但是实际项目开发中我们不可能每次都把对应的包、类一一拷贝出来然后自己手动去敲dx命令去打包,所我们的目的是编写任务和插件去自动打patch包,在这个过程中我们首先需要学习的是Gradle Task和Plugin的定制 二、Groovy语法我们平时使用的Android studio...原创 2018-09-11 17:08:18 · 484 阅读 · 0 评论 -
验证码输入框
整体思路:底部一个透明的EditText,上面放置多个框框,通过组合布局继承RelativeLayout,在输入的过程中不断控制EditText的paddingLeftJava代码public class VerificationCodeView extends RelativeLayout implements TextWatcher, View.OnKeyListener { ...原创 2018-09-05 13:04:04 · 795 阅读 · 0 评论 -
软键盘的显示与隐藏
EditText有时候会在Activity的布局上,有时候会在非activity的布局上,所以如果写法不对的话,想隐藏软键盘很有可能实现不了,下面是正确的写法,可以将其写入工具类//显示软键盘public static void showKeyBoard(EditText v) { if(v == null) return; v.requestFocus();原创 2016-08-26 13:56:40 · 474 阅读 · 0 评论 -
流式标签
先上图片看效果 思路很简单,就是垂直的LinearLayout里面添加水平的LinearLayout,然后再往水平的LinearLayout里面添加tag/** * Created by star on 2016/9/9 * 功能:流式标签 */public class UserTagsView extends LinearLayout { //每一行的LinearLayout原创 2016-09-22 16:19:51 · 281 阅读 · 0 评论 -
DialogFragment与PopWindow
Dialog style解析(通俗理解)如果dialog的style继承了系统样式,比如parent="@android:style/Theme.Dialog"或者parent="Theme.AppCompat.Light.Dialog&原创 2016-08-25 11:40:43 · 619 阅读 · 0 评论 -
Android 6.0权限适配
新增API ContextCompat.checkSelfPermission 检测当前app是否拥有某些权限ActivityCompat.requestPermissions() 申请某些权限onRequestPermissionResult回调权限申请结果ActivityCompat.shouldShowRequestPermissionRetional向用户解释权限的作用使用流程原创 2016-09-25 13:42:14 · 293 阅读 · 0 评论 -
基于PorterDuffXfermode或Shader绘制圆角图片
基于PorterDuffXfermode方式 canvas原有的图片可以理解为背景,就是dst; 新画上去的图片可以理解为前景,就是src。/** * Created by star on 2016/6/15 * 功能:基于PorterDuffXfermode的圆角图片 */public class RoundRectImageView extends ImageView {原创 2016-09-26 16:00:24 · 291 阅读 · 0 评论 -
ClickableSpan
有时候会遇到这样的需求: 一个TextView显示不同的样式,并且分别可点击,那么就需要用到ClickableSpan这个类用法步骤: 1.定义一个类继承ClickableSpanpublic class UserClickSpan extends ClickableSpan{ private Integer userId; private Activity ctx;原创 2016-11-15 12:58:27 · 521 阅读 · 0 评论 -
根据字符个数限制文字长短
在android中TextView的maxLength是指定最大的字个数,即中英文都算一个,但很多时候我们想让中文为2个字符,英文和其他符号则认为1个字符,那么就需要自己计算了,下面就是我写的一个工具类:/** * Created by star on 2016/10/17 * 功能:截取指定字符的字符串,中文两个字符,特殊符号为一个字符 */public class TextLimitUt原创 2016-12-15 16:20:34 · 403 阅读 · 0 评论 -
Android透明状态栏(4.4以上版本)
关键代码:protected void initSystemBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.getDecorView().setSystemUiVisibili原创 2017-01-22 17:37:09 · 586 阅读 · 0 评论 -
Retrofit封装和使用
关于Retrofit基础知识的学习,请参考这篇文章Retrofit实战技巧代码的封装1.APIService 使用Retrofit要求我们将项目中使用的接口请求定义写在一个接口中,咱们就写在APIService中。2.RetrofitClient类,该类就是retrofit请求管理类,该类使用单例模式,封装了项目使用的Intercepter、baseUrl、connectTimeOut、conver原创 2017-02-23 17:02:08 · 897 阅读 · 0 评论 -
自定义Toast
主要解决问题: 1:系统toast样式不符合UI需求 2:多次点击弹出多个toastpublic class ToastUtils { private static Toast mToast; private static TextView title; private static Handler mHandler = new Handler(); private原创 2017-03-28 18:28:49 · 253 阅读 · 0 评论 -
Git提交代码相关
git config --global user.name 'xueshanshan' //git初次配置git config --global user.email 'xueshanshan@huli.com'git cherry-pick commitid //在第二个分支中把第一个分支的某次提交拉过来git commit --amend //补充上次提交首先,可以试图用g...原创 2018-06-29 18:06:19 · 145 阅读 · 0 评论 -
Kotlin语法总结
Kotlin语法总结变量、常量 var val 类型自动推断 latinit var val b: String by lazy{} 不支持自动转型 如Int不会自动转为Float new类的时候不需要new关键字函数方法声明 参数 返回值 fun a: Int 写在方法名后面 方法表达式方法参数默认值(name: String...原创 2018-06-29 18:08:17 · 243 阅读 · 2 评论 -
Android热修复技术(一) 原理和实现
写在前面: 参考文章 热修复——深入浅出原理与实现一、简述和意义在热修复之前,一个上线的app如果出现了bug,即使非常小,要是想及时更新就必须将app重新打包发布到应用市场,让用户重新下载安装,使得用户体验非常差,而且很多用户不愿意去经常更新app,所以严重的bug还会造成用户流失,甚至带来严重的后果。热修复技术就是能在用户不用下载安装新的app,甚至无感知的情况下修复一些紧急或者...原创 2018-07-06 09:46:05 · 625 阅读 · 0 评论 -
关于屏幕分辨率问题
1.概念问题屏幕分辨率 :指在手机屏幕上面的像素点数 比如1920*1080、1080*720屏幕像素密度 (dpi):指每英寸上面的像素点的个数,单位是dpi,计算方式为(1280*1280 + 1920*1920)开方 / (x*x + y*y)开方 可根据上面的勾股定理计算屏幕无关像素(dp/dip):Android的一个设计单位,是物理单位,跟屏幕像素密度无关,只不过跟像素存在换...原创 2018-08-20 11:55:03 · 1674 阅读 · 0 评论 -
Android自定义View——雷达图
Java代码public class EvaluationView extends View { private int mNormalColor; //默认颜色 private int mHighlightColor; //高亮颜色 private int mLineCount; //n边型 private int mGeometryCount; //...原创 2018-09-05 11:51:13 · 268 阅读 · 0 评论 -
EditText与父控件点击事件冲突问题
正常情况下点击EditText会弹出软键盘输入内容,但假设说有需求在某种情况下禁止EditText输入内容,并且点击的时候需要toast告诉用户为什么不能输入,这个时候你可能会想到给EditText设置setEnable(false),然后给他的父容器设置点击事件,但是一旦你这样做了,你就会发现给父容器设置点击事件并不会触发,这是为什么呢?原因在于EditText的onTouchEvent始终...原创 2018-09-05 12:11:17 · 3991 阅读 · 1 评论 -
Android Studio Gradle配置
使用Android studio创建的项目会默认生成两个build.gradle文件(一个位于根目录下,一个位于app目录下)和一个setting.gradle文件根目录下的build.gradle一般内容如下buildscript { repositories { //使用jcenter()依赖库 jcenter() } dependen原创 2016-08-30 17:33:39 · 251 阅读 · 0 评论