自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(158)
  • 资源 (2)
  • 收藏
  • 关注

原创 android开发 apk瘦身的步骤

移除未使用的代码和资源。在Android开发中,APK瘦身是一个重要的优化手段,可以帮助减少应用程序的大小,提高用户的下载和安装意愿。:尽量使用针对移动app的jar和类库,避免使用其他大型的jar包,因为它们不仅增加了包的大小,还增加了编译时间。:尽量使用针对移动app的jar和类库,避免使用其他大型的jar包,因为它们不仅增加了包的大小,还增加了编译时间。通过以上步骤,可以有效地对APK进行瘦身,减小应用程序的大小,提高用户的下载和安装意愿。:移除未使用的so文件和多余的库,进一步减小APK大小。

2023-12-29 10:46:56 407

原创 子类和父类可以同时实现Parcelable方法吗

需要注意的是,子类重写父类的writeToParcel()方法时,必须调用super.writeToParcel()以确保父类的字段也被正确写入Parcel。同时,如果子类添加了新的字段,需要在writeToParcel()方法中适当地处理这些字段的序列化。这意味着子类可以重写父类的writeToParcel()方法,或者添加新的字段和方法。总结来说,子类和父类可以同时实现Parcelable方法,但子类通常会继承父类的实现,除非有特定的需求需要重写或添加新的实现。

2023-12-29 10:40:41 446

原创 子类和父类可以同时实现Serializable方法吗

在Java中,如果一个类实现了Serializable接口,那么它的所有子类都会自动实现Serializable接口,不需要显式地继承或实现。在这个例子中,父类Parent实现了Serializable接口,而子类Child也实现了Serializable接口。由于Serializable是一个标记接口,Child类不需要实现任何方法。因此,如果一个父类已经实现了Serializable接口,它的任何子类都可以直接使用Serializable接口,不需要再次实现。

2023-12-29 10:27:26 494

原创 开发中-唯一标识符最佳做法

本文提供了根据用例为应用选择合适标识符的指导。如需大致了解 Android 权限,请参阅。有关使用 Android 权限的具体最佳做法,请参阅。

2023-11-16 17:26:08 166

原创 混合开发(Android原生与H5交互) 说明文档

目前,比如微信、QQ、淘宝、京东、知乎、各大银行App等大量软件都内嵌了部分H5。Android与H5(JS)互调可以让我们实现混合开发。混合开发就是在一个APP中内嵌一个轻量级的浏览器,一部分原生的功能改为Html5来开发。拿微信举例:微信属于以原生为主,H5为辅,App大部分页面用原生完成,小部分用WebView加载H5的模式。:就是Java代码和JavaScript之间的调用。什么时候使用Native,什么时候使用H5呢?1.的在图文排版,不在开发,很适合做辅助。

2023-11-14 16:44:41 256

原创 kotlin修饰符const的含义

这是因为 const 属性的值在编译时就确定了,而非在运行时才确定,因此只有在编译时就能确定常量值的属性才能使用 const 修饰符。companion object 中定义的属性和方法可以在类的实例上直接访问,就像 Java 中的静态变量和静态方法一样,而且它们只有一个实例,这个实例在第一次访问时被创建,而且它的生命周期与类本身相同。而对于一个使用 class 关键字定义的类,它不是一个顶层属性,也不是一个基本类型或字符串类型的对象的属性,因此不能使用 const 修饰符。二. 使用const属性。

2023-10-19 20:51:12 515

原创 Android 大图显示优化方案-加载Gif 自定义解码器

以上实际的加载优化已经完成,但是我们发现调用的时候需要as方法传入FrameSequenceDrawable,写起来很不方便,希望能改成类似于asgif这种调用方法,这个又需要使用到glide自带的APT技术了,换句话说我们需要使用一个注解。比如内存空间是1 2 3 4个格子,其中1和3是正在使用的内存,2和4是空闲内存,此时如果2和4单个的内存空间不够,那么就需要同时申请到2和4,由于2和4的空间不连续,所以就会导致申请失败。其中2和4这2个内存空间就被称为内存碎片,太小的碎片将无法使用,非常影响效率。

