Android日常工作
Android日常工作
互联网小熊猫
这个作者很懒,什么都没留下…
展开
-
Android Studio上运行Java的main函数
一、背景在Android studio中如果觉得运行apk慢想快速跑一下java代码可以在Android工程中写一个main函数,运行main函数要比运行apk快很多。二、实现方案1.在 .idea 的 gradle.xml 中标注的位置增加下面的内容即可<option name="delegatedBuild" value="false" />2.现在可以运行 MainJava 的 main 方法了,按照下图指示的方式,指定运行的 main 函数即可...原创 2022-05-07 10:36:45 · 2030 阅读 · 0 评论 -
Kotlin获取类的包名
一、背景AClass.class.getName();如果AClass是java类,则此方法将返回包名和类名。 但是当我将AClass java文件转换为Kotlin文件时,它只会返回一个类名。所以系统找不到这个类路径二、实现方式1.KClass.qualifiedName获取val name = AClass::class.qualifiedName2.通过媒体资源Class.name获取val name = AClass::class.java.name3.通过Class#getN原创 2022-03-31 10:19:15 · 817 阅读 · 0 评论 -
kotlin中使用软引用
一、Java方式实现var str = String("asdf")val strSoftRef = SoftReference<String>(str)str = 二、kotlin委托实现委托属性,虽然常用by lazy,没看到别人的文章还想没想到这东西。看lazy大致可以了解委托的实现方式,结合一些文章差不多可以写成这样fun <T> weak(initializer: () -> T) = Weak(initializer.invoke())class原创 2022-03-31 10:11:19 · 3038 阅读 · 0 评论 -
Android区分高低端机型
一、背景某些APP项目中需要针对高中低端安卓机型做不同的适配,例如:特效的开关、动画效果的调整等。怎么在项目中对Android进行高低端机型的区分?接下来的内容会进行分析。二、区分标准区分的标准最直观的就是跑分数据。参考现在最主流的跑分软件安兔兔,数据主要由4部分构成,内存(RAM)、CPU、GPU、IO(数据库、SD读写),其中内存、CPU、GPU性能构成主要占比,IO性能次要。内存和CPU是所有功能的根本,而GPU则是对游戏类应用影响更大些,因此在非游戏类的普通应用,更注重内存和CPU。三、技术原创 2022-03-30 10:25:10 · 5532 阅读 · 1 评论 -
Android中设置org.gradle.jvmargs
一、配置文件gradle.properties文件二、作用Specifies the JVM arguments used for the daemon process.The setting is particularly useful for tweaking memory settings.org.gradle.jvmargs=-Xmx1536m上面的那两行是对这句话的解释:用于指定守护进程的JVM参数。这个设置呢,对于调整内存设置特别有用。1.那平常开发中它有什么用呢?主原创 2022-03-29 10:15:20 · 6992 阅读 · 0 评论 -
Gradle中implementation、api、compileOnly区别详解
一、implementation和api的区别1.implementation:只能在内部使用此模块,比如我在一个libiary中使用implementation依赖了gson库,然后我的主项目依赖了libiary,那么,我的主项目就无法访问gson库中的方法。这样的好处是编译速度会加快,推荐使用implementation的方式去依赖,该依赖方式所依赖的库不会传递,只会在当前module中生效。2.api该依赖方式会传递所依赖的库,当其他module依赖了该module时,可以使用该module下原创 2022-03-29 10:06:30 · 5236 阅读 · 0 评论 -
Android CheckBox与Spanned双重响应
一、问题描述客户端注册账号,需要用户确认用户协议及可以查看协议。选择使用单CheckBox控件配合SpannableString。但是遇到了一个问题,点击链接后CheckBox也响应了Click导致CheckBox勾选状态改变,这是不期望发生的。二、问题原因点击事件,从TextView的onTouchEvent入手@Override@Overridepublic boolean onTouchEvent(TextView widget, Spannable buffer, Mo原创 2022-03-24 11:12:48 · 1803 阅读 · 0 评论 -
Android 点击短信链接打开App
一、背景随着APP产品的迭代,运营的过程中往往会有一些活动希望通知到用户,或者唤起沉睡用户,就我们Android而言,当然有推送,长连接一类的方法,但是,基于国内的推送环境,只能APP自己启动长连接,没有统一的系统级别的推送支持,导致沉睡用户无法送达的,除非你是微信这样的大佬才行,所以,此时通用一点方式就是通过短信发送一条活动链接,通过点击这条链接可以直接跳转到我们的APP。二、实现思路要唤起我们的App大致工作流程如下:所以,一共有三条线路可以到达我们的APP,在任何安卓版本中,我们走或者中间右原创 2022-03-13 20:00:47 · 6556 阅读 · 0 评论 -
Kotlin在forEach中如何跳出循环和跳出当前循环体
一、数组的forEach中直接retrunfun main(args: Array<String>) { val arr = intArrayOf(1,2,3,4,5,6,7) arr.forEach { if (it == 4) return println("value:$it") } println("this is End")}那么输出结果是可以看到程序程序在遍历到4的时候就退出了方法,而且this is En原创 2022-03-13 19:25:58 · 1956 阅读 · 0 评论 -
Android 自定义checkbox与文字的距离设置
一、文字的距离设置只需要设定CheckBox的android:paddinLeft的值即可。二、自定义checkbox在开发过程中经常遇到的问题是,不同厂商的checkbox控件的UI不同,导致开发出的产品在UI上有些区别,尤其是一些厂商的UI做得比较丑,这时候我们可以使用自定义Checkbox来达到我们想要的UI。只需要在drawable文件下设定一个xml即可:<?xml version="1.0" encoding="UTF-8"?><selector xmlns:a原创 2022-03-13 19:15:21 · 1546 阅读 · 0 评论 -
Android 完整的自定义View
一、自定义View的分类自定义View一共分为两大类,具体如下图:二、具体介绍 & 使用场景对于自定义View的类型介绍及使用场景如下图:三、使用注意点在使用自定义View时有很多注意点(坑),希望大家要非常留意:1.支持特殊属性支持wrap_content如果不在onMeasure()中对wrap_content作特殊处理,那么wrap_content属性将失效支持padding & margin如果不支持,那么padding和margin(ViewGrou原创 2022-02-20 19:51:46 · 848 阅读 · 0 评论 -
Android AAB增量安装
一、简介由于频繁的更新迭代,移动终端上的大型应用程序越来越普遍。因此,从应用商店里下载大型应用安装包将无可避免的耗费大量时间,这已经成为移动终端用户的一大痛点。对于应用开发者而言,也需要改变现有的整包安装方案以满足用户需求。在传统的应用安装方案中,开发者通过ADB(Android Debug Bridge)以有线或无线的方式与终端用户连接,或者用户从软件商店直接下载,然而该方案需要用户等待完整的安装包传输结束后才能启动安装,在这期间产生了不良的用户体验。增量安装技术是一种流式的安装方案:一旦安装包的原创 2022-02-20 19:23:13 · 2438 阅读 · 0 评论 -
Gson反序列化时导致实体类的默认值失效了
一、问题示例实体类TestBean:class TestBean implements Serializable{ String title; boolean isShow = true;//这里给isShow设置了默认值,坑点}反序列化代码:new Gson().fromJson("{title:\"标题\"}", TestBean.class);预计得到的结果:TestBean.title 值等于 “标题”TestBean.isShow 值等于 “true”实际得原创 2022-02-20 19:15:51 · 985 阅读 · 0 评论 -
Android view坐标体系
一、前言Android View体系是界面编程的核心,他的重要性不亚于Android四大组件,在这个系列中我会陆续讲到View坐标系、View的滑动、View的事件分发等文章来逐步介绍Android View体系。二、View简介View是Android所有控件的基类,同时ViewGroup也是继承自View,看下面这张图我们就会有一个直观的了解:知道了View的层级关系有助于对View的理解,从上图可以发现我们常用的这些控件都是继承于View,如果我们更好的掌握了View的知识体系,那么我们在界原创 2022-02-15 11:37:50 · 508 阅读 · 0 评论 -
Android addview—动态添加view
一、前言在日常的开发中经常遇到需要动态添加子view的情况,addview是ViewGroup的特有方法,可以在布局中动态添加view,而view是不存在这个方法的。二、使用方式1.方法介绍addview有以下几种方式addView(View child) // child 被添加的ViewaddView(View child, int index) // index 被添加的View的索引addView(View child, int width, int height) //原创 2022-02-14 10:42:51 · 16814 阅读 · 0 评论 -
Android maven多flavor上传
一、问题背景最近, 项目中一直维护的一个 maven aar 库由于业务发展, 需要定义 2 个 flavor 并打包上传2 个 flavor aar 包到 maven 库。二、如何发布两个 flavor 的 aar 到 maven 仓库首先介绍一下, 发布 maven 库目前有 2 个可用的 gradle 插件:maven plugin (早期的 maven 插件, 目前已经不再维护, 功能简单, 问题比较多)maven-publish plugin (gradle 目前推荐使用的, 功能更强原创 2022-02-14 10:28:53 · 626 阅读 · 1 评论 -
Dagger2原理解析
一、什么是Dagger2Dagger2是Dagger的升级版,是一个依赖注入框架,现在由Google接手维护。 恩,这里有个关键字依赖注入,因此我们得先知道什么是依赖注入,才能更好的理解Dagger2。依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的。举个例子:我们在写面向对象程序时,往往会用到组合,即在一个类中引用另一个类,从而可以调用引用的类的方法完成某些功能,就像下面这样.public class ClassA { ... Clas原创 2022-02-13 16:59:12 · 731 阅读 · 0 评论 -
Android AAB简介
一、前言Google Play要求八月份起新应用须打包为AAB格式,开发者上传打包文件整合成aab格式,根据不同的处理器/分辨率等下载对应的安装包,减少冗余,所以安装包会减小。二、Android App Bundle(AAB)Android App Bundle 是一种发布格式,其中包含您应用的所有经过编译的代码和资源,它会将 APK 生成及签名交由 Google Play 来完成。使用 Android App Bundle 发布应用可帮助用户以尽可能最小的下载大小安装您的应用,并将压缩下载大小上限原创 2022-02-13 16:28:04 · 3910 阅读 · 0 评论 -
OAuth 2.0 解析
一、OAuth 2.0 的一个简单解释我住在一个大型的居民小区,小区有门禁系统,进入的时候需要输入密码,我经常网购和外卖,每天都有快递员来送货,我必须找到一个办法,让快递员通过门禁系统,进入小区,如果我把自己的密码,告诉快递员,他就拥有了与我同样的权限,这样好像不太合适。万一我想取消他进入小区的权力,也很麻烦,我自己的密码也得跟着改了,还得通知其他的快递员。有没有一种办法,让快递员能够自由进入小区,又不必知道小区居民的密码,而且他的唯一权限就是送货,其他需要密码的场合,他都没有权限?二、授权机制的设计原创 2022-02-10 11:13:54 · 877 阅读 · 0 评论 -
java闭包详解
一、为什么需要闭包闭包的价值在于可以作为函数对象或者匿名函数,持有上下文数据,作为第一级对象进行传递和保存。闭包广泛用于回调函数、函数式编程中。二、JAVA中的闭包在JAVA中,闭包是通过“接口+内部类”实现,JAVA的内部类也可以有匿名内部类。1.内部类在JAVA中,内部类可以访问到外围类的变量、方法或者其它内部类等所有成员,即使它被定义成private了,但是外部类不能访问内部类中的变量。这样通过内部类就可以提供一种代码隐藏和代码组织的机制,并且这些被组织的代码段还可以自由地访 问到包含该内原创 2022-02-09 16:23:49 · 1567 阅读 · 0 评论 -
Android apk签名原理
一、什么是apk签名签名是摘要与非对称密钥加密相相结合的产物,摘要就像内容的一个指纹信息,一旦内容被篡改,摘要就会改变,签名是摘要的加密结果,摘要改变,签名也会失效。Android APK签名也是这个道理,如果APK签名跟内容对应不起来,Android系统就认为APK内容被篡改了,从而拒绝安装,以保证系统的安全性。应用程序的作者使用自己的私钥签名APK文件,并将签名与公钥一起发布到APK中,这个过程称之为签名。当应用程序被安装时,用发布的公钥去解析签名,并与文件的hash进行比对,这个过程叫验签。二、原创 2022-02-09 15:41:57 · 7647 阅读 · 0 评论 -
oppo手机提示“由于某个应用遮挡了权限请求界面,因此设置应用无法验证您的请求开启辅助权限的回应”
一、解决方案关掉悬浮球才终于可以打开OPPO辅助功能的权限原创 2022-02-09 15:28:04 · 15476 阅读 · 2 评论 -
Android 将 build 变量注入manifest清单
一、背景如果您需要将变量插入在 build.gradle 文件中定义的 AndroidManifest.xml 文件,可以使用 manifestPlaceholders 属性执行此操作。此属性采用键值对的映射。二、示例android { defaultConfig { manifestPlaceholders = [hostName:"www.example.com"] } ...}您可以将某个占位符作为属性值插入清单文件,如下所示:<intent原创 2022-02-09 14:36:27 · 1683 阅读 · 0 评论 -
Android 使用okhttp进行post提交json数据
一、背景有的服务端的api只支持json格式的数据,不支持表单格式的数据,所以就需要客户端发送数据的时候指定为json格式。二、代码实现获取MediaType对象,类型为application/json,字符集为utf-8通过RequestBody.create()方法创建JSON请求主体创建请求对象,需要往请求头里添加参数也是在这里添加执行请求//创建一个OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient();//创建原创 2022-02-08 17:07:42 · 6944 阅读 · 0 评论 -
Android deeplink原理解析
一、什么是DeepLink移动端深度链接,简称deeplink。这是一种通过uri链接到app特定位置的一种跳转技术,不单是简单地通过网页、app等打开目标app,还能达到利用传递标识跳转至不同页面的效果。二、原理分析deeplink的scheme相应分两种:一种是只有一个APP能相应,另一种是有多个APP可以相应,比如,如果为一个APP的Activity配置了http scheme类型的deepLink,如果通过短信或者其他方式唤起这种link的时候,一般会出现一个让用户选择的弹窗,因为一般而言,系原创 2022-02-04 22:54:36 · 5756 阅读 · 0 评论 -
Android与H5交互原理
一、Android调用JS方法1.通过WebView的loadUrl// 调用js中的函数:jsFun(msg)webView.loadUrl("javascript:jsFun('" + msg + "')");2.通过WebView的evaluateJavascriptmWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() { @Override public v原创 2022-02-03 21:51:18 · 1955 阅读 · 0 评论 -
Android路由框架ARouter原理
一、为什么需要路由框架1.原生的路由方案存在的问题首先谈一谈原生的路由方案存在的问题以及为什么需要路由框架。我们所使用的原生路由方案一般是通过显式intent和隐式intent两种方式实现的,而在显式intent的情况下,因为会存在直接的类依赖的问题,导致耦合非常严重;而在隐式intent情况下,则会出现规则集中式管理,导致协作变得非常困难。而且一般而言配置规则都是在Manifest中的,这就导致了扩展性较差。除此之外,使用原生的路由方案会出现跳转过程无法控制的问题,因为一旦使用了StartActivi原创 2022-02-02 21:29:12 · 2508 阅读 · 1 评论 -
Android WebView 调用JS方法获取返回值
一、Android4.4+如果你项目的minSdkVersion 为4.4 以上,那么你可以直接通过WebView的evaluateJavascript()方法 拿到JS方法的返回值webview.evaluateJavascript("javascript:JSMethod()", new ValueCallback<String>() { @Override public void onReceiveValue(String value) {原创 2022-01-20 11:31:36 · 2486 阅读 · 0 评论 -
Android简析Window、Activity、DecorView以及ViewRoot之间的错综关系
一、职能简介1.ActivityActivity并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是Window。一个Activity包含了一个Window,Window才是真正代表一个窗口。Activity就像一个控制器,统筹视图的添加与显示,以及通过其他回调方法,来与Window、以及View进行交互。2.WindowWindow是视图的承载器,内部持有一个 DecorView,而这个DecorView才是 view 的根布局。Window是一个抽象类,实际在Activity中持有的原创 2022-01-20 11:23:38 · 1014 阅读 · 0 评论 -
Android启动另外的APP及传递参数
一、通过包名启动如果你不知道那个APP的Activity,但是知道包名(package name),那么可以使用如下的方法:Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");startActivity(LaunchIntent);二、通过package/activity启动如果APP之间有合作关系,可以获得合作APP的清单文件(manifest),那么可以从该文件中原创 2022-01-20 10:34:31 · 5028 阅读 · 0 评论 -
Android Intent ACTION值自定义
一、简介在启动一个ACTIVITY时,作为信使的Intent主要由三部分构成:Intent<Action,Data,Category>;对于Action,有时候我们不一定非得用系统自定义的值,而可以自定义,同样可以达到启动其它Activity的效果,这里我们需要明确如下定义:ACTION的值是一个类型为String的字符串Intent中ACTION的值是双向的,发送方发给接受方中的ACTION值能够被双方了解,这样在发送方中,自定义ACTION的值,在接受方中,Intent-filter原创 2022-01-19 10:27:16 · 1740 阅读 · 0 评论 -
Android帧动画FrameAnimation
一、逐帧动画介绍视图动画由两部分组成,补间动画和逐帧动画,下面讲解逐帧动画。Frame-by-frame Animation主要作用于view,可以利用xml或者代码生成动画,如果使用xml方式生成动画需要在res/drawable 目录下创建动画xml文件(animation-list)。逐帧动画的原理是一张一张的播放图片资源(drawable资源),然后出现动画效果。逐帧动画对应的类是AnimationDrawable,在android.graphics.drawable.Drawable包原创 2022-01-17 20:00:12 · 1259 阅读 · 0 评论 -
LifecycleObserver监听Activity生命周期
一、自定义控件并实现LifecycleObserverimport android.content.Context;import android.os.SystemClock;import android.util.AttributeSet;import android.widget.Chronometer;import androidx.lifecycle.Lifecycle;import androidx.lifecycle.LifecycleObserver;import android原创 2022-01-17 19:51:26 · 1072 阅读 · 0 评论 -
关于Activity使用SingleTask,从home点击图标后清空栈的问题
一、背景如果从桌面启动的MainActivity的launchMode=SingleTask,那么当app调用其他的Activity时,用户回到home键回到桌面,再次进入App时,原来的界面会消失,直接显示在来MainActivity所在的页面二、原理分析按照我们应用的启动流程,首先进入的是MainActivity,这个时候再次进入一个其他的Activity,那么我们回到用户桌面,再次进入App,这个流程图大致是:start MainActivity -> 首页 -> 进入另外一个原创 2022-01-16 17:20:50 · 1117 阅读 · 1 评论 -
Android使用动画显示或隐藏视图
一、需求背景有时候,我们需要在屏幕上显示新的信息,同时移除旧的信息,一般情况下我们通过VISIBILITY或者GONE来对需要显示或者隐藏的视图进行设置,这样做的坏处是显示或者隐藏的动作变化非常突兀,而且有时候变化很快导致用户无法注意到这些变化。这时就可以使用动画显示或者隐藏视图,通常情况下使用圆形揭露动画,淡入淡出动画或者卡片反转动画。二、创建淡入淡出动画淡入淡出动画会逐渐淡出一个View或者ViewGroup,同时淡入另一个。此动画适合在应用中切换内容或者视图的情况。这里使用ViewPropert原创 2022-01-16 17:15:40 · 1850 阅读 · 0 评论 -
android:configChanges属性解析
一、configChanges作用Android程序在运行时,一些设备的配置可能会改变,如:横竖屏的切换、键盘的可用性等。这些事件一旦发生,当前活动的Activity会重新启动,其中的过程是:在销毁之前会先调用onSaveInstanceState()方法去保存你应用中的一些数据,然后调用onDestroy()方法,最后调用onCreate()、onStart()、onResume()等方法启动一个新的Activity。如果想让某些配置在发生改变的时候不重启Activity,需要为Activity添加a原创 2022-01-16 17:04:08 · 20566 阅读 · 0 评论 -
Android11上分享图片失败
一、问题描述先看下微信分享错误的提示:二、分析原因看到这个错误大家第一个可能会想到FileProvider我在AndroidManifest早已配置过了,但是配置了是你可以使用FileProvider存储了应用间共享文件,但是在并不代表你使用了FileProvider,然后了解问题我们就要先了解一个概念分区存储1、分区存储Android 10之前,外部存储区的内容主要以两种形式:由应用的包名命名,归属于特定应用目录下的内容存储在公共存储区域的内容。在Android 10 中,Googl原创 2021-12-06 10:31:22 · 3392 阅读 · 0 评论 -
Android WebView自定义错误页面显示
一、背景当app的webview没有网络或者拉取h5界面失败的时候不想显示错误界面,而是想自定义界面的时候就涉及到了webview错误界面的自定义。二、代码实现@Overridepublic void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { //用javascript自定义错误界面 String data = "Page NO FOUND!"; view.loa原创 2021-12-06 10:21:24 · 1296 阅读 · 0 评论 -
Entry name ‘META-INF/MANIFEST.MF‘ collided
一、错误提示编译项目的时候提示Entry name ‘META-INF/MANIFEST.MF’ collided,截图如下:二、解决方案解决这个问题也比较简单,在app的build.gradle文件里添加:android { packagingOptions { exclude 'META-INF/MANIFEST.MF' }}另外,如果有pickFirst ‘META-INF/*’,如果有这行代码,最好注释掉,不然可能打不出包。...原创 2021-12-01 10:15:39 · 2639 阅读 · 0 评论 -
Android读取Manifest中的权限
一、背景在做需求的时候有这样一个需求,当app声明了这个权限的时候就显示开关,在app没有声明这个权限的时候就不显示。因此获取Manifest中是否声明了这个权限就成了需要解决的问题。二、解决思路既然Android packageManger负责管理包信息的Manifest正好是包信息里的数据,查看一下官网是否有这样的api,果然packageInfo中是有权限信息的。/** * Overall information about the contents of a package. This原创 2021-11-30 11:40:24 · 2372 阅读 · 0 评论