
Android:开发实践
文章平均质量分 84
主要包括:技术沉淀、使用分享、提供方案等内容。
Swuagg
走一段令人留恋的路,做一个不负自己的人
展开
-
Camera2 与 CameraX 闲谈
Android 有三套关于摄像头的 API,分别是 Camera、Camera2 和 CameraX,其中 Camera 已废弃,在Android 5.0(API level 21)以后推荐使用 Camera2 和 CameraX。Camera2 引入是用来替换 Camera 的,它拥有丰富的 API 可以为复杂的用例提供深入的控制功能,但它使用起来也相对麻烦。CameraX 是在 Camera2 基础上构建的更高层次的库,旨在简化相机操作,提供更方便的 API,降低学习曲线。原创 2025-03-21 10:51:07 · 946 阅读 · 0 评论 -
如何处理Android悬浮弹窗双击返回事件?
方案主要分为如下几步:1、窗口默认不可获取焦点;2、窗口监听焦点的移入/移出事件;3、窗口监听到焦点移入,判断窗口是否可获取焦点,否——设置窗口可获取焦点,是——不做任何操作;4、窗口监听到焦点移出,判断焦点是否在窗口内部,否——设置窗口不可获取焦点,是——不做任何操作;读者可思考如下2个问题,1)问题1:为什么在窗口监听到焦点移入后,要再判断窗口是否可获取焦点?2)问题2:为什么在窗口监听到焦点移出后,要再判断焦点是否在窗口内部?《1.1 准备知识的Hover事件分发部分》原创 2024-03-13 17:58:40 · 1329 阅读 · 0 评论 -
Android 自定义开机动画
一、实现自定义开机动画步骤一:准备 bootanimation.zip步骤二:将bootanimation.zip 放到/system/media/bootanimation.zip下步骤三:重启即可压缩软件:WinRAR与2345好压都可以;压缩方式:必须为“存储”方式;压缩包:不能包含bootanimation文件夹,直接选择文件压缩(不要在bootanimation文件夹上压缩,要进入bootanimation文件夹后选择所有文件(part*文件夹+desc.txt文件)进行压缩);原创 2023-12-12 20:35:37 · 2363 阅读 · 1 评论 -
再次理解Android账号管理体系
我们知道,Android的账号管理体系是用来管理用户在Android设备上的身份验证和授权的系统,包括了对账号的创建、授权、修改和删除等操作的管理。那么,我们为什么要使用Android的账号管理体系? 尽管,我们可以自己使用SP、MMKV、文件或数据库等方式来存储、更新、删除账户、密码或AuthToken;但其实涉及到跨进程通信,实现起来其实是稍显麻烦的;并且对于数据安全,信息加密这块的可靠性也有待商榷。 其实,Android从2.0开始就已加入一个新原创 2023-09-14 21:56:20 · 1630 阅读 · 0 评论 -
Kotlin 一劳永逸实现 TAG
以上方式,都需要在每个类定义相应的 TAG,是比较繁琐的。那么,在 Kotlin 中可以通过扩展函数统一声明 TAG,避免在每个类中定义相应的 TAG。我们可以通过如下两种方式实现:原创 2023-06-20 16:57:14 · 1725 阅读 · 4 评论 -
Android应用-开发框架设计
我们知道常见的应用开发框架主要有:模块化、组件化、插件化,那么随着各个应用不断的迭代升级,应用的开发框架也从最开始的单App模块到多模块化,再到组件化与插件化。那么对于一般的应用开发框架,应该遵循什么样的设计原则呢?首先,我想到的是不能过度设计,一口不能吃一个大胖子,一来就嚷着要做插件化是不太现实的,框架应该跟随应用需求一步步迭代或重构。其次,直接使用AS创建一个新项目,会缺少应用迭代升级的一些常见元素(如常见的Retrofit、Glide、LiveEventBus等三方开源SDK和一些原创 2023-05-19 11:35:24 · 1368 阅读 · 0 评论 -
实操:MVVM实现Android通讯录功能
实操:MVVM实现Android通讯录功能1 权限:读取通讯录 首先,在Android6.0及以上,需在manifest声明读取通讯录的权限,并在代码中动态监测和申请权限。android.Manifest.permission public static final String READ_CONTACTS = "android.permission.READ_CONTACTS"2 实现:读取通讯录2.1 View层:Activity中懒加载ViewModel原创 2023-02-06 16:32:02 · 1248 阅读 · 0 评论 -
Kotlin 实现 Android 系统悬浮窗
Android 弹窗浅谈我们知道 Android 弹窗中,有一类弹窗会在应用之外也显示,这是因为他被申明成了系统弹窗,除此之外还有2类弹窗分别是:子弹窗与应用弹窗。应用弹窗:就是我们常规使用的 Dialog 之类弹窗,依赖于应用的 Activity; 子弹窗:依赖于父窗口,比如 PopupWindow; 系统弹窗:比如状态栏、Toast等,本文所讲的系统悬浮窗就是系统弹窗。系统悬浮窗具体实现权限申请<uses-permission android:name="android.p原创 2021-12-13 20:33:48 · 4555 阅读 · 2 评论 -
Kotlin拿Android本地视频缩略图
Kotlin拿Android本地视频缩略图如何拿到本地视频?怎么拿视频缩略图?缩略图如何压缩?MediaMetadataRetriever可以通过视频系统路径,直接使用getFrameAtTime方法拿到第一帧作为缩略图ThumbnailUtils.createVideoThumbnail其实也是使用的MediaMetadataRetriever,如下源码Glide项目中一般会使用图片加载框架如Glide,它内部也是支持加载视频作为图片的,亦是使用MediaMetadataRetriever原创 2022-11-24 21:20:52 · 3078 阅读 · 0 评论 -
Android-DialogX使用与分享
调用带Activity参数的show方法时,Dialog布局依赖于传入Activity,布局将添加进此Activity中;调用不带Activity参数的show方法时,Dialog布局依赖于应用当前顶部Activity,布局添加进应用当前顶部Activity中。后台弹Dialog:如果Dialog不希望在其他界面弹出,则需要指定Activity;如果Dialog不依赖于某个具体页面,可不传Activity,在任何界面都可弹出。原创 2022-10-26 17:49:50 · 2210 阅读 · 0 评论 -
既要又要的正则匹配规则
在上面这样一个文本编辑框里,点击Server name时,需要在当前光标处插入真实的Server name,且此Server name需要作为一个整体块,光标不可以在Server name中间插入,同时也需要支持整体删除。3.1 如何识别成整体块?要识别成整体块,需要精准确定整体块的位置,有两种方式可实现:其一,利用String的indexOf方法找到index,加上length即可确定其具体位置,但如果同时有多个整体块,这种方式就需要优化;其二,利用正则规则去匹配,可同时匹配到多原创 2022-09-30 15:10:31 · 671 阅读 · 0 评论 -
Android在XML和代码中,同时设置背景,导致背景叠加的问题
由于分析时间有限,暂无权威结论,目测是Android系统Bug~ 小结:作为根布局时,会出现设置背景叠加的问题;作为子布局时,两种方式同时设置背景不会出现背景叠加。6 建议:根布局需要动态改变背景时,XML中不能设置background属性,在代码中动态设置;根布局不需要动态改变背景,在XML中设置背景或者代码中设置;不能即在XML中设置根布局背景,又在代码中动态设置根布局背景。...原创 2022-08-25 18:34:48 · 1960 阅读 · 0 评论 -
Android业务开发中assert的使用
1. assert(boolean)官方解释是:Throws an AssertionError if the value is false and runtime assertions have been enabled on the JVM using the -ea JVM option.简单理解是:用来检测执行结果,当boolean为false时,抛出AssertionError,但是需要在开启对应的JVM选项(-ea)时才生效。2. 使用assert的好处原创 2022-05-18 20:56:53 · 3966 阅读 · 0 评论 -
RecyclerView / VerticalGridView 焦点移动时视图形变的问题
前言在某些情况下,我们需要将装载数据的 RecyclerView 或 leanback-VerticalGridView 控件固定在特定尺寸下,以充分利用屏幕尺寸。但在固定尺寸后,进行焦点移动时,往往会存在Item 被切或超出布局的问题,即:焦点移动时视图形变的问题。本文为此问题提供了一个解决办法,下面来看看具体问题和解决办法。需求描述如下图,需要用列表控件装载已配对的设备(即:图中 Paired devices下面的列表内容),我们可以使用...原创 2021-12-16 22:19:11 · 1543 阅读 · 0 评论 -
Android回声消除调研 20220321
回声产生回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声。在VoIP(Voice over Internet Protocol,基于IP的语音传输 )实时语音通话中,是近端通话者的声音被自己的麦克风拾取后通过网络传到远端,远端扬声器播放出来的声音被麦克风拾取后通过网络又重新发回近端,再加上网络和数据处理等各种延迟的影响,使得近端通话者能够从扬声器中听到自己的刚才所说的话,就产生了回声。回声分类在通信系统中,回声主要分为两类:电路回声和声学回声(线性回声和非线性回声)。原创 2022-03-21 16:44:40 · 10754 阅读 · 0 评论 -
Android性能自测
一、应用启动耗时自测二、帧率查看三、Top命令查看系统资源占用3.1 第一行:任务(进程)3.2第二行:mem状态3.3第三行:swap交换分区3.4第四行:cpu状态3.5第五行:标题四、抓取trace.html文件分析4.1 使用Android Monitor工具4.2使用adb shell atrace命令4.3使用systrace.py命令五、抓取log分析5.1 设置日志缓冲大小5.2 打印crash日志5.3 打印常规日志5.4 打印内核日志原创 2024-03-17 10:32:20 · 1143 阅读 · 0 评论 -
Android中应用与应用通信,以及数据传递
一、前言某海外应用A有需求如下:在A应用首页,提供B应用的入口。点击入口时,判断B应用是否已安装,未安装则跳转Google商店安装,已安装则直接进入B应用。当退回A应用时需回传一个参数。A应用和B应用交互时序图如下:根据需求和时序图,本文从如下三个方面展开来讲:A应用进入B应用、B应用退回A应用、A应用处理B应用退出。二、A应用进入B应用方案点击A应用入口时,判断B应用是否已安装,未安装则跳转Google商店安装,已安装则直接进入B应用;2.1 判断应用是否已安装/**原创 2021-09-27 20:59:32 · 1870 阅读 · 0 评论 -
海外应用插件化(动态模块)之路
1 引言1.1 背景与需求背景:应用是具有多个模块的模块化应用,其中一个模块的功能,是能进行端到端的视频通话(视频通话模块)。需求:视频通话模块接入多个具有相同功能的 SDK,支持动态切换不同 SDK;需求细化:在视频通话模块已接入一个 SDK 的情况下,需要支持动态切换不同 SDK,且不增加应用安装包的大小。1.2 术语和缩略语 术语/缩略语 全称 说明 应用 Application 文章中的应用,都是指海外原创 2021-05-23 18:12:02 · 693 阅读 · 0 评论 -
摄像头和麦克风的使用日志管控方案
应用被杀掉时,摄像头和麦克风会有设备使用结束的回调吗? 已自测,麦克风有结束回调,摄像头没有结束回调(eg:比如录音宝和美图秀秀可以回调麦克风结束,美图秀秀和美颜相机等不能回调摄像头结束,美图秀秀是即使用了摄像头又使用了麦克风) 摄像头没有结束回调的原因:应用被杀时,摄像头像麦克风一样也是有回调触发的,但是此时辅助服务getRootInActiveWindow()获取到的AccessibilityNodeInfo为空,就无法知晓包名,于是不能判断是哪个应用结束原创 2020-09-15 15:45:29 · 2197 阅读 · 0 评论 -
UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f03006
总结问题原因:找不到自定义属性。解决办法: 1. LayoutInflater.from(context)中的context用activity的context或者当前view的context; 2. 在Application中设置自定义主题; 3. 就是在Dialog、Window和GridView中使用到LayoutInflater.from(applicationContext)时,提前给Application设置自定义主题。原创 2020-09-01 22:25:01 · 8928 阅读 · 0 评论 -
关于Json动画与帧动画的对比
关于Json动画与帧动画的异同点,本文主要从流畅度、CPU、内存和文件大小,这4个方面进行的比较。1、运行时的状态图:Json动画运行时,CPU和内存动态图如下:帧动画运行时,CPU和内存动态图如下:2、对比分析(1)从动态图可以分析出如下信息:Json动画更流畅;但是一直占用CPU资源——12%左右;内存一直上升,但差不多上升2M左右会被释放掉;帧动画不太流畅;基本不占用CPU资源——1%左右;内存稳定不变2M左右;(2)文件大小对比:Json动画包括:Json资源文件大小6.96K原创 2020-08-13 11:43:17 · 1924 阅读 · 0 评论 -
Android启动一个只知道包名的APP
网上能找到很多关于本文主题的代码——Android启动一个只知道包名的APP,那我为什么还要在此啰嗦一下呢?你可能参考网上各种方式都打不开APP,还不是很清楚原因,那么我这里就只是做一个提醒吧,害怕你忘了或者没注意到过。我们知道,在TV上开发的APP和在移动端的有一些差别。一个应用运行在TV设备中,必须在它的manifest中定义一个启动activity,用intent filter包含...原创 2020-05-06 16:26:23 · 726 阅读 · 4 评论 -
管理应用自启动的方案
方案一通过setComponentEnabledSetting方式,禁止掉应用的监听开机启动的广播组件。代码如下:getContext().getPackageManager().setComponentEnabledSetting( new ComponentName("包名", "组件名"), PackageManager...原创 2020-04-28 09:40:24 · 651 阅读 · 0 评论 -
Android渐变界面设计
核心代码android:fadingEdgeLength="100dp"android:requiresFadingEdge="vertical"知识要点fadingEdgeLength:设置边框渐变的长度 requiresFadingEdge:表示阴影的方向cacheColorHint:改变渐变的颜色。和在主题中修改colorBackgroundCacheHint属性一样,都能改变...原创 2020-04-02 17:00:17 · 985 阅读 · 0 评论 -
Android实现文本过长时右边渐隐,聚焦时跑马灯效果
写在前面:原创不易,请不要吝啬你的大拇指,点个赞再走呗。然而贴代码很容易,但那不一定有帮助。本文试图从问题点出发,逐步分解,直到实现最终效果。在Android中,我们知道对于控件TextView,在布局时有时候需要单行文本,但可能会存在文本内容的宽度超出了布局宽度,这个时候就需要我们做一定的兼容,不然可能会显示出不太优雅的UI效果。针对于此情况——文本内容的宽度超出了布局宽度,你应该...原创 2020-03-19 21:13:48 · 2548 阅读 · 0 评论 -
Android如何实现阴影
我们知道,Google 在 2014 年 I/O大会上发布的一种新的设计规范——Material Design,这种设计规范给 Android UI 设计带来了很多的变化。比如,更加强调真实性、有立体感,由此引发的一系列针对阴影的UI设计。我相信,很多专注业务逻辑的Android程序员,拿着这样的一个UI效果,往往一头雾水。所以,我仅在此抛砖引玉,希望打开他们的思路,更好的满足UI的要求。好的...原创 2020-03-14 11:54:01 · 2899 阅读 · 0 评论 -
如何开发一个可扩展性的应用?
前言现需要开发一个应用,我们暂且叫它系统诊断应用,它的设计目标是:“提供一个平台,可以实现各个SDK的功能,具有可扩展性。”分析提供一个平台,实现各个SDK的功能:这个到还挺容易,通过接入各个SDK,调用它们提供的接口,即可实现各自功能。具有可扩展性:这个就比较麻烦了,当然,按照常规的做法,我们可以每增加一个SDK,然后在应用中增加对SDK接口的调用即可,但是,这样就使得应用不...原创 2019-12-07 12:59:57 · 1137 阅读 · 0 评论 -
Android进程间通信方式与线程间通信方式的列举
本文只是列举了Android进程间通信和Android线程间通信的常见方式,还请见谅,具体实现或原理可参见其他博客。Android IPCIntent方式Bundle通信 Broadcast方式 文件共享的方式 AIDL方式(基于Binder) Messenger方式(AIDL+Handler Message的方式) ContentProvider的方式 Socket(网络)...原创 2019-11-23 11:58:25 · 575 阅读 · 0 评论 -
MVP实现的类图和包架构
原创 2019-11-09 20:38:04 · 900 阅读 · 0 评论 -
对android:sharedUserId=“android.uid.system“的讨论
使用使用前提:签名要和系统相同。使用时机:应用需要system 权限时;内存不足,或优先级低的时候不容易被干掉时。使用效果:让程序运行在系统进程中,这样就有权限修改系统的值了。应用不添加android.uid.system时崩溃的场景1、Sound-Advanced settings-Sound Feedback设置Low时崩溃崩溃日志:java.lang.Security...原创 2019-10-22 21:14:00 · 2363 阅读 · 1 评论 -
Android BLE4.0 从小白到理解的过程
学习蓝牙低功耗的开发过程,要达到的效果是——利用两台Android手机,通过BLE4.0进行通信,可以发送和接收数据。其中一台Android手机T模拟发出广播,作为BLE设备(周边设备),这个BLE设备在生产环境中就是我们用到的气体检测传感器、智能手环、体重秤、血压计等等; 另一台Android手机B,作为中央设备,搜索手机T发出的广播并连接; 手机B可以接收手机T的数据,也可以发送数据给...原创 2019-03-21 17:42:42 · 1274 阅读 · 0 评论 -
Android性能优化之Activity启动优化
打开一个app的时候速度比较慢,等一会才能看到UI,有很多种原因,下面是我根据这些个情况做出的多种优化,记录一下。1、采用动态布局: 先是优化了布局,减少层级嵌套,使用merge优化等等。但发现加载xml布局还是慢了点,于是改为动态布局,布局的时间减少了好几倍。2、利用MessageQueue.IdleHandler()回调 按照activity的生命周...原创 2019-03-11 17:09:15 · 1661 阅读 · 0 评论 -
Retrofit2中使用OkHttp3缓存数据
在使用RxJava2+Retrofit2+OkHttp3异步访问网络时,常常需要我们设置超时、设置重试、设置缓存和设置拦截器等。那么本文就是记录并分享一下,实际开发中使用的方式,并对关键部分进行了注释。首先,我们知道retrofit本身并没有缓存,所以要通过与OKHttp配合可以实现缓存。接下来,直接看看实现方式:(主要是需要熟练使用OkHttp及其OkHttpClient)1、构造R...原创 2019-01-24 16:19:42 · 1197 阅读 · 0 评论 -
自定义View之VerticalProgress
根据公司UI要求,需要设计一个进度条,竖直的从上往下显示进度。效果图如下:android中自定义view,一般指这三种方式:继承自android原生的控件,如ProgressBar,ListView等; 组合控件,将多个控件组合起来; 完全自定义控件,继承自View。最开始想通过自定义原生的ProgressBar或者SeekBar实现,但是大家都知道,ProgressBar:...原创 2018-12-12 10:55:57 · 324 阅读 · 0 评论 -
Android软键盘挡住输入框
最近遇到了软键盘挡住输入框的问题,上网搜罗半天,找到了一篇针对这个问题讲的比较全(好)的文章,地址放在下面:https://www.diycode.cc/topics/383自己的收获:普通Activity(不带WebView),直接在manifest文件中对activity设置:android:windowSoftInputMode的值adjustPan或者adjustResize即可;...原创 2018-11-07 18:31:57 · 1186 阅读 · 0 评论 -
ListView分页加载,动态从网上拉取数据
最近做项目有个需求:(1)从网上获取分页数据;(2)在Android手机端显示;(3)加载的动画和文本;(4)数据超过40条时显示滑动条等。由于之前自己做的偏底层一点,所以这块内容琢磨了蛮久,最后可以完美实现项目需求,内容见下面:一、首先,需要有个布局文件:activity_story_category.xml<RelativeLayout xmlns:andr...原创 2018-08-20 20:38:53 · 778 阅读 · 0 评论 -
设置Android控件WebView不可滑动
下面两种方式都可以实现,希望对志同道合的搬砖者们有帮助,亲测有效!方式一:原生控件WebViewxml文件:<WebView android:id="@+id/web_view_prize" android:layout_width="match_parent" android:layout_height="303dp" android:layo...原创 2018-08-30 18:57:13 · 5924 阅读 · 2 评论 -
Android跑马灯效果——TextView文字单行循环
xml中设置:android:ellipsize="marquee"android:marqueeRepeatLimit="marquee_forever"android:singleLine="true"代码中设置:textView.setSingleLine();textView.setSelected(true);备注:TextView设置跑马灯之后,右边滚动的时候...原创 2020-01-30 11:59:32 · 848 阅读 · 0 评论 -
管理已打开的activity
以前管理已打开的activity,就是在BaseApplication中放一个集合,然后在BaseActivity的OnCreate()往集合中添加activity,onDestory()删除集合中的该activity,OnResume()等其他生命周期中控制activity集合。然而,最近在看开源项目源码时https://github.com/bingoogolapple/BGASwipeB...原创 2019-10-14 09:59:20 · 361 阅读 · 0 评论 -
启动Activity的方式
显示启动构造方法传入Component,最常用的方式setComponent(componentName)方法setClass/setClassName方法隐式启动通过在AndroidManifest文件中设置action、data、category,让系统来筛选出合适的Activity。action的匹配规则Intent-filter action可以设置多条intent中的action只要与原创 2019-05-23 19:09:46 · 3714 阅读 · 0 评论