2023-09-03 09:50:09 654

原创 Android 界面置灰

1.Activity中:在Activity的OnCreate方法中设置。setViewGray(dialog的View);2.Dailog:直接调用。

2022-12-02 09:05:40 847 1

转载 Android 禁止输入表情符

Android 禁止输入表情符。

2022-11-30 10:03:10 474

转载 透明度色值一览

100%=00(全透明)00%=FF(不透明)

2022-11-15 13:26:24 2499

原创 解决Android Studio 不自动提示问题

解决Android Studio 不自动提示问题第一种 :一般是由于Android ButterKnife Zelezny插件导致的,在Settings=>Plugins里卸载掉后File---restart IDE 解决!

2022-10-31 13:20:36 4214 1

原创 Java Runtime (class file version 55.0), this version of the Java Runt

打开老项目报 Java Runtime (class file version 55.0), this version of the Java Runt。的jdk版本不一致;需要在Setting-Gradle-对JDK版本进行更改为一致版本即可。安装了最新的稳定版Android Studio 海豚。

2022-10-24 10:38:05 6891 1

转载 Looper的loop死循环为什么不会阻塞主线程

因为我们写的代码就是通过handler驱动起来的,我们activity的onCreate、onResume、onStop等等这些生命周期方法,包括我们的UI绘制的信号,这些UI绘制的事件都是通过Handler Looper循环内部发起的,来调用回调我们的各个Activity,各个Fragment等等这样的一些组件里面的各个生命周期方法,我们的代码就是在循环里面执行的,你说怎么会阻塞呢?你启动它,进入main方法,执行完所有的方法,也就会退出了,那么我们的应用程序你说总不能说执行完main方法就退出把?

2022-09-22 14:37:39 1653

原创 医院各领域榜单。22个科室、100种常见疾病

01 肾脏病主要疾病:尿毒症、慢性肾功能衰竭、肾炎、肾病综合征、多囊肾病、肾结石1、北京大学第一医院2、南京军区南京总医院3、上海瑞金医院4、中山大学附属第一医院5、解放军总医院6、复旦大学附属华山医院7、北京协和医院8、南方医科大学南方医院9、第二军医大学长征医院10、四川大学华西医院 02 泌尿外科主要疾病:尿路结石、肾上腺疾病、肾移植、前列腺疾病、性功能障碍等1、北京大学第一医院2、武汉同济医院3、上海长海医院4、解放军总医院5、四川大学华西医院6、北京协和医院7、天津医科大学第二医院8、中山大

2022-07-27 13:56:56 1550

原创 为什么要使用MVP架构

相对于MVC,把原来的UI逻辑抽象成View接口,原来的业务逻辑就抽象为Presenter接口,原来的Model还是原来的Model。思考newPresenter(this)时候将activity/fragment实例将给引用方会有内存泄漏的风险。并不是的,Jectpack是2018年google-IO出的,是一个为了开发App一整套的解决方案。在deatchView方法,将持有的View层实例释放--view=null;View层通过“View接口”来处理原来的“UI逻辑”;.........

2022-07-20 15:30:06 1245 2

原创 Android知识图谱

Android知识图谱

2022-07-12 14:04:42 643 1

转载 Android Studio Debug调试全篇

Android Studio Debug调试全篇

2022-06-22 13:55:46 8113 3

原创 栈 队列-通俗版

特性:栈:先进后出队列:先进先出栈:只能在表的一端进行 插入 和删除操作 的线性表队列:只能在表的一端进行插入 在另一端进行删除操作 的线性表

2022-02-10 17:18:35 198 1

原创 Activity View Window三者之间的关系-通俗版

