Android
文章平均质量分 85
记录自己日常中遇到的问题,积累点滴,汇成江河
qijingwang
初心易得,始终难守
展开
-
ANDROID 设备写入文件,立即断电重启后,文件丢失,数据没有保存问题
android开发的过程中碰到写入文件后,立即断电重启,发现写入的文件丢失了原创 2022-06-20 22:22:56 · 3081 阅读 · 1 评论 -
Android Bitmap 理解
一、BitmapBitmap是Android系统中图像处理的最重要类之一。用它可以获取图像信息,对图像进行剪切、旋转、缩放等操作,并可以指定格式保存图像文件。常用方法: public int getDensity():获取图片的像素密度 public void reconfigure(int width, int height, Config config):重新设置图片的宽高及解码格式 public void setWidth(int width) public原创 2022-05-13 14:27:06 · 926 阅读 · 0 评论 -
Fragment的startActivityForResult和Activity的startActivityForResult的区别
1. 前言Activity、FragmentActivity、Fragment中都有startActivityForResult()方法,也都有用以接收结果的onActivityResult()方法,那他们有什么区别吗?用法上有什么不同吗?之所以注意到这个问题,是因为最近一次在Fragment中使用了getActivity().startActivityForResult()去调用图片选择器,结果发现在Fragment的onActivityResult无法接收到返回的结果。2. 表现假设.原创 2022-02-16 18:55:46 · 838 阅读 · 0 评论 -
Android绘图之Canvas状态保存和恢复
Save函数注释/**Saves the current matrix and clip onto a private stack. <p> Subsequent calls to translate,scale,rotate,skew,concat or clipRect, clipPath will all operate as usual, but when the balancing call to restore() is made, those calls will原创 2022-01-21 16:15:13 · 2632 阅读 · 0 评论 -
Android广播
1.广播的分类(1)按照发送的方式分类标准广播 是一种异步的方式来进行传播的,广播发出去之后,所有的广播接收者几乎是同一时间收到消息的。他们之间没有先后顺序可言,而且这种广播是没法被截断的。 有序广播 是一种同步执行的广播,在广播发出去之后,同一时刻只有一个广播接收器可以收到消息。当广播中的逻辑执行完成后,广播才会继续传播。(2)按照注册的方式分类动态注册广播 顾名思义,就是在代码中注册的。 静态注册广播 动态注册要求程序必须在运行时才能进行,有一定的局限性,如果我们需要在原创 2021-12-28 18:33:40 · 9079 阅读 · 1 评论 -
Android Jetpack系列之MVVM使用及封装
Android开发架构如果开发过程中大家各自为战,没有统一规范,久而久之,项目代码会变得混乱且后续难以维护。当使用统一的架构模式后,有很多的好处,如:统一开发规范,使得代码整洁、规范,后续易于维护及扩展 提高开发效率(尤其在团队人员较多时) 模块单一职责,使得模块专注自己内部(面向对象),模块间解耦总之,开发架构是前人总结出来的一套行之有效的开发模式,目的是达到高内聚,低耦合的效果,使得项目代码更健壮、易维护。Android中常见的架构模式有MVC(Model-View-Controlle原创 2021-12-06 16:25:19 · 593 阅读 · 0 评论 -
关于MVVM的一些秘密
前言MVVM作为一种架构模式,在Android中的主要落地实践脱离不开两个核心类LiveData和ViewModel。阅读之前需要你具备使用LiveData和ViewModel的基本使用。有的放矢,带着目的的看这篇文或许你会更有收获。这篇文能帮你解除这些疑惑ViewModel怎么实现多个Fragment之间数据共享? Activity横竖屏切换时,ViewModle是怎么死里逃生的? ViewModleScope是怎么感知组件生命周期而自杀(cancel)? LiveData如何防止内存泄原创 2021-12-06 15:55:17 · 389 阅读 · 0 评论 -
LiveData数据倒灌与粘性事件
粘性事件事件发送后,观察者才订阅,订阅后会收到之前的事件。当先订阅,后事件发送,protected void setValue(T value) { assertMainThread("setValue"); mVersion++; mData = value; dispatchingValue(null); }这里以setValue来分析,会调用dispatchingValue(),注意这里传的是null。原创 2021-12-06 15:30:05 · 2366 阅读 · 0 评论 -
OnLongClickListener的判断流程
onLongClick()的返回值从View.setOnLongClickListener()说起,setOnLongClickListener()会为View设置一个长按的监听,在长按控件时就能收到事件的回调; mFinishBtn.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) {原创 2021-11-12 11:53:12 · 1058 阅读 · 0 评论 -
Android Camera1-Camera2-CameraView和CameraX使用
基础知识Android Framework提供Camera API来实现拍照与录制视频的功能,目前Android有三类API,Camera 此类是用于控制设备相机的旧版 API,现已弃用,在Android5.0以下使用 Camera2 此软件包是用于控制设备相机的主要 API,Android5.0以上使用 CameraX 基于Camera 2 API封装,简化了开发流程,并增加生命周期控制相关开发类android.hardware.camera2 控制相机的核心API,使用它可以实原创 2021-07-15 17:57:16 · 5761 阅读 · 2 评论 -
Dialog全屏设置修改状态栏颜色兼容刘海屏
一、Dialog的全屏设置public class FullScreenDialog extends Dialog { public FullScreenDialog(@NonNull Context context) { super(context); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan原创 2021-06-30 20:08:49 · 2581 阅读 · 1 评论 -
理解Android缓存机制——LruCache
关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存。这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻底理解Android中的缓存机制。一、Android中的缓存策略一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。因此LRU(Least .原创 2021-06-04 11:03:50 · 343 阅读 · 0 评论 -
Handler的同步屏障机制
1. Handler中异步消息 在介绍同步屏障的时候,我们先来看Handler中的异步消息。通常情况下,我们使用Handler向任务队列添加的Message都是同步的,如果我们想要添加一个异步的Message,由如下两个方式:Handler的构造方法有一个async参数,我们在new Handler的时候传为true就行了,后续使用该Handler添加的Message都是异步。 private boolean enqueueMessage(MessageQueue queue.原创 2021-03-17 16:13:20 · 352 阅读 · 0 评论 -
更换 Android 原生 Toast 的样式
Toast 使用的 Layout在源码中写到:View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);也就是:com.android.internal.R.layout.transient_notification其布局文件如下:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/andr原创 2021-01-22 11:51:51 · 2610 阅读 · 2 评论 -
HTTP请求方式GET与HEAD的区别
GET请求从服务器上获取资源200:在响应体中放有数据。HEAD请求HEAD方法与 GET 方法类似,也是请求从服务器获取资源,服务器的处理机制也是一样的,但服务器不会返回请求的实体数据,只会传回响应头,也就是资源的“元信息”。HEAD 方法可以看做是 GET 方法的一个“简化版”或者“轻量版”。因为它的响应头与 GET 完全相同,所以可以用在很多并不真正需要资源的场合,避免传输 body 数据的浪费。比如,想要检查一个文件是否存在,只要发个 HEAD 请求就可以了,没有必要用 GET 把原创 2021-01-21 17:44:45 · 2122 阅读 · 0 评论 -
移动 APP 网络优化概述
一般开发一个 APP,会直接调用系统提供的网络请求接口去服务端请求数据,再针对返回的数据进行一些处理,或者使用AFNetworking/OKHttp这样的网络库,管理好请求线程和队列,再自动做一些数据解析,就结束了。但对于一些大型 APP,还会想针对网络的一些问题进行进一步优化,包括:速度:网络请求的速度怎样能进一步提升? 弱网:移动端网络环境随时变化,经常出现网络连接很不稳定可用性差的情况,怎样在这种情况下最大限度最快地成功请求? 安全:怎样防止被第三方窃听/篡改或冒充,防止运营商劫持,同时又原创 2021-01-12 16:21:42 · 471 阅读 · 0 评论 -
Scroller的原理剖析及使用
一、前言什么是弹性滑动?就是一个View是在一段时间内完成滑动的,而不是一瞬间完成的,从原理来说,将一次滑动分解为若干个小的滑动,在一小段时间内完成,那么连贯起来就能看做一次弹性滑动。本文将以弹性滑动方式之一:Scroller来讲述其用法及原理。二、Scroller原理剖析我们知道View自带的scrollTo和scrollBy能实现View内容的滑动,而Scroller则是基于这两个方法而产生的一个辅助类,能使scrollTo/By的滑动变成弹性滑动一样,所以Scroller说到底也是用了sc原创 2020-12-10 11:07:22 · 464 阅读 · 0 评论 -
Choreographer机制和卡顿优化
Choreographer 是 Android 4.1 google的黄油计划新增的机制,用于配合系统的 VSYNC 中断信号。其主要用途是接收系统的 VSYNC 信号,统一管理应用的输入、动画和绘制等任务的执行时机。也就是(CALLBACK_INPUT,CALLBACK_ANIMATION,CALLBACK_TRAVERSAL,CALLBACK_COMMIT),而我们主要的用途就是来查看app的帧率情况,下面来具体分析下这个神秘的类当我们进行invalidate或者requestLayout时,总会执行原创 2020-12-03 17:50:33 · 2077 阅读 · 0 评论 -
Android Studio无法执行Java类的main方法问题及解决方法
Android Studio升级到哦最新版3.6.1后,新建了个项目,发现无法执行Java类的main方法。试了网上的各种方法,比如切换gradle离线模式、gradle.properties中添加android.enableAapt2=false等,我还尝试了重新情况Gradle缓存、重新下载gradle等方式,都没用。环境android studio版本:3.6.1gradle版本:5.6.4gradle插件版本:3.6.1错误提示11:41:35 PM: Executing ta原创 2020-11-27 20:24:39 · 1992 阅读 · 0 评论 -
AppBarLayout动态设置View.GONE的空白占位问题
遇到关于AppBarLayout的一个坑点,估计会遇到的人也会不少,但网上这方面解决方案资料空白,特地再次记录。布局就是标准的 ·CoordinatorLayout· 嵌套布局,隐藏掉无关代码, 结构如下:<?xml version="1.0" encoding="utf-8"?><androidx.coordinatorlayout.widget.CoordinatorLayout> <com.google.android.material.app.原创 2020-11-03 23:34:23 · 1377 阅读 · 0 评论 -
Android RecyclerView 滚动的技巧知识
简述在Android 开发中,RecyclerView 是我们开发者最为常用的控件,用于展示大量的数据,为此其相关的item滚动知识尤为重要,此篇文章不讲解原理,而是提供相关函数,给需要的小伙伴们提供思路,其内部原理有兴趣的可以去阅读源码。RecyclerView 的几个常见滚动方法scrollToPosition(int position) 该方法是滚动到指定item,是瞬间就移动到我们设置position,若超过适配器的item数目(假设只有20个item,却指定滚动到第30个),是没有效原创 2020-11-03 22:06:16 · 1316 阅读 · 0 评论 -
创建Dialog所需的上下文为什么必须是Activity?
1.前言记得以前在创建Dialog的时候知道在Dialog的构造方法中需要一个上下文环境,而对这个“上下文”没有具体的概念结果导致程序报错,后来在网上搜索答案,发现Dialog需要的上下文环境只能是activity。由于项目时间的原因没有深入的去研究为什么只能是activity,所以接下来这篇文章将会从源码的角度来彻底的理顺这个问题。2.报错信息先来看一个错误示例,在Dialog的构造方法中传入一个Application的上下文环境。看看程序是否报错: Dialog d.原创 2020-10-29 14:14:41 · 975 阅读 · 1 评论 -
Recyclerview的缓存机制
前言Android新增的Recyclerview主要用于代替ListView。Recyclerview可扩展性强。可以通过LayoutManager形成线性(横向与竖向)、网格、瀑布流布局。 通过OnItemTouchListener监听 Item 的事件,虽然比ListView.OnItemClickListener麻烦了点,但是可以实现更复杂的功能,比如item滑动。 提供了notifyItemInserted、notifyItemRemoved、notifyItemChanged、noti原创 2020-10-15 17:36:23 · 766 阅读 · 0 评论 -
视频画面帧的展示控件SurfaceView及TextureView对比
SurfaceView是什么 ? SurfaceView优点及缺点? SurfaceView中双缓冲? TextureView是什么? TextureView优点及缺点? 两者的性能相比如何? 播放器应该选择谁? SurfaceView是什么?它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有对应的WindowState,在SurfaceFling...原创 2020-09-14 19:39:57 · 779 阅读 · 0 评论 -
为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
在一个 Android 应用中,我使用FragmentPagerAdapter来处理多 Fragment 页面的横向滑动。不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希望能够通过调用 mAdapter.notifyDataSetChanged() 来触发 Fragment 页面使用新的数据调整或重新生成其内容,可是当我调用 notifyDataSetChanged() 后,发现什么都没发生。搜索之后发现不止我一个人碰到这个问题,大家给出的解决办法五花八门,有些确实解决了问题,..原创 2020-09-07 14:48:58 · 415 阅读 · 0 评论 -
android中View的GONE和INVISIBLE的原理
GONE真的隐藏;INVISIBLE不可见但是预留了View的位置;网上千篇一律的重复着这两句话并举着例子,并没有观察本质来作区分。查看源码后得知其区别希望广大朋友能够借鉴,源码如下: /* Check if the GONE bit has changed */ if ((changed & GONE) != 0) { needGlobalAttributesUpdate(false); requestLayout()原创 2020-09-03 11:44:31 · 2095 阅读 · 0 评论 -
Android View的生命周期
View生命周期相关方法View是什么?官方源码注释中的定义:这个类是用户接口的基础构件。View表示屏幕上的一块矩形区域,负责绘制这个区域和事件处理。View是所有widget类的基类,Widget类用于创建交互式UI构件(按钮,输入框等)。View类的ViewGroup子类是layout的基类,Layout是一个不可见的容器,它保存着View(或ViewGroup)并定义这些View的layout 属性。简单点说,View就是屏幕上的一块矩形区域,我们可以在这块区域绘制我们想让用户看到的图形原创 2020-08-28 16:15:50 · 660 阅读 · 0 评论 -
android 继承viewgroup的类默认状态下不调用onDraw
ViewGroup是继承自View的,那么直接去查看View。通过代码跟踪发现在ViewGroup中实现OnDraw方法,其实是调用View中的draw(Canvas canvas)方法,如下:public void draw(Canvas canvas) { final int privateFlags = mPrivateFlags; final boolean dirtyOpaque = (privateFlags & PFLAG_DIRTY_MASK)原创 2020-08-27 16:46:29 · 260 阅读 · 0 评论 -
HTTPS 原理浅析及其在 Android 中的使用
本文首先分析HTTP协议在安全性上的不足,进而阐述HTTPS实现安全通信的关键技术点和原理。然后通过抓包分析HTTPS协议的握手以及通信过程。最后总结一下自己在开发过程中遇到的HTTPS相关的问题,并给出当前项目中对HTTPS问题的系统解决方案,以供总结和分享。1.HTTP协议的不足HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,存在的问题如下:通信使用明文(不加密),内容可能会被窃听; 不验证通信方的身份,有可能遭遇伪装; 无法证明报文的完整性,所原创 2020-07-21 17:10:48 · 251 阅读 · 0 评论 -
Error: Program type already present: com.alibaba.android.arouter.routes.ARouter$$Group$$...
这个问题的原因在与不同的module中的RouterPah的 一级名字相同造成的,或者项目中出现了相同的路径。比如项目结构是app ,moudleA,moduleB,那么moudleA 如果出现的路径名是:"/module/test/testvideo",moduleB中出现了路径名:"/module/play/test";此时就会报上边的错,因为不同module的路由路径的一级命名不能相同。...原创 2020-05-26 10:40:53 · 594 阅读 · 0 评论 -
Acitivity与ActivityRecord的关系
ActivityRecord是AMS调度Activity的基本单位,它需要记录AndroidManifest.xml中所定义Activity的静态特征,同时, 也需要记录Activity在被调度时的状态变化,因此ActivityRecord这个类的属性比较多。属性 描述 ActivityInfo 从<activity>标签中解析出来的信息,包含launchMode,...原创 2020-03-31 12:13:16 · 924 阅读 · 0 评论 -
Java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
Java 下 IO 中 FileReder 和 FileInputStream 分别是以字符和字节的形式来完成数据的读取的,然而返回值确是 int 类型的数据,这样做的核心目的只是要取到到一个 int 类型下的 -1 来表示数据流的末尾。为什么要这样做?又是怎么实现的呢?首先看 FileReder :FileReader fr = new FileReader("src.txt");...原创 2018-03-29 14:46:04 · 5285 阅读 · 5 评论 -
android gradle依赖:implementation 和compile的区别
2017 年google 后,Android studio版本更新至3.0,更新中,连带着com.android.tools.build:gradle 工具也升级到了3.0.0,在3.0.0中使用了最新的Gralde 4.0 里程碑版本作为gradle的编译版本,该版本gradle编译速度有所加速,更加欣喜的是,完全支持Java8。当然,对于Kotlin的支持,在这个版本也有所体现,Kotlin插...原创 2018-04-03 16:51:27 · 9265 阅读 · 0 评论 -
解决Android单个dex文件不能超过65535个方法问题
一、找坑:谷歌规定单个dex文件中的方法不能超过65536的限制我们编写项目过程中在工程的lib文件夹下引用的第三方插件jar包太多或者项目过大,编译运行时就有可能报出com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536错误。看到这个错误说明你的方法加起来已经超过了65536这个数目。但是谷歌规...原创 2018-04-08 16:40:14 · 334 阅读 · 0 评论 -
xrecyclerview有的手机不能加载更多
一、确定问题首先确定一下问题到底是什么,测试说xrecyclerview(一个github上的三方库,不知道的可以去github上找找,有细节上的bug整体来说很好用)的上拉加载更多功能在有的手机上可以加载更多,有的手机上不能加载更多,这说明这个功能是没有问题的,因为有手机可以实现,难道是手机的问题?拿来测试说的不能上拉加载更多的手机,连上adb,查看一下日志,没有很多信息,就是onLoadMor...原创 2018-04-12 10:38:38 · 878 阅读 · 1 评论 -
RecyclerView调用notifyDataSetChanged()不起作用
背景 上周,之前的一个朋友发消息给我,RecyclerView的notifyDataSetChanged()方法没有用。心里一想,自己之前不就是这么用的么。但是好像脑海里有看到过也有人遇到了类似的问题,所以还是把迷雾拨开吧。探索 自己一直有一个习惯,遇到问题不会先谷歌,会先点到源码里面看一下,再查官方文档,再谷歌。点进notifyDataSetChanged源码里面看了一下,就一行代码,但是能看到...原创 2018-04-28 13:50:45 · 6275 阅读 · 7 评论 -
Cannot call this method while RecyclerView is computing a layout or scrolling
在使用RecyclerView在出现的问题: Process: com.example.administrator.sgandroid, PID: 6123 java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling ...原创 2018-05-08 20:11:10 · 2906 阅读 · 0 评论 -
RecyclerView滑动到指定位置,并指定位置在顶部
一般我们用 mRecycleview.smoothScrollToPosition(0)滑动到顶部,具有滚动效果,但是如果我们想滚动到任意指定位置,那么smoothScrollToPosition()就不能保证所指定item位于屏幕顶部,那么一下提供下我解决的方法:1.第一种方法此方法能实现指定位置位于屏幕顶部,但是不具有平滑滚动视觉效果: if (position != -1) {...原创 2018-04-17 14:04:38 · 1833 阅读 · 0 评论 -
安卓 Logger框架的使用
本文目录1、Logger简介2、简单使用3、修改默认配置4、设置标签5、关闭日志输出6、写日志到文本7、注意8、遗憾注意事项1、Logger简介Logger相对系统自带log,输出格式清晰,功能更全,使用方便作者:Orhan Obutgithub:https://github.com/orhanobut/logger2、简单使用1)添加依赖impleme...原创 2019-09-20 13:18:30 · 552 阅读 · 0 评论 -
图片加载1:一些必要常识
(1)每个进程分配的内存空间是多少?我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMe...原创 2019-09-23 20:30:13 · 178 阅读 · 0 评论