Android
文章平均质量分 59
尹中文
移动开发者
展开
-
Android 14 应用适配指南
在Android 14,app可以在系统分享表中自定义行为。在分享表中,可借助ChooserAction.Builder来构建自定义ChooserAction,指定ChooserActions的列表作为使用Intent.createChooser创建的Intent的Intent.EXTRA_CHOOSER_CCUSTOM_ACTIONS。以下是创建自定义行为的一般过程以发送多张图片为例//创建Intent//各种类型的图像//添加自定义行为的intentmContext,1,原创 2023-12-15 16:16:21 · 1864 阅读 · 0 评论 -
android混淆编译-proguard通用混淆配置文件编写
【代码】android混淆编译-proguard通用混淆配置文件编写。原创 2023-12-04 16:22:55 · 410 阅读 · 0 评论 -
Android 透明度颜色值对照表
比如:50%透明度, 50%也就是256的一半即128,因为是从0开始算的,所以是 127,转换成16进制就是 7F。Android中的颜色值通常遵循RGB/ARGB标准,使用时通常以“#”字符开头,以16进制表示。透明度分为256个等级,即 0~255,00表示完全透明,FF开始表示完全不透明。Android中的颜色值一般格式是:#AARRGGBB。也可以通过设置字体颜色,或者设置背景色来达到预期效果。我们的UI小姐姐就喜欢给。注:00是完全透明,FF就是完全不透明。,这个需要自己判断一下。原创 2023-12-04 12:01:16 · 1584 阅读 · 0 评论 -
Android 打包aar包含第三方aar 解决方案
因项目需要,打包aar包含第三方aar,如果直接对module进行打包会产生一些问题。错误信息说的很清楚构建aar不支持本地aar文件依赖fat-aar 能将依赖项合并并嵌入到生成的aar文件中。由于fat-aar不再维护,使用起来有诸多需要修改的地方,而不支持高版本的gradle,极其坑爹,踩坑后找到替代方案,支持高版本的gradle无需修改脚本文件。原创 2023-11-24 15:03:37 · 1172 阅读 · 2 评论 -
android中的Package安装、卸载、更新替换流程
android系统在安装,删除,替换,清除数据等与应用相关的动作时,会发出对应的Broadcast,上层的应用通过注册相应的广播事件来做相应的处理。1,ACTION_PACKAGE_ADDED----------当有新的包安装成功的时候,系统会发出此广播。2,ACTION_PACKAGE_REMOVED-----当有包被卸载的时候,系统会发出此广播。3,ACTION_PACKAGE_REPLACED----当有包被更新的时候,系统会发出此广播。上面两种广播的用法,很多朋友也已经很熟悉,通过。原创 2023-10-31 16:37:08 · 743 阅读 · 0 评论 -
Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包
可以通过设置File->setting -->Experimental→取消勾选“Do not build Gradle task list during Gradle sync"Sync完成后,在Gradle里就有Tasks了,这样通过Assemble就能快速的编译aar release包了。1. 在编译aar包或者编译module的时候,没有release包,我们一般都是通过assemble进行编译。②然后通过File→Sync Project with Gradle Files。原创 2023-10-23 11:41:10 · 1557 阅读 · 0 评论 -
DecimalFormat 多语言、本地化指定Locale
DecimalFormat再未指定Locale会使用默认的Locale,不同的Locale会导致格式化时出现出乎预期的现象。如Locale为西班牙时,小数点符号为",“千位分隔符为”."。所以在多语言或者需要本地化的情况下,使用DecimalFormat最好指定Locale避免格式化出现异常。原创 2023-10-09 14:58:00 · 170 阅读 · 0 评论 -
异常解决:android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow
问题如何引起:解析出音乐专辑图片时,需要把图片转byte数组存入数据库,当下次查询数据库该专辑数据时报上面错误,行太大而无法写入CursorWindow(CursorWindow默认的最大值为2MB)第二个参数cursorWindowSize设置大小, 这里修改CursorWindow的大小为5M。图片入库数据库时,先对图片进行压缩处理,尽量控制其大小在2M内。设置一下CursorWindow的大小即可。原创 2023-09-18 19:52:57 · 1465 阅读 · 0 评论 -
Android13适配-Google官方照片视频选择器
照片选择器提供了一个直观的界面,便于与您的应用分享照片。照片选择器的界面可供浏览和搜索,并按日期降序向用户显示其媒体库中的文件。如中所示,照片选择器为用户提供了一种安全的内置授权方式,让用户可以仅向应用授予对所选图片和视频的访问权限,而不是对整个媒体库的访问权限。该工具会自动更新,让应用用户能够长期使用扩展的功能,而无需更改任何代码。原创 2023-09-13 18:16:45 · 1463 阅读 · 1 评论 -
Android13-图片视频选择器
在compileSDK = 33 时,谷歌在安卓新增了 图片选择器 功能,支持单选、多选、选图片、视频等操作,并且不需要额外获取照片/音频权限。原创 2023-09-12 17:54:53 · 845 阅读 · 0 评论 -
RecyclerView数组越界异常java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position
在进行数据移除和数据增加时,务必要保证Adapter中的数据和移除的数据保持一致!就是如果你更新你的集合后,调用Adapter的新出现的notifyxxxx方法时,adapter 的更新预期结果和实际集合更新结果不同,那么就会出现异常了。数据一致其实说的是要保证数量一致。就是说Adapter有个size,你的集合有个size。反复插拔U盘触发音频自动扫描,导致可能集合list的size变了,但未及时通知Adapter刷新数据就出错了。1).方案一:将集合list和adapter的list隔开。原创 2023-08-01 17:34:28 · 529 阅读 · 0 评论 -
Android Studio 导入自己编译的 framework.jar
系统级 App 开发,很多时候需要访问 framework 层隐藏的接口(接口前的注释里加了@hide),有时候甚至是定制的系统,在 framework 层加入了新的接口,为了使用这些接口,需要自己编译 framework 的源码生成 jar 包,如果编译 debug 版本,直接把 下面拷出来,如果是 user 版本:Android N/O:Android P/Q:Android R:将framework.jar放在Module的libs下面 添加对 framework.jar 的依赖原创 2022-06-30 15:12:44 · 3848 阅读 · 1 评论 -
MediaPlayer: android 利用mediaplayer播放音频停止后出现mediaplayer went away with unhandled event
项目场景:每次播放下一曲时会先release当前的,再播放下一曲,也会概率出现上面的错误,当出现此错误后,导致播放器不能正常播放下一曲,会回调onCompletion()方法。如题,在onDestory中停止MediaPlayer后概率会上述错误。出现这种状况时需要在release前先reset一下。原创 2023-07-25 11:07:15 · 549 阅读 · 0 评论 -
RecyclerView 一次性加载大量数据时(2000条音频数据),导致UI线程卡顿,频繁GC的问题
公司项目有这么一个需求,扫描sdCard或U盘的音频数据,并分类展示出来,当数据量比较大时(2000多条数据以上),显示列表慢和滑动列表会很卡。原创 2023-07-24 14:05:59 · 980 阅读 · 0 评论 -
SurfaceView出现ANR:Surface has already been released的解决办法
项目中有这样一种场景会引起SurfaceView出现ANR,在主Activity中创建并使用SurfaceView,然后不停的进入子ActivityB ,返回主Activity再进入子ActivityB这样循环,就会出现ANR的问题。产生ANR的原因:简而言之,处于在lockCanvas和unlockCanvasAndPost之间时,SurfaceView销毁了,导致unlock失败,出现了死锁。第四步:SurfaceView重新创建,尝试lock,因为上次的锁没有释放,所以进入了无限等待。原创 2023-04-27 14:43:56 · 2312 阅读 · 2 评论 -
Glide图片加载框架是如何确定图片加载的生命周期
其实这是最简单的一种情况,FragmentActivity、v4 包下的Fragment、还是app 包下的Fragment,最终的流程都是一样的,和Activity 是同步的,如果Activity 被销毁了,Fragment 是可以监听到的,这样Glide 就可以。实现,没什么需要解释的。可以看到,with()方法的重载种类非常多,既可以传入Activity,也可以传入Fragment 或者。with()方法是Glide 类中的一组静态方法,它有好几个方法重载,我们来看一下Glide 类中所。原创 2023-04-24 09:56:40 · 535 阅读 · 1 评论 -
解决Android 应用targetSdkVersion小于24(Android N)运行在高版本设备无法全屏的BUG
进行公司车机设备开发时,由于屏幕比例比较特殊(1920x720),导致部分应用显示时左侧和底部有很大的黑边,使用dumpsys分析黑边的View,移除后发现仍存在,后确定为低版本默认比例问题,耗费了几个小时,记录下这个问题。原创 2023-04-14 10:48:22 · 946 阅读 · 0 评论 -
bitmap的六种压缩方式,Android图片压缩
以上就是5种图片压缩的方法,这里需要强调,他们的压缩仅仅只是对android中的bitmap来说的。如果将这些压缩后的bitmap另存为sd中,他们的内存大小并不一样。android手机中,图片的所占的内存大小和很多因素相关,计算起来也很麻烦。为了计算出一个图片的内存大小,可以将图片当做一个文件来间接计算,用如下的方法:123或者try {try {123456789101112正在上传…重新上传取消上面两个方法计算的结果是一样的。原创 2023-03-29 15:15:52 · 2092 阅读 · 0 评论 -
安卓Activity Dialog和Toast 的Window 创建过程
的handleResumeActivity 方法中,首先会调用Activity 的onResume 方法,在ActivityThread。Activity 的attach 方法里,系统会创建所属的Window 对象并设置回调接口,PolicyManager 的makeNewWindow 方法完成的,创建后的对象实际就是。Toast 内部的视图由两种方式,一种是系统默认的样式,另一种是setView 指。在Activity 的创建过程中,最终会由ActivityThread 的。Toast 里的TN 接口。原创 2023-03-24 09:39:28 · 403 阅读 · 0 评论 -
使用RecyclerView实现旋转3D画廊效果
RecyclerView是google官方在support.v7中提供的一个控件,是ListView和GridView的升级版。该控件具有高度灵活、高度解耦的特性,并且还提供了添加、删除、移动的动画支持,分分钟让你作出漂亮的列表、九宫格、瀑布流。先来看下如何简单的使用RecyclerView设置LayoutManager设置Adapter(继承RecyclerView.Adapter)LinearLayoutManger:提供了竖向和横向线性布局(可实现ListView功能)原创 2023-03-22 09:31:13 · 829 阅读 · 0 评论 -
Android View MotionEvent的getX和getRawX的区别
getRawX是以屏幕左上角为原点(0,0)手触摸到按钮的位置为终点的坐标。getRawY同理。getX是以控件本身的左上角为原点(0,0)手触摸的位置为终点的坐标。原创 2023-02-02 16:28:47 · 559 阅读 · 0 评论 -
Android studio 护眼模式配置、字体大小设置、内存大小设置等各类疑难杂症
使用命令连接手机的ip地址,进行无线连接 adb connect 192.168.1.1:5555,出现connected to 192.168.1.1:5555 ,表示连接成功,查看androidstudio,可以找到设备并进行无线调试。点击“设置”选项,弹窗后选择“设备”按钮,点击左侧的“自动播放”选项,在右侧列表中,找到你手机的照片默认设置项,修改默认设置为“不执行操作”即可关闭照片弹窗程序。工具栏添加快捷工具图标,工具栏名称是Navigation Bar ,里面只有拉取,提交,历史,回滚;原创 2023-01-30 18:45:38 · 1495 阅读 · 0 评论 -
LinkedList为什么不支持高效的随机访问
那关键的问题我想随即访问一个元素,比如说有1W个元素LinkedList,你现在要访问第9999个元素,他是这么访问的,他先将第一个元素拿出来看下不是,然后找A的引用,再将B拿出来还是不是,然后再找,他就这样一直找啊找,找啊找,在他找第9998还是不是在把9998的引用指向的元素拿出,oh year找到了,然后给你。LinkedList是由链表实现的,针对元素的插入删除比较高效,但是不支持随机访问,只能一个元素一个元素的遍历,数组根据下标支持随机访问。因此,获取最后一个元素比第一个元素花费更多的时间。原创 2023-01-11 17:11:28 · 721 阅读 · 0 评论 -
new Integer(123) 与Integer.valueOf(123) 的区别?他们相等吗?
在jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池IntegerCache 很特殊, Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对。valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就。这个缓冲池的下界是- 128,上界默认是127,但是这个上界是可调的,在启动。围内的Integer 实例使用自动装箱来创建,那么就会引用相同的对象。在使用这些基本类型对应的包装类型时,如果该数值范围在缓冲池范围内,就可。原创 2023-01-06 15:11:18 · 560 阅读 · 0 评论 -
Android动态获取和使用其他三方APP的Context和Resources图片资源文件
方案:根据目标app的包名创建获取它的Context上下文对象,再通过Context获取Resources对象以及获取里面的图片资源等。需求:三方app想要获取手机默认桌面Launcher App里的壁纸图片资源。原创 2022-12-28 10:01:10 · 666 阅读 · 0 评论 -
进程保活最全实现方案(使用黑、白、灰三种方案,达到不死进程)
进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个Notification,看起来就。白色保活手段非常简单,就是调用系统api 启动一个前台的Service 进程,这样会在系统的。熟悉Android 系统的童鞋都知道,系统出于体验和性能上的考虑,app 在退到后台时系统并。阿里系的app 后,有可能就顺便把其他阿里系的app 给唤醒了。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill 掉哪些进程,进程的oom_adj 越大,表示此进程优先级越低,越容易被杀回收;原创 2022-12-12 18:01:35 · 973 阅读 · 0 评论 -
Android Context对象最详细的分析介绍
出于安全原因的考虑,Android 是不允许Activity 或Dialog凭空出现的,一个Activity 的启动必须要建立在另一个Activity 的基础之上,也就是以此形成的返回栈。接子类就是Activity,所以Activity 和Service 以及Application 的Context 是不一样的,只有。们具体Context 的功能则是由ContextImpl 类去实现的,因此在绝大多数场景下,Activity、这三个类虽然分别各种承担着不同的作用,但它们都属于Context 的一种,而它。原创 2022-12-12 17:54:42 · 519 阅读 · 0 评论 -
APP启动流程:从点击应用图标到Activity启动流程
⑤system_server进程在收到请求后,进行一系列准备工作后(同上),再通过binder IPC向App进程发送scheduleLaunchActivity请求;⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。②system_server进程接收到请求后判断,如果不存在目标进程则通过AMS向zygote进程发送创建进程的请求(通过Socket);原创 2022-11-30 14:28:14 · 391 阅读 · 0 评论 -
一个应用程序APP安装到手机上时发生了什么变化
安装和卸载都是通过PackageManager,实质上是实现了PackageManager的远程服务PackageManagerService来完成具体的操作,所有细节和逻辑均可以在PackageManagerService中跟踪查看;所有安装方式殊途同归,最终就回到PackageManagerService中,然后调用底层本地代码的install来完成。原创 2022-11-30 10:25:44 · 272 阅读 · 0 评论 -
Android自定义APP崩溃日志的异常捕捉
如果APP异常退出的话,会在SD卡的根目录下创建一个“applog”的文件夹,错误信息会以.log形式生成在这个文件夹下面,我们只需要拿到这个.log文件,改成.txt格式的就可以查看哪里的错误导致的崩溃问题。如果在用户手机上,我们可以把这些文件上传到我们服务器。开发的时候如果我们的app在客户的手机上运行的时候崩溃了,我们怎么才能拿到我们的错误信息呢?我们只需要将手机产生的异常捕捉下来存在本地SD卡中,然后在下次启动app的时候将SD卡中的错误信息发送到我们的服务器,我们就可以根据错误信息排除问题。原创 2022-11-29 17:50:18 · 543 阅读 · 0 评论 -
Android 静默安装apk方法--兼容了5.1, 6.0, 7.1, 10, 11等各安卓版本
系统级app需要实现静默安装apk的功能,且能兼容各安卓系统版本。原创 2022-11-09 14:56:46 · 3131 阅读 · 2 评论 -
Android 获取音频MP3文件的专辑缩略图
今天介绍另外一种方法,通过MediaMetadataRetriever对象获取,通用方法大家都会想到使用系统媒体库去获取专辑缩略图.原创 2022-11-09 14:14:50 · 1212 阅读 · 0 评论 -
android 11及以上保存图片视频到相册
【代码】android 11及以上保存图片视频到相册。原创 2022-11-09 14:02:25 · 6964 阅读 · 5 评论 -
Android中layout-sw600dp、layout-w600dp和layout-h600dp的区别
其实,他们和drawable-hdpi/drawable-mdpi等的使用类似,都是为了实现适配各种Android手机屏幕而使用的,只是drawable用来管理不同大小图片资源,layout用来管理不同布局,values用来管理不同大小的值。这里的sw代表smallwidth的意思,当你的屏幕的绝对宽度大于600dp时,屏幕就会自动调用layout-sw600dp文件夹里面的布局。当你的屏幕的相对宽度大于600dp时,屏幕就会自动调用layout-w600dp文件夹里面的布局。...原创 2022-07-28 09:27:22 · 1625 阅读 · 0 评论 -
Android国内手机厂商白名单跳转工具类
清理内存软件会把优先级低于前台进程(oom_adj = 0)的所有进程放入清理列表,而当我们打开了清理软件就意味着其他app 不可能处于前台。所以说理论上可以kill 任何app。因此这类场景唯一的处理办法就是加入手机rom 白名单,比如你打开小米,魅族的权限管理-> 自启动管理可以看到QQ,微信,天猫默认被勾选,这就是厂商合作。那我们普通app 可以这么做:在app 的设置界面加一个选项,提示用户自己去勾选自启动,我封装了一个工具类给出国内各厂商的自启动的Intent跳转方法:...原创 2022-07-07 17:50:26 · 636 阅读 · 0 评论 -
Android APK签名总结-- V1签名和V2签名使用和区别
jarsigner 是JDK提供的针对jar包签名的通用工具,位于 apksigner 是Google官方提供的针对Android apk 签名验证的专用工具位于 Android SDK/build-tools/SDK version/apksigner.bat在Android Studio 中点击菜单 Build -> Generate signed apk … 可以打包签名不管是apk 包,还是jar 包,本质都是zip 格式的压缩包,所以他们的签名过程都差不多(仅限V1签名),以上两个工具都可原创 2022-06-07 20:29:01 · 5716 阅读 · 0 评论 -
Android ViewBinding 使用指南— 全新的视图绑定工具
通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。Tip:Viewbinding在 Android Studio 3.6 Canary 11 及更高版本中可用,现在应该没有谁的AS版本低于3.6了吧!用上ViewBinding步骤总共分几步?——3步!1.启用视图绑定:android { viewBin原创 2022-05-05 18:15:00 · 1185 阅读 · 0 评论 -
Android之ViewModel的使用
Android中的ViewModel是一个可以用来存储UI相关的数据的类。ViewModel的生命周期会比创建它的Activity、Fragment的生命周期长。这里拿官方的一张图:ViewModel-Lifecycle这张图是在在没任何设置屏幕发生转换Activity的生命周期变化和ViewModel的生命周期。可以看重建的时候,ViewModel中的数据是不会被清理的。借助于上面这一特点,ViewModel有下面的三个优点:Activity进行重建的时候,ViewModel的数据原创 2022-05-05 17:57:08 · 2527 阅读 · 2 评论 -
Android LiveData使用简介
一、前言:1. 简介:1、LiveData的简介LiveData是一种类,持有可被观察的数据。LiveData是一种可感知生命周期的组件,意味着该组件重视其他app组件的生命周期,如Activity、Fragment、Service该组件能确保,仅仅在Activity\Fragment\Service等组件都处于活跃的生命周期状态的时候,才去更新app组件。2、LiveData只有当观察者的生命周期处于活跃状态时才会去通知观察者。实现了Observer类的观察者,可以注册监听L原创 2022-05-05 17:37:44 · 4088 阅读 · 0 评论 -
判断某App位于前台还是后台的6种方法
判断App位于前台或者后台的6种方法转载 2022-05-05 11:18:50 · 3868 阅读 · 1 评论