自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android Gradle升级至7.4依赖不上本模块下lib下的aar解决方案

升级后是在跟目录下的setting.gradle目录下这样写。之前写法是在跟目录下的build.gradle目录下这样写。

2024-01-17 17:59:53 432

原创 Android启动界面之isTaskRoot的妙用及Deeplink的处理

2:如果我们需要通过deeplink传递数据,然而DeepLink很多时候会配置在我们启动界面上,这样我们只能在启动界面收到数据在主界面就拿不到。1: 当应用从后台回到前台时,由于启动模式为singleTask,这样就会重装走启动界面的onCreate方法,然后又跳转至我们APP的主界面。我们的APP启动界面的Activity模式大概率都会设置为singleTask,然后在启动界面里面会跳转至我们APP的主界面。上面代码会引发出地个问题。

2023-12-01 17:13:40 436

原创 【Android支付】RuStore支付是我见过所有渠道支付最差劲的支付,没有之一

RuStore支付是我见过所有渠道支付最差的支付,没有之一。

2023-11-15 09:35:55 127

原创 【鸿蒙BUG】开发游戏的一个登录界面,发现鸿蒙一个BUG(小记)

在用Dialog做登录弹窗的时候,在做窗口管理的时候我会把除最上层的窗口都hide,开始调用的是DIaLog的hide方法,其它手机开始测试都没 什么问题,后来测试发现在下拉状态栏操作一些东西的时候,后面影响的Dialog在左上角给显示出来了。然后能过复现发现是在点击华为分享的时候在同意协议的时候点取消必现。无敌大BUG死坑解决方法,重写Dialog的hide方法,去掉super自己做View的隐藏,用INVISIBLE 不能用GONE

2022-12-07 16:18:47 294

原创 Android 音视频入门之C++入门序列(四)- 函数构造

C++ 和Java类型还是非常多的 构造写法也很类似构造函数#include <iostream>using namespace std; // C# .net也有命名空间// 对象默认会有一个指针class Animation { // 空参构造函数 Animation() { cout << "空参数构造函数" << endl; } Animation(char *name) { cout

2022-04-20 16:16:15 174

原创 Android 音视频入门之C++入门序列(三)- 命名空间

关键字 namespace我们之前在打印的时候有有用到std:: cont这个是没用命名空间的 打印int main () { std::cout << "Hello Work " << std::endl;}当我们声明了std时就可以省略std::using namespace std; // 全局的所有函数都可以用int main () { cout << "Hello Work " << std::endl;}也可以

2022-04-20 15:50:19 2393

原创 Android 音视频入门之C++入门序列(二)- 函数

C里面函数写法void change(int *num1, int *num2) { int temp = 0; temp = *num1; *num1 = *num2; *num2 = temp;}C++写法// & 代表是引用void change2(int &num1, int &num2) { std::cout << "change2 " << "n1的地址: " << &nu

2022-04-20 15:41:34 2605

原创 Android 音视频入门之C++入门序列(一)- 初步认识C++

#include <iostream> // c++标准支持using namespace std; // 命名空间 C++的特性,相当于Java语言的内部类int main() { // C++是面向对象 C语言是面向过程 函数+结构体 // C++可以基于C,可以调用C语言,反之C不能调用C++ // C++打印 << 这个是操作符重载 Kotlin里面这种语法会经常看到 std::cout << "Hello, Worl

2022-04-18 10:05:00 1508

原创 Android 音视频入门之C入门序列(十一)- 文件加解密思路

加密思路加密 === 破坏文件方式一: 全部加密, 对每一个字节都处理方式二: 部分加密,把某一部分内容拿出来处理如何破坏呢,可以最简单的思路,就是把取出来的数据异或某一个值。解密思路解密 === 将破坏过的文件还在原在加密思路中异或的值再异或一次代码实现 char *fileNameStr = "D:\\Temp\\IMG.png"; // 来源 char *fileNameStrEncode = "D:\\Temp\\IMG_encode.png"; // 加密后的目标文件 FIL

