安卓日常问题杂谈(一)

背景
关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓开发过程中遇到的小问题,能快速解决问题。
开发环境
androidstudio
win10+
gradle4+
本文涉及知识
WebView
微信开放平台
MPAndroidChart
Dialog
PhotoView
gsyVideoPlayer
主体内容
WebView
(1)安卓在使用webview的页面中,进入页面后,webview在初始化中无故滑动。
原因是webview焦点引起的问题。解决方法:在webview的父布局,加上一下属性:
android:descendantFocusability="blocksDescendants"
微信开放平台
(1)微信打开的网页中,点击跳转到安卓APP失效问题,解决方法:
先配置好安卓的微信sdk链接
PS:注意安卓11和安卓13的适配,这里的链接中有。
值得一提的是,如果项目是直接继承三方的wx页面,如友盟的WXCallbackActivity。这个时候我们开发代码的过程,就区别于官方文档了。如果单单是处理微信中的网页跳转到APP指定页面,核心代码如下图:
@Overridepublic void onReq(BaseReq req) {LogUtil.d("onReq: " + req.getType());switch (req.getType()) {case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:break;case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:goToShowMsg((ShowMessageFromWX.Req) req);break;default:break;}super.onReq(req);}
从上面的代码中,可以看到,是直接重写onReq方法即可。这里我们在里面处理ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX这个指令就好了。至于sdk中 的extInfo怎样定义,得配合开发过程进行,不能一概而论。
MPAndroidChart(安卓图表库)
(1)折线图,初始化时,移动到指定的x,退出页面,内存泄漏
需要下载源码后,进行修改,修改方法如下:
(1-1)找到MoveViewJob类中的recycleInstance方法,增加下面的代码:
public static void recycleInstance(MoveViewJob instance){instance.mViewPortHandler = null;instance.mTrans = null;instance.view = null;pool.recycle(instance);}
(1-2)在调用跳转的过程中,使用方法moveViewToX进行调用即可
(2)取消当前选中的标签
直接调用API
chart.highlightValue(null)
Dialog
(1)通过定义基类的Dialog,进行封装生命周期,便于内存回收释放
很多业务中,都会用到dialog,有些甚至时在dialog里面做很多复杂的操作。
因此,业务中得到dialog的生命周期时非常重要,核心代码如下:
public abstract class BaseCustomDialog extends Dialog {public BaseCustomDialog(@NonNull Context context, int themeResId) {super(context, themeResId);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setOnShowListener(new OnShowListener() {@Overridepublic void onShow(DialogInterface dialog) {lifecycleStart();}});setOnDismissListener(new OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {lifecycleStop();}});}protected void initStyle() {try {Window window = getWindow();if (window != null) {window.getAttributes().windowAnimations = R.style.bottomShowAnimStyle;WindowManager.LayoutParams lp = window.getAttributes();lp.dimAmount = 0.1f; // 设置背景透明度(0.0完全透明,1.0完全不透明)window.setAttributes(lp);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);window.setStatusBarColor(Color.TRANSPARENT); // 设置状态栏颜色window.setNavigationBarColor(Color.TRANSPARENT); // 设置状态栏颜色}} catch (Exception e) {e.printStackTrace();}}protected void initFullLayout(){getWindow().getAttributes().width = ViewGroup.LayoutParams.MATCH_PARENT;getWindow().getAttributes().height = ViewGroup.LayoutParams.MATCH_PARENT;}protected void lifecycleStart() {}protected void lifecycleStop() {}}
上述代码,就是基类dialog的封装,对于子类调用,在方法lifecycleStart(),lifecycleStop()中进行内存的释放管理就可以了。
PhotoView(安卓图片预览控件)
(1)关于PhotoView初始化放大图片逻辑
这里要区分情况,看看你是放大width还是height。这里核心的要点,就是计算出放大的倍数,然后通过setScale方法,进行设计即可。核心代码如下:
ivFhrContent.setScaleLevels(scaleRate / 0.5 > 1 ? 1f : scaleRate / 0.5f, scaleRate, scaleRate * 2);ivFhrContent.setImageDrawable(resourceImage);LogUtil.d("scale: " + scaleRate);new Handler().postDelayed(() -> {ivFhrContent.setScale(scaleRate,0f,ivFhrContent.getHeight() / 2f,false);}, 0);
上述代码中,scaleRate就是放大的系数。
gsyVideoPlayer(安卓播放库)
(1)Https证书问题
核心代码如下:
ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptListener() {@Overridepublic MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {//如果返回 null,就使用默认的return null;}/*** 通过自定义的 HttpDataSource ,可以设置自签证书或者忽略证书* demo 里的 GSYExoHttpDataSourceFactory 使用的是忽略证书* */@Overridepublic HttpDataSource.BaseFactory getHttpDataSourceFactory(String userAgent,@Nullable TransferListener listener,int connectTimeoutMillis, int readTimeoutMillis,boolean allowCrossProtocolRedirects) {//如果返回 null,就使用默认的return new GSYExoHttpDataSourceFactory(userAgent, listener,connectTimeoutMillis,readTimeoutMillis, true);}});
上述设置,可以接受重定向以及播放HTTPS数据
相关文章:
安卓日常问题杂谈(一)
背景 关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓…...
Kitchen Racks 2
Kitchen Racks 2 吸盘置物架 Kitchen Racks-CSDN博客...
嵌入式学习笔记-杂七杂八
文章目录 连续波光纤耦合激光器工作原理主要特点应用领域设计考虑因素 数值孔径(Numerical Aperture,简称NA)数值孔径的定义数值孔径的意义数值孔径的计算示例数值孔径与光纤 四象限探测器检测目标方法四象限划分检测目标的步骤1. 数据采集2.…...
14-7C++STL的stack容器
(一)stack容器的入栈与出栈 (1)stack容器的简介 stack堆栈容器,“先进后出”的容器,且stack没有迭代器 (2)stack对象的默认构造 stack采用模板类实现,stack对象的默认…...
Vue 3 中的响应式系统:ref 与 reactive 的对比与应用
Vue 3 的响应式系统是其核心特性之一,它允许开发者以声明式的方式构建用户界面。Vue 3 引入了两种主要的响应式 API:ref 和 reactive。本文将详细介绍这两种 API 的用法、区别以及在修改对象属性和修改整个对象时的不同表现,并提供完整的代码…...
物业巡更系统助推社区管理智能化与服务模式创新的研究与应用
内容概要 在现代社区管理中,物业巡更系统扮演着至关重要的角色。首先,我们先来了解一下这个系统的概念与发展背景。物业巡更系统,顾名思义,是一个用来提升物业管理效率与服务质量的智能化工具。随着科技的发展,传统的…...
windows蓝牙驱动开发-生成和发送蓝牙请求块 (BRB)
以下过程概述了配置文件驱动程序生成和发送蓝牙请求块 (BRB) 应遵循的一般流程。 BRB 是描述要执行的蓝牙操作的数据块。 生成和发送 BRB 分配 IRP。 分配BRB,请调用蓝牙驱动程序堆栈导出以供配置文件驱动程序使用的 BthAllocateBrb 函数。;初始化 BRB…...
Linux网络之序列化和反序列化
目录 序列化和反序列化 上期我们学习了基于TCP的socket套接字编程接口,并实现了一个TCP网络小程序,本期我们将在此基础上进一步延伸学习,实现一个网络版简单计算器。 序列化和反序列化 在生活中肯定有这样一个情景。 上图大家肯定不陌生&a…...
linux设置mysql远程连接
首先保证服务器开放了mysql的端口 然后输入 mysql -u root -p 输入密码后即可进入mysql 然后再 use mysql; select user,host from user; update user set host"%" where user"root"; flush privileges; 再执行 select user,host from user; 即可看到变…...
react-native网络调试工具Reactotron保姆级教程
在React Native开发过程中,调试和性能优化是至关重要的环节。今天,就来给大家分享一个非常强大的工具——Reactotron,它就像是一个贴心的助手,能帮助我们更轻松地追踪问题、优化性能。下面就是一份保姆级教程哦! 一、…...
erase() 【删数函数】的使用
**2025 - 01 - 25 - 第 48 篇 【函数的使用】 作者(Author) 文章目录 earse() - 删除函数一. vector中的 erase1 移除单个元素2 移除一段元素 二. map 中的erase1 通过键移除元素2 通过迭代器移除元素 earse() - 删除函数 一. vector中的 erase vector 是一个动态数组&#x…...
性能测试丨内存火焰图 Flame Graphs
内存火焰图的基本原理 内存火焰图是通过分析堆栈跟踪数据生成的一种图形化表现,能够展示应用程序在运行时各个函数的内存占用情况。火焰图的宽度代表了函数占用的内存量,而火焰的高度则显示了函数在调用栈中的层级关系。通过这种可视化方式,…...
AIGC的企业级解决方案架构及成本效益分析
AIGC的企业级解决方案架构及成本效益分析 一,企业级解决方案架构 AIGC(人工智能生成内容)的企业级解决方案架构是一个多层次、多维度的复杂系统,旨在帮助企业实现智能化转型和业务创新。以下是总结的企业级AIGC解决方案架构的主要组成部分: 1. 技术架构 企业级AIGC解决方…...
Linux 入门 常用指令 详细版
欢迎来到指令小仓库!! 宝剑锋从磨砺出,梅花香自苦寒来 什么是指令? 指令和可执行程序都是可以被执行的-->指令就是可执行程序。 指令一定是在系统的每一个位置存在的。 1.ls指令 语法: ls [选项][目…...
【R语言】流程控制
R语言中,常用的流程控制函数有:repeat、while、for、if…else、switch。 1、repeat循环 repeat函数经常与 break 语句或 next 语句一起使用。 repeat ({x <- sample(c(1:7),1)message("x ", x, ",你好吗?")if (x …...
猿人学第一题 js混淆源码乱码
首先检查刷新网络可知,m参数被加密,这是一个ajax请求 那么我们直接去定位该路径 定位成功 观察堆栈之后可以分析出来这应该是一个混淆,我们放到解码平台去还原一下 window["url"] "/api/match/1";request function…...
计算机组成原理(2)王道学习笔记
数据的表示和运算 提问:1.数据如何在计算机中表示? 2.运算器如何实现数据的算术、逻辑运算? 十进制计数法 古印度人发明了阿拉伯数字:0,1,2,3,4,5,6&#…...
【AI日记】25.01.26
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Forecasting Sticker Sales 读书 书名:自由宪章 律己 AI:6 小时作息:00:30-8:30短视频:大于 1 小时读书和写作&a…...
三. Redis 基本指令(Redis 快速入门-03)
三. Redis 基本指令(Redis 快速入门-03) 文章目录 三. Redis 基本指令(Redis 快速入门-03)1. Redis 基础操作:2. 对 key(键)操作:3. 对 DB(数据库)操作4. 最后: Reids 指定大全(指令文档): https://www.redis.net.cn/order/ Redis…...
设计模式的艺术-代理模式
结构性模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解代理模式 代理模式(Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 代理模式类型较多…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
