自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 Android app自动更新总结(已适配9.0)

1.配置:1.1 AndroidManifest.xml中添加权限和FileProvider:-------------------------------------------------------------------------------------------------------------------- <uses-permission android:na...

2019-05-12 21:49:10 4095 2

原创 Android 如何设计用户Session管理?

相信大家都知道,每一个App都需要登录,登录信息都保存在本地文件中,然后我们就写一堆的操作SharedPreferences的代码了。现在,你可以完全抛弃这种方法,一句代码搞定登录信息,用户信息管理。实现全局操作。为你的程序解耦。初始化配置 public void sessionDemo() { // 获取登录信息 TokenInfo token = S...

2019-05-20 20:49:17 1143

原创 人人都想自学Android,为什么坚持下来的没几个?

对于想学习编程的人来说,在入门这个阶段兜兜转转一两个月是在所难免,一方面要看看自己是否适合,一方面在犹豫是自学还是报班。人只要有目标,是不怕苦的,但是自学编程不是困难模式,而是地狱模式,坑多的踩不完!比如:找资源就找了好几天,找到了还不知道能不能用,开发环境搞了好几天还是没搭建好。书好厚,千把页的,猴年马月能啃完。看是看懂了,有什么用啊?学到了新的忘了旧的,前后知识不连贯,学了半个月好像...

2019-05-20 20:48:24 369

原创 百度阿里腾讯头条面试Android高级岗必问!Handler源码解析!

前言Handler 是Android中常用的异步通信的一个类,Android是一个消息驱动的操作系统,各种类型的消息都是由Handler发出,再由Handler处理,那么对于Handler机制的理解就至关重要。目录1. 作用2. 基本用法3. 源码解析3.1 为什么 Handler 能够切换线程执行?3.2 Handler.post(Runnable) 方法是运行在新的线程吗?3....

2019-05-20 20:47:48 368

原创 Fragment新功能,setMaxLifecycle了解一下

基本介绍setMaxLifecycle定义在FragmentTransaction中,和之前的add、attach、remove、detach、show、hide等方法是并列关系;FragmentTransactionpublic FragmentTransaction setMaxLifecycle(@NonNull Fragment fragment, @NonNull ...

2019-05-20 20:44:11 11017

原创 FFmpeg编译并集成到android studio

1.FFmpeg编译编译过程准备编译脚本#!/bin/bashecho "进入编译ffmpeg脚本" NDK=/home/fanqile/Desktop/android-ndk-r16 #5.0PLATFORM=$NDK/platforms/android-21/arch-armTOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9...

2019-05-20 17:31:44 501

原创 Android通过hide&show管理多Fragment出现重叠以及点击穿透的解决之道

Fragment点击穿透我目前项目的首页是一个MainActivity包含5个Fragment,通过hide&show来进行tab切换。在刚开始就遇到了一个很恶心的问题:当前Fragment页,点击能跳转到其他Fragment页的内容。具体来说就是不应该被点击的位置,出现了其它Fragment页面对应位置的点击事件。这个问题不是100%的复现的,而且有些机型不会出现,有些又很频繁这个问...

2019-05-20 17:14:26 714

原创 把 LiveData 用于事件传递那些坑

1、为什么要把 LiveData 当作事件传递用利用观察者模式打造的事件总线的优点不必多说(当然也有很多缺点),如 EventBus 和 RxBus 用的好的话能起到很好的解耦作用,使整个程序架构更加清晰,不至于到处传递各种 Callback。但是他们都缺少了对 View 层(Activity、Fragment 等)的生命周期的感知能力,需要在生命周期结束时手动解除观察者,手动管理生命周期十分繁...

2019-05-20 16:41:55 4542 1

原创 使用 Kotlin 协程改进应用性能

协程是一种并发设计模式,你可以在 Android 上使用它来简化异步代码。协程是在 Kotlin 1.3 时正式发布的,它吸收了一些其他语言已经成熟的经验。在 Android 上,协程可用于帮助解决两个主要问题:管理耗时任务,防止它们阻塞主线程提供主线程安全,或从主线程安全地调用网络或磁盘操作本主题描述如何使用 Kotlin 协程来解决这些问题,让你能够写出更清晰、更简洁的代码。管理...

2019-05-19 20:22:07 533

原创 Android Transform + ASM 初探

背景随着项目中对 APM (Application Performance Management) 越来越关注,诸如像 Debug 日志,运行耗时监控等都会陆陆续续加入到源码中,随着功能的增多,这些监控日志代码在某种程度上会影响甚至是干扰业务代码的阅读,笔者于是查阅有没有一些可以自动化在代码中插入日志的方法,“插桩”就映入眼帘了,本质的思想都是 AOP,在编译或运行时动态注入代码。本文选了一种在...

2019-05-16 19:57:06 628

原创 Android 架构之高可用移动网络连接

正文讲解了Http短连接、TCP长连接、连接复用与速度优化、数据压缩等方面的知识点。不过,真实的网络环境是很复杂的,存在各种各样的因素会导致网络服务不可用,比如DNS劫持、服务器宕机、弱网等。换言之,如果服务都不可用,那上面这些优化也就没有意义了。因此,本文主要谈一下在真实的网络环境下,存在哪些常见的网络不可用原因,以及大多数公司是如何解决并兜底,从而达到高可用连接这个目标的。文章会从下面几...

2019-05-16 19:56:29 376

原创 Android实现Rxjava2+Retrofit完美封装

去年的时候学习了Rxjava和Retrofit的基本用法,但一直没有在实际项目中运用。今年开做新项目,果断在新项目中引入了RxJava和Retrofit。本篇文章将介绍笔者在项目中对Retrofit的封装。先来看一下封装过后的Retrofit如何使用。RetrofitHelper.getApiService() .getMezi() ...

2019-05-16 19:55:08 346

原创 解决Android解析图片的OOM问题!!!

大家好,今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但是当图片很大的时候就要用BitmapFactory.Options这个东东了,Options里主要有两个参数比较重要.options.inJustDecodeBounds = false/true;//图片压缩比例.options.i...

2019-05-16 17:20:05 202

原创 Linux内核OOM机制的详细分析和防止进程被OOM杀死的方法

Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。典型的情况是:某天一台机器突然ssh远程登录不了,但能ping通,说明不是网络的故障,原因是sshd进程被OOM killer杀掉了(多次遇到这样的假死状况)。重启机器后查看系统日志/var/log/mes...

2019-05-16 17:18:46 1082

原创 Android应用自动更新功能的实现!!!

一个好的应用软件都是需要好的维护,从初出版本到最后精品,这个过程需要版本不停的更新,那么如何让用户第一时间获取最新的应用安装包呢?那么就要求我们从第一个版本就要实现升级模块这一功能。自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语;最新版本的url等)。然后我们给出提示框,用户点击开始下载,...

2019-05-16 17:15:18 391

原创 Android状态栏提醒

家好今天简单讲一下Android状态栏提醒,这个在开发中也会经常使用,当我们插上USB会有状态栏提醒,来短信时也会有状态栏的提醒。而在Android中有提醒功能的也可以用AlertDialog,但是我们要审重的使用,因为当使用AlertDialog 的时候,用户正在进行的操作将会被打断因为当前焦点被AlertDialog得到。我们可以想像一下,当用户打游戏正爽的时候,这时候来了一条短信。如果这...

2019-05-16 17:14:15 557

原创 Android Launcher研究---桌面应用快捷方式的开发!

大家好,今天我给大家分享的是Launcher桌面快捷图标的开发,我们都知道快捷图标有两部分组成,一部分是应用的图标,另一部分就是应用的名称。其实Launcher中的快捷图标只是继承了TextView控件,重绘了一下,将背景弄成浅灰色(具体是什么颜色我也不知道)的椭圆背景,显示的文字颜色则是白色。TextView有android:drawableTop;drawableBottom(上下左右我这里就...

2019-05-16 17:13:18 262

原创 Android开发--蓝牙操作

首先,由于模拟器上没有蓝牙装置,所以我们需要一个含有蓝牙装置的Android系统其次,要操作设备上的蓝牙装置,需要在AndroidManifest中声明两个权限:<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />   <uses-permission android:name="and...

2019-05-15 20:06:37 397

原创 Android进阶(十)资源和Service的插件化

一、系统资源加载1、资源类别res目录下存放的资源文件。编译时会在R文件中生成资源文件的十六进制值。res目录下资源通过Context.getResource方法获取到Resource对象,然后通过getXXX获取资源。assets目录下存放的原始文件,编译时不会被编译。通过AssetManager的open方法获取目录下文件资源,AssetManager来源于Resources类的get...

2019-05-15 20:04:11 303

原创 Android四大组件

Android四大组件ActivityServiceBroadcastReceiverContentProviderActivity的生命周期:Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认的情况下,每当启用了一个新的活动,他会在返回栈中入栈,并处于栈顶的位置...

2019-05-15 20:02:28 192

原创 Alibaba-AndFix Bug热修复框架原理及源码解析

AndFix原理AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法。注:在Native层使用指针替换的方式替换bug方法,已达到修复bug的目的。使用AndFix修复热修复的整体流程:方法替换过程:源码解析解析源码从使用的方法一一解析。在自定义Application中初始化PatchManger:PatchManager mPatchManager = ...

2019-05-15 20:01:31 6676

原创 神兵利器—Android方法耗时统计插件Mirror(上)

1 前言1.1 发生背景有一天,Boss跑过来说,下次迭代我们要做蜂鸟团队App性能调优。对于一个大型成熟的App应用,在业务稳定后,往往会更加关注性能相关的表现。那么,Android App的性能调优该从什么地方入手呢?在进行性能调优、减少应用卡顿过程中,找出问题——耗时严重的代码,是一个不可或缺且非常重要的步骤,才能有的放矢对症下药。如何发现应用中的耗时任务甚至是耗时函数呢,如果想依靠开发...

2019-05-15 20:00:24 682

原创 从ClassLoader到Android插件化以及热更新原理

Android插件化最经换了工作,公司的项目比较庞大,很多地方都运用了插件化,插件化说简单就是把部分功能进行打包成专门的apk、dex等文件,当宿主app需要用到此功能的时候才去加载插件;插件不仅可以实现一些功能的热插拔;以及不需要去安装app,只是在使用到的情况下再去下载,这样就减小宿主的apk的体积;还可以去通过更新插件来完成功能的更新。插件化技术已经比较成熟了,很多大公司的产品也都是使用插...

2019-05-15 19:59:41 470

原创 Android 插件化框架Small解析 -- 类的动态加载源码分析

ClassLoader Dex 扩展在 ApkBundleLauncher.loadBundle 中:public void loadBundle(Bundle bundle) { ... // Load dex final LoadedApk fApk = apk; Bundle.postIO(new Runnable() { ...

2019-05-15 19:58:11 324

原创 教你如何完全解析Kotlin中的类型系统

Kotlin类型系统其中涉及到一个很重要的概念就是大家常说的可空性以及为什么Kotlin相比Java在一定程度上能降低空指针异常。此外在Kotlin中完全采用和Java不同思路来定义它的类型系统。也正因为这样类型系统天然具有让Kotlin在空指针异常出现的频率明显低于Java出现的频率的优势。此外Kotlin考虑使用和Java完全不同类型系统,以及它是如何去做到极大兼容和互操作。一、首先思考几个...

2019-05-15 19:57:14 183

原创 Android三种方式截取任意界面屏幕

一、使用MediaProjectionManagerAndroid5.0之后,开放截取屏幕的API,也就是利用MediaProjectionManager创建VirtualDisplay,传入与ImageReader关联的Surface,这样就可以从ImageReader中获取到Image,然后把Image的像素数组拷贝到Bitmap,如果要保存为图片,就用得到的Bitmap压缩为JPEG格式的...

2019-05-14 20:12:02 1780

原创 Android 侧划,如斯优雅

Background对市面上实现的侧划返回不是很满意(仿微信,QQ 通过修改窗口透明坑太多),最终决定还是亲手写一个高实用性的吧,效果如下所示,换个图标,更多划动功能可以由你自己解锁,总共一个 600 多行代码的类,推荐通过阅读源码,你肯定会收获很多哈。PreviewDownload源码地址:SwipePanel,喜欢的记得给个小星星哈。Gradle:implementation...

2019-05-14 20:11:04 227

原创 Android 仿微信/支付宝 字体大小 调整控件

FontResizeFontResize是一个仿微信/支付宝 字体大小 调整控件的库gradle依赖implementation 'com.ljx.view:fontresize:1.0.1'该库里面只有一个类FontResizeView,故不用担心库很大。效果图属性说明<declare-styleable name="FontResizeView"> &lt...

2019-05-14 17:51:27 431

原创 Android中mmap原理及应用简析

mmap是Linux中常用的系统调用API,用途广泛,Android中也有不少地方用到,比如匿名共享内存,Binder机制等。本文简单记录下Android中mmap调用流程及原理。mmap函数原型如下:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);几个重要参数参数start:指向...

2019-05-14 17:50:44 195

原创 API 接口防刷

API 接口防刷顾名思义,想让某个接口某个人在某段时间内只能请求N次。在项目中比较常见的问题也有,那就是连点按钮导致请求多次,以前在web端有表单重复提交,可以通过token 来解决。除了上面的方法外,前后端配合的方法。现在全部由后端来控制。原理在你请求的时候,服务器通过redis 记录下你请求的次数,如果次数超过限制就不给访问。在redis 保存的key 是有时效性的,过期就会删除。...

2019-05-14 17:50:08 609 1

原创 Android多个EditText输入效果解决方案

在开发中,我们常常遇到这种情况我们往往需要的是下面这种效果但是如果把这些实现的代码写在Activity中会比较麻烦,影响代码美观于是就有了下面这个辅助类,禁用了按钮的点击事件和按钮的渐变色,可同时添加一个或者多个EditText/** * 文本输入辅助类,通过管理多个TextView或者EditText输入是否为空来启用或者禁用按钮的点击事件 */public final cla...

2019-05-14 17:49:26 1020

原创 修改可发Android插件化原理分析(基于Neptune框架)

前言Android插件化不算是一门新技术,发展了有一些年头了。不同公司的插件化方案大体原理上很相似。本文通过阅读爱奇艺的Neptune框架来介绍插件化的整体思路和流程。插件化基础知识点插件应用安装所谓的插件其实本质上也是一个apk。在原生的Android应用中,apk在运行时会被映射成一个LoadedApk对象。插件在安装之后也会被映射成类似的PluginLoadedApk对象,统一管理插...

2019-05-14 17:44:39 242

原创 从源码的角度理解四大组件的工作过程——Android开发艺术探索笔记

系统对四大组件的过程进行了很大程度的封装,日常开发中并不需要了解底层的工作原理,那么研究这些原理的意义在哪里呢?如果你想在技术上更进一步,那么了解一些系统的工作原理是十分必要的,也是开发人员日后成长为高级工程师所必备的技术能力。Android作为一个优秀的基于Linux操作系统,其内部一定有很多值得我们学习的地方,通过对Android操作系统的学习对提高开发人员的内功有很大的好处。如果你从...

2019-05-14 17:43:24 137

原创 Flutter 三种方式实现页面切换后保持原页面状态

前言:在Flutter应用中,导航栏切换页面后默认情况下会丢失原页面状态,即每次进入页面时都会重新初始化状态,如果在initState中打印日志,会发现每次进入时都会输出,显然这样增加了额外的开销,并且带来了不好的用户体验。在正文之前,先看一些常见的App导航,以喜马拉雅FM为例:它拥有一个固定的底部导航以及首页的顶部导航,可以看到不管是点击底部导航切换页面还是在首页左右侧滑切换页面,之前...

2019-05-13 20:28:20 2462

原创 Flutter 网络请求框架封装

Flutter 请求网络的三种方式flutter 请求网络的方式有三种,分别是 Dart 原生的网络请求 HttpClient、第三方网络请求 http以及 Flutter 中的 Dio。我们可以比较一下这三种网络请求方式,然后封装为我们方便请求网络的工具类。Dart 原生的网络请求 HttpClient实现 Dart 获取网络数据的请求,一般我们需要以下几个步骤:step 1: 原生的...

2019-05-13 20:27:30 782

原创 Flutter框架分析(五)-- 动画

例子所谓动画其实就是一系列连续变化的图片在极短的时间逐帧显示,在人眼看来就是动画了。这里我们举一个简单的例子先说明一下在Flutter中怎么运行一个动画:import 'package:flutter/material.dart';void main() { runApp(MaterialApp(home: LogoAnim()));}class LogoAnim extends...

2019-05-13 20:26:01 388

原创 用Kotlin实现极简回调

前言在各种开发场景中,回调都有着广泛的应用,命名往往是各种Callback和Listener,其中在Android中接触最早也最常用的可能就是View.OnClickListener了。 mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onC...

2019-05-13 16:01:28 1227

原创 浅谈Kotlin语法篇之基础语法(一)

Kotlin的基本语法的介绍,先从整体上体会kotlin的编程风格一、包的声明在Kotlin中定义包与Java有点不同,在Kotlin中目录与包结构无需匹配,Kotlin的源码可以在磁盘上的任意位置。1、包的声明源文件的通常是以包的声明的开头和Java一样。package com.mikyou.hellokotlin/** * Created by mikyou on 20...

2019-05-13 15:34:10 153

原创 当Kotlin完美邂逅设计模式之单例模式(一)

简述: 从这篇文章开始,我将带领大家一起来探讨一下Kotlin眼中的设计模式。说下为什么想着要开始这么一个系列文章。主要基于下面几点原因:1、设计模式一直是开发者看懂Android源码的一个很大障碍。所以想要理解和运用源码中一些设计思想和技巧,首先看懂源码是第一步,而看懂源码,又得需要设计模式和数据结构算法(我的每周一算法和数据结构文章系列也开始了)作为基础,否则看起来云里雾里,只能死记硬背别...

2019-05-13 15:09:42 158

原创 一点点入坑JetPack:LiveData篇

一、入门1.1、初级官方democlass NameViewModel : ViewModel() { // 这里new了一个MutableLiveData,它是LiveData的实现类,LiveData是抽象的,很明显不能被new val currentName: LiveData<String> by lazy { MutableLiveData...

2019-05-13 14:35:58 339

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除