2022-04-18 09:55:19 246

原创 Android 音视频入门之C入门序列(十)- 操作文件入门

C里面打开文件API fopen 参数详解fopen (参数1: 文件路径, 参数2: 模式(读r, 写w,rb作为二进制读,wb作为二进制文件写))读取文件数据int main () { // 文件路径 char *fileNameStr = "D:\Temp\DerrFile.txt"; // 打开一个API FILE *file = fopen(fileNameStr, "r"); // 判断文件是否被打开 因为读一个文件可能这个文件不存在 if (!file) {.

2022-04-18 09:39:31 1207

原创 Android 音视频入门之C入门序列(九)- 结构体别名

通用写法 给结构体写别名 关键字typedef// 首先定义一个结构体struct Worker_ { char name[10]; int age; char sex;};// 给结构体定义一个别名 typedef struct Worder_ Worder_;// 定义一个结构体指针别名typedef struct Worder_ * Worder;// 使用int main () { // 首先没有定义别名时是这样创建的 struct Work

2022-04-13 14:03:43 1486

原创 Android 音视频入门之C入门序列(八)- 结构体

Java里的对象对应C里的是结构体 关键字struct定义结构体// 方式一struct Dog { // Java类里有成员, // 成员 char name[10]; // 这个需要copy int age; char sex;};// 方式二struct Person { char *name; // 这个可能直接赋值 int age; char sex;} ppp0, ppp = {"Derry", 3.

2022-04-13 13:37:57 1552

原创 Android 音视频入门之C入门序列(七)- 字符串相关

定义字符串的二种方式方式一char str[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 加上'\0'的作用是打印有个结尾方式二char *str2 = "Hello"; // 这名话会隐式加了\0, 所以这个不需要在后面加\0上面二种方式在使用上也是有区别// 方式一char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};// 方式二char *str2 = "Hello";// 方式一可以执行修改操作

2022-04-08 16:42:24 1782

原创 Android 音视频入门之C入门序列(六)- 内存开辟

C里内存开辟分静态开辟和动态开辟静态开辟int arr[5];// 静态开辟// 下面为数组赋值for (int i = 0; i < 5; ++i) { arr[i] = i; printf("%d, %p \n", *(arr + i), arr + i);}Java布尔类型定义为boolean, 而C中只有0和1, 非0即true, 0就是false静态开辟内存也要注意, 不是随便开辟多大都可以,假如下面int arr[10*1024*1024]; // 这.

2022-04-08 16:06:57 1514

原创 Android 音视频入门之C入门序列(五)- 函数指针

指针类型有何用指针也为内存地址,他在32系统中占用永远是 4个字节, 64位为8所以用处就是在取值的时候系统知道怎么取,这就是类型规范的好处,因为是4个 固定,所双找下个只要知道偏移4就是下一个就可以函数指针函数本身就是指针,当我们定义了一个函数的时候他就有个内存地址,所以函数也可以当做参数传递,如下面例子#include <stdio.h>// 先定义下面二个方法void add (int num1, int num2) { printf("num1+num2 = %d\n",

2022-03-31 17:37:47 2353

原创 Android 音视频入门之C入门序列(四)- 多级指针及数组

在我们平时写代码中常用的为三级指针及以下,多的用的比较少int num = 999;//定义一级指针: int * num_p = &num; //定义二级指针: int ** num_p_p = &num_p;//定义三级指针: int *** num_p_p_p = &num_p_p;printf("num_p的地址是: %p, num_p_p的地址是: %p\n", num_p, num_p_p);printf("num_p_p的值是: %d\n", .

2022-03-31 16:34:07 2409

原创 Android 音视频入门之C入门序列(三)- 函数入门

C里面函数和Java里面的函数差不了多少,但是也有区别 区别1:C里面的函数需要和无申明再使用错误方式如下,change函数写在了main函数下面#include <stdio.h>int main(){ //函数, 取修改一个数(指针操作) int i = 100; change1(i); return 0;}// 函数不能写在main的上面 非要写在后面,要先声明再实现void change(int i){ // 这个函数传过来的i c会.

2022-03-31 15:41:41 266

原创 Android 音视频入门之C入门序列(二)- 指针入门

在Java中有这么一种说法,万物皆对象,而C C++也有一种说法,万物皆指针而Linux则万物皆对象指针在C中指针就是内存地址比如下面代码 定义了一个别名为numbler1的int型变量,给他赋值于100000int numbler1 = 100000;C里面获取内存地址的方式为 &(取值)比如下面代码,int * 代表定义一个指针,别名为numbler1_p 将其赋于numbler1的内存地址(&numbler1)int * numbler1_p = &num.

2022-03-30 15:02:37 1455

原创 Android 音视频入门之C入门序列(一)- 初步认识C

初步认识C#include <stdio.h> // <>寻找系统的资源 “” 寻找自己写的资源// .h .hpp (声明文件 头文件)// .c .cpp (实现 文件)int main1() { // 函数入口 printf("Hello word!\n");// getchar(); // 阻塞程序//下面是定义基本类型 int i = 100; double d = 200; long l = 200;

2022-03-30 14:07:06 679

原创 对象与垃圾回收机制

虚拟机中对象的创建过程当JVM遇到一条字节码new指令的时候,会会检查这个类是否已经被加载,如果没有加载则通过类加载机制加载对应的.class文件 加载完的.class类信息是分配在方法区的加载成功后,开始分配内存分配内存有几种方式一种是指针碰撞,这种方式使用的垃圾回收机制是带垃圾整理一种是空闲列表,这种方式 使用的垃圾回收机制是标记算法分配内存会有多线程,所以会有线程安全问题,解决方法通过CAS来处理,失败继续CAS本地线程分配缓存(每次开启一个线程就会给该线程分配一块内

2021-11-06 23:15:23 108

原创 Android事件分发机制详解及解决文案:史上最全面、最易懂

点击屏幕Android事件是如何传递,先上图然后再源码解读源码解读当用户触摸屏幕首先由当前Activity来分发public class TouchEventActivity extends AppCompatActivity { private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedIn

2021-11-02 16:48:25 1783

原创 从ReentrantLock的实现看AQS的原理

前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS简介AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架核心思想是,如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加

2021-10-29 15:29:22 143

原创 ThreadLocal原理详解——原来ThreadLocal是这和强大的存在

ThreadLocal定义为每一个线程提供变量的副本,实现了线程的隔离,也可以保证线程的安全性。和ThreadLocal相关类ThreadLocal内部类ThreadLocalMapThreadLocalMap.Entry ThreadLocalMap内部类Thread类ThreadLocal是一个带泛型的类public class ThreadLocal<T> {}源码分析Android中最典型用到ThreadLocal地方在Looper里public final

2021-10-20 09:24:29 701

原创 Android 多线程:Thread理解和使用总结

线程和进程的区别.进程:操作系统运行程序时分配资源的最小单位,进程和进程之间是相互独立的线程: cpu调度的最小单位,它必须依赖于进程.线程在运行时会占用该进程的部分资源,线程之间是可以共享该进程所拥有的全部资源.但是线程与线程之间也有自己的独立空间,称之为线程私有空间.Android中进程和线程之间的关系启动一个App就会启动一个进程,进程名为其包名。一个进程里面会启动多个线程,线程必须依赖进程多线程引发的问题线程死锁导致进程Anr 原因:因为一个进程中多线程是资源共享的, 也就是都可以

2021-10-19 19:21:13 2171

原创 Retrofit2完全解析和与okhttp之间的关系

刨析Retrofit源码前先简单介绍以下几个和Method相关的方法Method method;//第一: 获取方法上所有的注解Annotation[] methodAnnotations = method.getAnnotations();//第二: 获取方法参数上的所有注解//为什么是二维数组: 因为一个参数会有多个注解, 一个方法可以有多个参数Annotation[][] parameterAnnotationsArray = method.getParameterAnnotations(

2021-10-15 00:32:35 317

原创 设计模式之代理模式

代理模式分为静态代理和动态代理静态代理就拿网络请求来说先定义一个网络请求统一接口INetworkRequester 里面有一个post方法public interface INetworkRequester{ void post();}网络请求框架有很多种比如早期的 Volley 现在的Okhttppublic class OkhttpNetworkRequester implements INetworkRequester{ public void post(){ Log.i("

2021-10-13 01:14:09 79

原创 Java注解,反射和泛型

注解作用和意义注解又称标注,是Java1.5引入的,注解本身没有任务意义,单独的注解就是一种注释,它需要结合反射,插桩技术才能体验其用处元注解: 注解上的注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.CLASS)public @interface ARouter { String path(); String group() default "";}@Target 标识的是注解在什么上,比如class,方法

2021-10-12 00:49:27 137

原创 深入理解JVM

JVM:它是作用是将.class文件翻译成机器码.(首先通过类加载器将.class文件加载到运行时数据区(JVM管理的内存))-->通过执行引擎,将类放在运行时数据区的数据进行解释执行或JIT执行(比如一个方法JVM发现它执行了1000次或者1万次,这样JVM认为解释执行没有意义 ,JVM就会把这些代码直接编译成本地代码提高运行速度)它有二种加载方式:第一种是全部翻译出来,这样第一次加载的时候就会用掉很长时间 .第二种是执行行到哪一行就翻译哪一行也叫解释执行.VM运行时数据区:Java虚拟机在

2021-05-12 22:20:43 163 1

原创 Android游戏应用内悬浮球(不需要申请权限)

悬浮球踩过的坑公司的SDK要写一个登录界面,里面涉及到悬浮球,但是不能申请权限。起初想到的方案是利用游戏的一个Activity,通过下面代码找到容器viewView root = activity.findViewById(android.R.id.content);然后再把悬浮球View添加进去 View root = activity.findViewById(android.R.id.content); if (root instanceof Fram

2020-08-03 19:12:24 928 5

原创 多线程: 锁的妙用之消费者,生产者的运用

有这样一个需求,每当一个生产机器生产出一个面包的时候,要等消费者消费完了再继续生产.package com.ancely.fyw;public class FoodDemo { private String mFoodName;//物品名 private int mFoodId;//物品ID private boolean isProducted; public synchronized void putFood(String foodName) { .

2020-05-31 21:56:29 133

原创 多线程并发之对synchronized和Lock的简单使用

锁比如有三个线程thread-0, thread-1, thread-3三个线程同时在执行一个带锁的方法时,如果thread-0先获得了锁,那么其它二个线程就只能外面等着,直到thread-0把锁给释放了,这个时候就由其它线程去争取这个锁.生活中的例子: 现在有三个人同时都要上厕所A,B,C . A先进入到了厕所,这个时候A就会把门给锁了,B,C就要在外面等,直到A上完出来把门打开,这个时候B,C才能有一个人进去,进去后也是锁门,出来也是解锁,然后继续下一个人.锁可以解决多线程中线程安全..

2020-05-31 21:24:05 189

原创 Java个人对线程和进程的理解及面试相关

进程: 操作系统运行程序时分配资源的最小单位,进程和进程之间是相互独立的线程: cpu调度的最小单位,它必须依赖于进程.线程在运行时会占用该进程的部分资源,线程之间是可以共享该进程所拥有的全部资源.但是线程与线程之间也有自己的独立空间,称之为线程私有空间.讲到线程,一个进程有多个线程,所以会有多线程并发问题出现.什么是并发: 并发就好比一条高速收费口(这就相当于一个进程),假如这个入口有8个收费口,就代表着这个进程开了8个线程一直在跑. 这时并发好比在一个小时一共有多少汽车通过了这个收费口.这就

2020-05-26 21:01:04 136

原创 Java个人对泛型的理解(二)之通配符

Java个人对泛型的理解(一)泛型中的通配符为 ?--它会让泛型使用起来更加灵活通配符有下面几种用法1: List<?> list = new ArrayList<>();2:List<? extends Activity> list = new ArrayList<>();3:List<? super Activity> list = new ArrayList<>();第一种用法称之为非限定通配符,它的...

2020-05-25 02:03:30 143

原创 Java个人对泛型的理解(一)

Java中的泛型<T>作用:是将运行时的异常转到编译时来处理,代码更健壮,更简洁,更灵活,复用性强AIShoes<T> ; T为类型参数AIShoes<Nike>中的Nike为实际类型参数AIShoes<T>: 这一整个为泛型类型AIShoes<Nike>: 整个称为参数化的类型也就是ParameterizedType用法: 作用在接口之上,比如一个鞋子接口public interface IShoes&lt...

2020-05-25 00:42:59 219

原创 Android中如何通过keystore生成https证书,并设置证书到我们请求

需要使用keytool命令输入keytool --help 会出现下面帮助类-certreq 生成证书请求-changealias 更改条目的别名-delete 删除条目-exportcert 导出证书-genkeypair 生成密钥对-genseckey 生...

2020-04-29 01:23:51 925

原创 跨进程通信Messenger是如何实现的

比如有这样一个需求,APP检测到需要更新,为了不影响我们本应用,我们需要别外开启一个服务进程来下载这个APK,这就涉及到了二个进程进行通信.这样我们就可以使用Messenger,Messenger他其实就是对AIDL的再次封装.Messenger里面有二个构造方法,分别是传Handler,IBinder. 还有一个成员变量IMessenger target, 不管哪种构造方法都是为了给ta...

2020-04-27 01:03:07 170

原创 类加载机制及热修复实现之插桩原理

Android中是通过ClassLoader来加载class文件的,Android中的ClassLoader分为系统的和自定义的系统的有BootClassLoader DexClassLoader PathClassLoader,而DexClassLoader PathClassLoader都继承于BaseDexClassLoader这二个在加载类的时候操作逻辑全在父类BaseDexClas...

2020-04-15 23:56:42 236

原创 详细讲解下Hook技术,以Hook点击事件来示范

Hook技术: Hook就是有一段程序逻辑一直走下去,我们可以捕获到其中间的一些逻辑,加于处理然后再让他接着执行下去;比如Android里面的setOnclickListener这个方法. 正常我们是这样操作的 TextView textView = findViewById(R.id.act_invoke_tv); textView.setOnClick...

2020-04-04 22:11:08 1233

原创 浅谈哈希表和解决哈希冲突的几种方法

哈希表也叫散列表它的底层是通过数组也存储元素的,他里面有个hash函数,将一个key传给hash函数,他会利用这个key生成这个key对应的索引,他的复杂度是O(1),所以得用哈希表来去完成映射的添加,搜索,删除的话,总的来说时间复杂度是O(1)级别的.hash函数也叫散列函数哈希表内部的数组元素,很多地方也叫Bucket(桶),整个数组叫个Buckets或者BucketArray...

2020-03-28 17:29:25 1367

原创 JVM内存分配分析

内存管理是JVM的核心内存分配:Jvm在运行过程中会把所管理的内存划分为若干个不同的数据区域(运行时数据区) 线程私有的内存: 程序计数器,本地方法栈,虚拟机栈 程序计数器:指向当前线程正在执行的字节码指令的地址(行号)因为java是多线程,会有线程切换,确保多线程情况下的程序正常执行,记录每个线程执行到哪里 ...

2019-12-11 15:53:33 158

MVP简单封装

mvp框架简单封装,支持加载更多数据,get put 请求 mvp框架简单封装,支持加载更多数据,get put 请求

2017-11-28

Android代码实现布局

Android代码实现布局

2017-07-28

空空如也

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

TA关注的人

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