
android开发
文章平均质量分 94
Android开发的方方面面及经验总结
BennuCTech
BennuCTech
展开
-
【Android开发】如何打包压缩文件、文件夹?
在开发Android应用过程中,基本都会遇到需要压缩文件的需求,比如打包日志文件上传等功能,今天就来看看如何开发一个通用的工具类用于压缩文件或文件夹。这样我们就可以打包压缩文件或文件夹了,为了方便可以封装成一个工具类,方便以后使用。我自己整理了一个工具类,大家有需要可以关注微信公众号“BennuCTech”,发送“ZipFile”获取完整代码。原创 2024-08-03 09:30:00 · 1121 阅读 · 0 评论 -
如何自定义TabLayout样式
前言在Android开发中经常会遇到tab页面,这样就需要tab+viewpager的方式来进行处理。谷歌官方提供了TabLayout,但是我们发现很多项目并不愿意使用,主要原因就是样式处理不够灵活。当然TabLayout可以自己实现TabItem,这样就可以满足大部分需求。但是其实使用默认的TabItem也可以实现很多样式,我们可以使用一些巧妙的方法来达到我们需要的效果,比如:下面我们就看如何一步步实现上面的效果改变字体颜色、大小这个很简单,xml中直接设置即可:app:tabTextCol原创 2023-12-18 14:14:50 · 2165 阅读 · 0 评论 -
如何延迟Fragment的导航过渡
前言做应用提高用户体验是很关键的,对于用户体验来说有一件事是不能回避的,就是页面切换的过渡动画。因为后一个页面可能会加载数据,所以切换时后一个页面是空白的导致用户体验比较差。那么如果下一个页面数据加载可能很快,为了提供流畅的顶级导航过渡,可不可以等待第二个屏幕加载数据,然后再启动动画?Android中的Fragment就提供了这种功能,通过它可以推迟fragment的载入,这样在界面通过动画过渡到第二个屏幕之前,第二个屏幕上的界面元素(通常是从网络获取的图片)已做好显示准备。这便是:postponeEn原创 2023-09-19 10:12:48 · 254 阅读 · 0 评论 -
横竖屏切换导致页面频繁重启?详细解读screenLayout
前几天多名用户反馈同一个问题,在小新平板上无法上网课,点击上课按钮后就退回到首页了。同事了解了一下发现小新平板现在销量特别好,于是赶紧申请了一台测试机打算看看到底是什么问题。原创 2023-06-16 15:26:34 · 4844 阅读 · 0 评论 -
Android 如何获取有效的DeviceId
Android 10上的DeviceId从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。而这个权限是系统权限,也就是说一般应用将无法再获取IMEI 和序列号原创 2023-05-19 16:51:49 · 6518 阅读 · 2 评论 -
【Android Jetpack】新一代导航管理——Navigation
不知道小伙伴们是否注意到,用AS创建一个默认的新项目后,MainActivity已经有了很大的不同,最大的区别就是新增加了两个Fragment,同时我们注意到这两个Fragment之间跳转的时候并没有使用之前FragmentTransaction这种形式,而是使用了NavController和NavHostFragment,这就是新一代导航管理————Navigation。原创 2023-05-16 16:14:27 · 967 阅读 · 0 评论 -
Android Jetpack:利用Palette进行图片取色
与产品MM那些事新来一个产品MM,因为比较平,我们就叫她A妹吧。A妹来第一天就指出:页面顶部的Banner广告位的背景是白色的,太单调啦,人家不喜欢啦,需要根据广告图片的内容自动切换背景颜色,颜色要与广告图主色调一致。作为一名合格的码农我直接回绝了,我说咱们的应用主打简洁,整这花里胡哨的干嘛,劳民伤财。A妹也没放弃,与我深入交流了一夜成功说服了我。其实要实现这个需求也不难,Google已经为我们提供了一个方便的工具————Palette。原创 2023-05-04 16:00:29 · 1251 阅读 · 0 评论 -
来详细的聊一聊Android Apk的四代签名
大部分开发者对apk签名还停留在APK v2,对APK v3和APK v4了解很少,而且网上大部分文章讲解的含糊不清,所以根据官网文档重新整理一份。apk签名从APK v1到APK v2改动很大,是颠覆性的,而APK v3只是对APK v2的一次升级,APK v4则是一个补充。原创 2023-04-13 15:07:53 · 1061 阅读 · 0 评论 -
【Android开发】App Bundle技术之动态功能模块
本文并不是介绍Android App Bundle,因为它不是新的事物,相关的文章也有很多了,本文重点介绍的是Android App Bundle中“动态功能模块”的实际应用。原创 2023-04-12 16:59:36 · 2007 阅读 · 0 评论 -
【Jetpack】ActivityResult介绍及原理分析
ActivityResult是Jetpack提供的一个功能,可以简化Activity直接的数据传递(包括权限申请)。它通过提供类型安全的 contract (协定) 来简化处理来自 Activity 的数据。这些协定为一些常见操作 (比如: 拍照或请求权限) 定义了预期的输入和输出类型,除此之外您还能够自定义协定来满足不同场景的需求。原创 2023-04-12 16:16:37 · 1395 阅读 · 0 评论 -
Android 13发布,一起来看看有哪些新功能
目前Google已经发布了Android13的正式版,虽然国内的手机能用上Android13还有一段时间,不过开发者们可以通过模拟器来体验,那么我们来看看Android13都有哪些重要的改变,我们适配的话需要做哪些工作?原创 2022-11-01 10:06:50 · 2084 阅读 · 0 评论 -
【Android】实现一个悬浮在软键盘上的输入栏
前言我们要实现一个悬浮在软键盘上的输入栏(即一个悬浮栏),过程中遇到了很多问题,查阅了一个网上的文章,结果发现不少是错误的,走了一些弯路,这里就一一记录一下。悬浮栏实现悬浮栏很简单chatInputPanel.setVisibility(View.VISIBLE);chatInputEt.setFocusable(true);chatInputEt.setFocusableInTouchMode(true);chatInputEt.requestFocus();InputMethodMana原创 2022-04-06 10:48:58 · 4649 阅读 · 11 评论 -
Android 12:SplashScreen源码分析
前言在上一篇文章Android 12 新功能:SplashScreen优化启动体验中我们介绍了Android 12上的一个新功能SplashScreen,同时提到了Google为了兼容低版本也提供了Androidx SplashScreen compat库,但是我们在使用的过程中发现这个库在Android 12和12以下版本表现并不一致,今天我们就从源码来分析一下实现细节。SplashScreenViewProviderAndroidx SplashScreen compat库的代码其实很少,只有两个原创 2022-02-08 09:52:47 · 1777 阅读 · 0 评论 -
Android 12新功能:启动画面SplashScreen
前言由于很多应用在启动时需要进行一些初始化事务,导致在启动应用时有一定的空白延迟,在之前我们一般的做法是通过替换 android:windowBackground 的自定义主题,使应用启动时及时显示一张默认图片来改善启动体验。在Android 12中,官方添加了SplashScreen API,它可为所有应用启用新的应用启动界面。新的启动界面是瞬时显示的,所以就不必再自定义android:windowBackground 了。新启动页面的样式默认是正中显示应用图标,但是允许我们自定义,以便应用能够保持其原创 2022-01-24 09:25:30 · 14205 阅读 · 0 评论 -
【Android开发】Drawable标签总结大全
前言我们在drawable目录下可以创建很多自定义的资源,其中用的最多的应该就是selector和shape。目前在Android中有21种drawable标签,了解和利用这些标签对我们的开发有很大的帮助。这个文章我们对这21种标签做一个介绍,让大家有一个印象:shape这个大家非常熟悉,简单列举一下属性和子标签,至于子标签的属性和具体使用就不细说了,网上有的是自身属性android:dither 是否启动图片抖动android:shape 形状。分别为矩形、线、椭圆、环。默认为矩形recta原创 2021-12-20 10:05:38 · 3271 阅读 · 0 评论 -
【Android开发】事件是如何分发到Activity的?
前言Android事件分发机制大家都非常熟悉,大部分文章对这个过程的描述都是开始于Activity,但是事件是怎么传到Activity的?这里就涉及到几个重要的部分:Window,WMS,ViewRoot和DecorView。如果要理解事件分发的源头,就需要搞明白他们之间的关系,所以我们先来看看它们到底有什么关系?WindowWindow是我们比较熟悉的,那么它是如何创建的?我们来看Activity的attach函数:@UnsupportedAppUsagefinal void attach原创 2021-12-03 09:14:00 · 705 阅读 · 0 评论 -
剖析LRU实现和Glide中缓存机制
前言glide的内存缓存有两级:LruCache、ActiveResources其中LruCache老生常谈了,这里就不细说了。ActiveResources实际上内含一个HashMap,Map中value则是资源的弱引用。那么这两级是如何工作的?取出先从LruCache取,没有再从ActiveResources取如果LruCache中有,则取出存入ActiveResources,并从LruCache移除代码如下:public class Engine implements EngineJ原创 2021-11-30 09:18:02 · 1199 阅读 · 0 评论 -
WebRtc中是如何处理视频数据的?
前言本文是基于PineAppRtc开源项目https://github.com/thfhongfeng/PineAppRtc因为一个需求,我们需要将一个视频流通过WebRtc发送出去,所以就研究一下WebRtc是如何采集视频数据并进行处理发送的,于是有了这篇文章。采集发送在使用webrtc进行即时通话时,双方连接上后,会根据参数创建一个PeerConnection连接对象,具体代码在PeerConnectionClient类中,这个是需要自己来实现的。这个连接的作用来进行推拉流的。然后创建一个Me原创 2021-11-26 09:09:59 · 2815 阅读 · 4 评论 -
webrtc中是如何处理音频数据的?
前言本文是基于PineAppRtc项目https://github.com/thfhongfeng/PineAppRtc)在webrtc中音频的录制和播放都是封装在内部,一般情况下我们也不需要关注,直接使用即可。但是最近有一个需求,需要将我们自己的数据进行传输,所以就需要将这些接口暴露出来使用。所以就需要去研究一下它的源码,就有了这篇文章。音频引擎在webrtc中其实是有不只一套音频引擎的,其中有native层的使用OpenSL ES实现的,另外还有一套java层通过android api实现的。原创 2021-11-25 09:15:17 · 2395 阅读 · 9 评论 -
Android中的资源复用小技巧
前言做了很多项目,发现每个项目里都有大量的相似图标,比如每个颜色一种、每个角度一种(左箭头、右箭头)等等,虽然这些图标很小占用不了太多资源。但是当我们需要change的时候就得一个个去替换,其实在android里有很多小技巧可以让这些资源进行复用,减少体积的同时也可以使项目结构更加清晰。这里总结的一些比较常用的复用,包扩:自适应、变色、旋转、阴影、组合、透明度、剪裁、留白等svg矢量图android5.0之后android就开始支持svg矢量图了,是drawable的vector标签。使用矢量图的原创 2021-11-22 17:15:06 · 1428 阅读 · 0 评论 -
详细解读Android中的事件分发机制
前言Android的事件分发机制也是老生常谈了,这篇文章并不是笼统的介绍这个机制,而是针对ACTION_DOWN这个事件探讨相关的细节。dispatchTouchEvent说到Android事件分发,一定绕不开dispatchTouchEvent函数,View和ViewGroup的该函数有很大的不同。我们来看看ViewGroup的dispatchTouchEvent函数,它的部分源码如下:@Overridepublic boolean dispatchTouchEvent(MotionEvent原创 2021-11-19 15:51:36 · 2322 阅读 · 0 评论 -
如何发布Android Library到Maven私有仓库
前言在我们的项目架构中,一定存在一些基础的模块,这些模块可以在多个app上通用,这种情况我们一般会将这些模块封装成Android Library统一维护,并上传到仓库方便其他小组使用。仓库可以选择如mavenCentral这类公开的仓库,但是我们一般选择搭建自己的maven私有仓库,比如:Sonatype Nexus。本文就一步步的教大家如何将Android Library发布到maven私有仓库。添加maven仓库配置在项目的根目录下的gradle.properties中添加私有仓库的配置,如下:原创 2021-11-11 11:38:20 · 2454 阅读 · 0 评论 -
详细解读RecyclerView的局部刷新机制
前言这篇文章其实之前就完成了,一直遗忘在角落里了,今天无意翻之前的笔记发现的,大部分内容应该还是有效的。之前在使用RecyclerView的遇到过一个问题,使用notifyItemChanged刷新数据的时候会出现重影或者闪烁的现象。这个问题很容易出现,当我们的列表中有进度显示(比如下载),这时候需要不停的更新进度,就需要使用notifyItemChanged使用notifyItemChanged可以只刷新那一个item,这样就避免了像ListView那样全部刷新但是如果使用notifyItemC原创 2021-10-29 17:21:17 · 2623 阅读 · 0 评论 -
android中layout、drawable及styles的xml文件加载探索
最近搞一个SDK项目,既然提供给用户那么就不能太复杂。而android如果不用xml就会很复杂,比如布局,那么怎么办? 关于布局别人提供了一个方法,xml解析。具体做法将xml文件以数据文件的形式放在文件夹下,比如assets,用XmlPullParser解析xml文件,再用LayoutInterflater的inflate方法获取到layout,这样就可以在代码中利用了。原创 2013-11-18 11:47:13 · 2109 阅读 · 0 评论 -
“android:process“---由日志引发的大灾难
本人菜鸟一枚,这几天在修改一个项目,昨天在一个问题上卡住了,直接卡了一天,后来问了问高手才知道是个小问题。 这是一个由android:process不同进程导致的大灾难!写下来警戒自己。 其中要由notification打开一个activity,但是总是一闪而过,而且activity中的打印信log一直没有(oncreate一开始就打印了),所有本能怀疑是activity没成功原创 2013-11-14 10:56:06 · 1383 阅读 · 0 评论 -
使用apache的HttpGet\HttpPost获取返回内容编码问题
今天遇到了一个小问题,简单研究了一下,同时记录一下。关于apache的HttpGet\HttpPost请求,做了一次访问,代码如下: String url = "http://xxxxxxx"; HttpGet httpGet = new HttpGet(url); HttpClient httpClient = new DefaultHttpClient(); try {原创 2014-05-23 12:25:46 · 5927 阅读 · 0 评论 -
maven(android-maven-plugin3.8.0)打包apk无法启动,apklib依赖包的资源索引出错(R文件与主模块冲突)问题解析
近期在用maven,遇到了一个问题,用maven打出的apk有问题无法启动,但是用idea打包的就是正常的。日志中显示的问题是,一个apklib形式的依赖包中的一个资源出现了问题。反编译对比maven包和idea包,找到了问题所在。假设: 主模块包名为com.android.main apklib依赖包包名为com.android.apklib原创 2014-08-06 11:27:55 · 3703 阅读 · 1 评论 -
eclipse开发cocos2dx 3.2环境搭建之一: Android C\C++环境搭建(ndk r9d)
这几天有时间,琢磨一下cocos2dx。cocos2d家族其实挺庞大的,也有cocos2d-android这种可以直接用Java语言来开发的,但是cocos2d-android资料相对少一些,而且貌似都是几年前的。对比一下还是cocos2dx比较流行,有可以跨平台,而且既然要学就一起把c++学了。这段时间已经用惯了idea,不太想换回去,但是查了查发现idea还不能做c++开发。国内倒是有家公原创 2014-08-20 10:51:04 · 4414 阅读 · 0 评论 -
eclipse开发cocos2dx 3.2环境搭建之三: ccp-tests项目编译 (this project is not a CDT project)
cocos2dx还有一些测试项目,3.2版本都在安装目录下的tests文件夹下。其中ccp-tests项目包含非常多的使用示例,初学者可以通过熟悉学习这个项目快速的了解cocos2dx的基础知识。自己在测试cpp-tests项目时还是遇到了一些东西,这次就总结一下。进入ccp-tests目录可以看到与之前的测试项目结构是一样的。刚开始直接用eclipse导入了这个项目(“Fil原创 2014-08-21 10:59:03 · 7188 阅读 · 2 评论 -
eclipse开发cocos2dx 3.2环境搭建之二: cocos2dx 3.2安装及测试运行 (An internal error occurred during: “C/C++ Indexe)
先强调一下,大家一定要先阅读一遍cocos2dx安装目录下的readme!!关于cocos2dx的安装和测试里面其实说的很详细了,这样就可以少走些弯路。下面开始进入正题。再次强调ndk一定要使用r9d版本!需要准备如下:1、ant 这个比较简单,官网上下载安装后配置环境变量即可。2、python 建议使用2.7版本,据说高版本会有问题。3、cocos2dx 3.2原创 2014-08-20 15:19:09 · 8240 阅读 · 2 评论 -
Android Lint 去除重复资源 之 idea探究
Android Lint是很好的检查工具,可以帮助开发者检查很多问题,其中检查android项目重复的资源文件非常有用。1、命令行下使用Android Lint有很多命令,具体可以在网上查到。今天主要使用check,这个命令目的是只进行某个或某几个类型的检查,比如只检查无用的资源“lint --check UnusedResources ”。至于都有哪些类型的检查,可以输入命令"l原创 2014-07-30 16:00:20 · 3361 阅读 · 1 评论 -
Android更新平台架构方案
这篇文章是去年写的,我们的两款app一直这使用umeng的更新服务,但是16年umeng开始放弃更新服务,考虑到切换到其他更新平台也会面临这样的问题,我开始着手自己搭建一个更新平台。整体方案包含前后端,客户端代码封装成jar包并上次maven平台,方便每个app直接使用;服务端代码用nodejs来快捷实现。1、系统结构(1)整体结构整体结构原创 2017-07-14 16:09:59 · 776 阅读 · 0 评论 -
实现带header和footer功能的RecyclerView——完善篇
在上一篇文章中我们实现了实现带header和footer功能的RecyclerView,见 实现带header和footer功能的RecyclerView但是由于加入了header,item的position有了变化,导致了RecyclerView中的一些与position有关方法或使用出现问题。本章着重解决一些常用的方法和使用,至于其他的解决方法类似。首先,重写几个比较常用的...原创 2017-08-07 16:48:46 · 854 阅读 · 0 评论 -
为RecyclerView添加下拉刷新(PullToRefresh)功能
在之前的文章中,我们实现了带有header和footer功能的WrapRecyclerView。实现带header和footer功能的RecyclerView实现带header和footer功能的RecyclerView——完善篇现今App中列表的下拉刷新和上拉加载已经是一种习惯了,这两个操作也确实方便很多。为RecyclerView添加这个功能可以通过多种方法,这...原创 2017-08-08 14:20:48 · 1369 阅读 · 0 评论 -
在android studio中配置ndk开发环境
环境:android studio 1.5 android-ndk-r10b1、下载android-ndk-r10b,解压。2、android studio创建新项目, 配置ndk环境打开file->project structure选择你所下载的ndk环境路径3、修改 gradle.properties文件原创 2017-08-14 11:59:42 · 1346 阅读 · 0 评论 -
Android魔术——手把手教你实现水晶球波浪进度条
有段时间对Android中自定义View非常痴迷,看到一些炫的总会手痒的自己尝试着实现一下。这个系列的就是整理一些之前实现的,跟大家一起看看Android中的魔法。原创 2017-09-01 10:26:17 · 4505 阅读 · 1 评论 -
Android魔法(第二弹)——一步步实现淹没、展开效果
本篇文章我们实现一个简单的动画效果,目的是熟悉和加深Android属性动画的使用。另外这次我们使用kotlin来进行开发,不熟悉kotlin的同学可以自行简单了解一下kotlin语法,基本应该能看懂。原创 2017-09-07 10:55:20 · 1563 阅读 · 0 评论 -
Android魔法(第三弹)—— 一步步实现对折页面
本篇文章主要去实现一个对折页面的效果,主要来学习Android中的截屏、Bitmap处理及canvas绘制这些知识。原创 2017-09-12 15:28:34 · 1604 阅读 · 0 评论 -
Android魔法(第四弹)—— 一步步实现百叶窗效果
本篇是基于AnimationListView框架的,这个框架在上一篇中详细的讲解了,建议阅读本篇前先熟悉一下。原创 2017-09-13 17:37:12 · 4319 阅读 · 0 评论 -
剖析Picasso加载压缩本地图片流程(解决Android 5.0部分机型无法加载本地图片的问题)
之前项目中使用Picasso遇到了一个问题:在Android 5.0以上版本的部分手机上使用Picasso加载本地图片会失败。为了解决这个问题,研究了一下Picasso加载和压缩本地图片的流程,才有了这篇文章。我们知道,Picasso加载本地图片有两种方法,一种是new File(path),另外一种是url = "file://" + path。尤其后一种在picasso2.5.2及原创 2017-09-06 14:59:13 · 1902 阅读 · 1 评论