activity就像是一个控制器view就是视图window就是一个窗户 用来显示view的承载模型activity在加载的时候 会初始化一个window :phoneWindowphoneWindow包含了一个根视图 RootViewRootView是通过“add”不断把子View添加进根视图里的 比如:textview iamgeView等等子View视图的监听又是交给了 WindowManageService去完成的, 将结果(事件)回调返回给Activity比如:onClickLi..

2022-02-10 17:14:11 439 1

转载 AMS和ActivityThread之间的Binder通信

开发日常在调用startActivity()的时候,实际上调用的是mInstrumentation.execStartActivity()再调用ActivityManagerNative.getDefault() .startActivityActivityManagerNative.getDefault 单例返回的就是ActivityManagerService的远程接口,即ActivityManagerProxy。public abstract class ActivityManagerNa

2021-12-23 17:07:38 530 14

原创 Instrumentation的含义和ActivityThread的关系

每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象 。当startActivityForResult()调用之后,实际上还是调用了mInstrumentation.execStartActivity()startActivityForResult()------> minstrumentation.execStartActivity()方法。public void startActivityForResult(I

2021-12-23 16:38:38 1122 1

原创 Launcher的含义、如何启动的详解

当我们手指触摸屏幕上指定App图标Logo的时候,App就由Launcher开始启动了。Launcher到底是一个概念呢?Launcher本质上也是一个应用程序,和我们的App一样,也是继承自Activitypackages/apps/Launcher2/src/com/android/launcher2/Launcher.javapublic final class Launcher extends Activity implements View.OnClickLis.

2021-12-23 16:18:14 10751 1

原创 服务进程 APP进程间通信

明白了Android Framework的客户端服务器架构之后,那么我们的App进程本身和AMS(SystemServer进程)还有zygote进程 这三个独立的进程,他们之间如何通信呢? AMS:服务端对象,负责系统中所有Activity的生命周期zygote是一个进程 liunx加载的时候 fork出的一个系统进程1.App进程和与AMS通过Binder进行IPC通信,2.AMS(SystemServer进程)与zygote通过Socket进行IPC通信。AMS:Activit...

2021-12-23 15:56:11 1022 1

原创 Android系统里面的服务器和客户端的概念解析

服务器、客户端的概念不仅仅存在于Web开发中,在Android的框架设计中使用的也是这一种模式。服务器端指的就是所有App共用的系统服务,比如我们这里提到的ActivityManagerService,和前面提到的PackageManagerService、WindowManagerService等等,这些基础的系统服务是被所有的App公用的,当某个App想实现某个操作的时候,要告诉这些系统服务,比如你想打开一个App,那么我们知道了包名和MainActivity类名之后就可以打开打开App:知道Ap

2021-12-23 15:50:33 2769 1

原创 ActivityManagerService的含义和作用 初始化流程解析

ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命周期ActivityManagerService进行初始化的时机,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService。从下面的代码中可以看到顺序为:startSystemserver--> 初始化 AncitityManagerServicepublic final class SystemServer { //zygote.

2021-12-23 15:46:10 1382

原创 SystemServer的含义和作用

1.SystemServer是一个进程,并且是由zygote进程fork出来的 [zygote进程]2.Android Framework里面两大非常重要的进程: 1.SystemServer进程 2.zygote进程3.SystemServer比较重要的原因为: 1.系统级的重要服务都是在这个进程里开启的 比如: ActivityManageService、 PackgeManageService、WindowManageService等...

2021-12-23 15:34:04 2447

原创 zygote的含义和作用解析

zygote英[ˈzaɪɡəʊt]美[ˈzaɪɡoʊt]n. 受精卵;接合子[ 复数 zygotes ]1.当你的程序发生Crash的时候,打印的Error log下面通常携带有这一个单词显示出来2.Android是基于Linux系统的,在Linux系统中,所有进程都是由init进程直接或间接fork出来的,zygote进程也是一样。3.在Android中,zygote是一个进程名字。因为Android是基于Linux系统的,当你的手机开机的时候,Linux内核加载完之后 会...

2021-12-23 15:07:48 2262

原创 Activity启动过程梳理

ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期 ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作 ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityM...

2021-12-23 14:58:03 90

原创 android.view.WindowManager$BadTokenException

该异常表示不能添加窗口,通常是所要依附的view已经不存在导致的。[解决方案]:Dialog&AlertDialog,WindowManager不能正确使用时,经常会报出该异常,原因比较多,几个常见的场景如下:1.上一个页面没有destroy的时候,之前的Activity已经接收到了广播。如果此时之前的Activity进行UI层面的操作处理,就会造成crash。UI层面的刷新,一定要注意时机,建议使用set_result来代替广播的形式进行刷新操作,避免使用广播的方式,代码不直观且容易出错。.

2021-12-22 16:09:34 611

原创 java.lang.UnsatisfiedLinkError libc: Access denied finding property “itouch.predict_opt“

记录:在做一个旧项目迁移AndroidX的过程中,运行特定模块(腾讯云人脸核身)报libc: Access denied finding property "itouch.predict_opt" 异常出现此类异常的原因是 引用到的三方依赖/jar.aar包等 没有兼容AndroidX版本需要集成相应库的androidX版本即可...

2021-12-22 15:56:30 1106

原创 Kotlin java.lang.IllegalStateException: must not be null

在Fragment中一直报错说不能为空。然后进行Google:得出结论,通常我们把initView方法写在onCreateView方法中,但是这个时候view可能并没有返回,所以就找不到,所以我们要把初始化操作放在onActivityCreated或onViewCreated中只要把View视图赋值 或者控件放到 onViewCreated 中初始化即可:override fun onActivityCreated(savedInstanceState: Bundle...

2021-12-21 14:07:01 1466

转载 Kotlin中 各符号的含义 ?

Kotlin中 ?、!!、?:、:: 、->符号的含义Kotlin 中新增了一些符号,先记录在案,方便理解和学习。1. ? 和 !!"?"加在变量名后,系统在任何情况不会报它的空指针异常。"!!"加在变量名后,如果对象为null,那么系统一定会报异常!上述是两个符号的简单概念,为了更好的解释这两个概念,我们先从java代码入手,如下例:ArrayList<String> myList = null; // 创建一个null的队列Log.d("TAG",..

2021-12-06 14:21:30 484

原创 Kotlin 概述【官方】

支持多平台编程是 Kotlin 的主要优势之一。它减少了为不同平台编写和维护相同代码所花费的时间,同时保留了本机编程的灵活性和优势。这就是 Kotlin Multiplatform 的工作原理。 Common Kotlin包括语言、核心库和基本工具。用普通 Kotlin 编写的代码适用于所有平台。 借助 Kotlin 多平台库,您可以在通用和特定于平台的代码中重用多平台逻辑。公共代码可以依赖于一组涵盖日常任务的库,例如HTTP、序列化和管理协程。 要与平台互操作,请使用特定

2021-11-23 14:00:50 7682

转载 android:requestLegacyExternalStorage解析

在Android使用fuse文件系统开始,Android针对外置存储支持了独立的沙箱存储空间, 一般通过Context.getExternalFilesDir() Api获取,该空间内的数据为应用独有,并且不需要申请任何权限即可使用。但是当时并没有限制应用读写非沙箱内的数据。但是从Android Q开始,出于数据隐私问题,Android 希望禁止应用程序操作非沙箱内的数据。 但是为了过度,Android提供了requestLegacyExternalStorage机制,来帮助应用使用原来的机制继续读写存储卡

2021-11-12 13:16:56 11059 2

原创 java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #2)

在用Retrofit进行网络请求的报错:java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #2)意思是:第二个参数没有写具体的方式类型如:忘记@Field@Body检查一下 添加上就好了...

2021-10-26 16:30:30 1777

原创 什么是安卓的组件化原理?

优势:一是结构清晰,各个模块的代码实现分离,不会搅在一起。在代码review或者二次开发的时候一目了然,不会满世界去找代码。二是协同开发的时候更灵活,不用再等同组其他同事的模块开发完成后才能运行app,自己负责的模块稍加修改就可以当做主app直接跑起来。三是便于维护。每个模块的代码、布局文件、资源文件可以随时从项目中通过gradle配置去除掉。传统的项目架构中,往往如图所示:这样的项目结构不是很好,因为某个重要模块删除或修改时,会影响到其他模块的使用甚至引起连锁错误,耦合度很高。组件化的出现解

2021-10-24 21:01:29 202

原创 Android 2021隐私设置最佳做法

Android 致力于帮助用户充分利用最新的创新技术,同时始终将用户的安全和隐私视为第一要务。注意权限确保公开透明并让用户自主控制应用的使用体验,从而赢得用户信任。 根据实现应用功能的具体需要,请求授予最基本的权限。每当对应用进行重大更改时都应审核请求的权限,确认应用的功能仍然需要这些权限。 请注意,较高版本的 Android 通常会以注重隐私保护的方式引入无需权限即可访问数据的方法。 仅在需要时(而不是在应用启动时)请求权限,以便用户清楚地了解您的应用需要的权限。 如果您的应用是

2021-10-24 20:54:40 2594

原创 Android如何将应用迁移到 Android 12

本文对典型的开发和测试阶段进行了简要介绍,以帮助您制定与平台发布时间表保持一致的准备计划,并确保您的用户在 Android 12 上获得良好的体验。每次发布新的 Android 版本时,我们都会推出一些全新的功能并引入一些行为变更,目的就在于提高 Android 的实用性、安全性和性能。在许多情况下,您的应用都可以直接使用并完全按预期运行;而在其他的一些情况下,您可能需要对应用进行更新以适应这些平台变更。源代码发布到 AOSP(Android 开源平台)后,用户随之就可能开始使用新平台。因此,应用必

2021-10-24 20:51:16 1140

原创 Android Activity页面是否加载完成

private boolean isFirst = true; //永远判断是否第一次显示,否则每次锁屏后重新解锁都会调用@Overridepublic void onWindowFocusChanged(boolean hasFocus) {// TODO Auto-generated method stubsuper.onWindowFocusChanged(hasFocus);if (hasFocus && isFirst) {isFirst = false..

2021-10-24 20:47:27 860

原创 架构设计模式

技术架构设计一高性能架构高可用结构可伸缩架构可扩展结构安全架构低成本架构易维护架构利于开发效率符合公司战略高性能架构高可用结构:宏观上了解如何去实现高性能架构:请求分发:...

2021-10-24 20:45:38 48

ECTranslation2 Plugin

ECTranslation2 Plugin

2022-11-16

人脸核身SDK AndroidX版本.zip

人脸核身SDK AndroidX版本.zip

2021-12-22

PayPasswordDemo.zip

Android 6位支付密码 密码输入框 极简单的代码实现, //去支付按钮 tvMainPop = findViewById(R.id.tv_main_pop); tvMainPop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //屏幕阴影变暗 setDarkWindow(true); PassValitationPopwindow mPassValitationPopwindow = new PassValitationPopwindow(MainActivity.this, tvMainPop, new PassValitationPop[removed]() { @Override public void onSuccess(String code) { Toast.makeText(MainActivity.this, "您输入的密码为:" + code, Toast.LENGTH_SHORT).show(); //todo 去做业务逻辑 code为输入的6位密码 } }); mPassValitationPopwindow.setOnDismissListener(new Popup[removed]() { @Override public void onDismiss() { //去除背景变暗 setDarkWindow(false); } }); } });

2020-04-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除