自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 HTTP状态码

`301 Moved Permanently`:请求的资源已被永久移动到新的URL,响应中应包含Location头指向新的URL。- `204 No Content`:服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。- `302 Found`(现在一般推荐使用303或307):临时重定向,请求的资源临时位于新的URL下。- `502 Bad Gateway`:作为网关或者代理工作的服务器,从上游服务器接收到无效的响应。

2024-03-28 19:28:42 339

原创 CountDownLatch Semaphore

CountDownLatch 初始化时设置一个计数值,每当一个线程完成自己的工作时,调用 `countDown()` 方法将计数值减1,当计数值减到0时,那些因为调用 `await()` 方法而处于等待状态的线程将会被唤醒继续执行。信号量(Semaphore)主要用于控制同时访问特定资源的线程数量,它维护了一个许可计数,线程可以通过 `acquire()` 请求一个许可,如果没有可用的许可(即计数为0),则线程会被阻塞;线程完成操作后通过 `release()` 方法归还许可,增加计数。

2024-03-28 17:13:32 216

原创 Android Choreographer

Android Choreographer(中文常译为“编舞者”)是Android系统中用于协调UI渲染工作的重要组件,它在Android 4.1(Jelly Bean)版本中被引入,主要用于解决界面渲染的精确时序问题,确保应用程序能够与屏幕的垂直同步信号(Vsync)保持一致,从而达到平滑、不掉帧的动画效果。如果没有正确同步GPU输出图像帧的时机与显示器刷新的时机,就可能出现新的一帧图像正在被显示的同时,上一帧图像的一部分还未完全显示完,导致新旧帧图像交错在一起,形成画面撕裂。

2024-03-28 09:40:54 397

原创 View 绘制流程

在Android系统中,View的绘制流程主要包括三个核心步骤:**Measure**、**Layout** 和 **Draw**。- 开发者如果重写了`onMeasure()`方法,需要在此处计算并设置View的宽高,通常使用`setMeasuredDimension()`方法来报告测量结果。- 子View会递归地调用自身的`onMeasure()`方法,直到整个View树的所有View都得到了正确的尺寸。- 绘制子View(递归调用子View的`draw()`方法)- 绘制View自身的内容。

2024-03-28 09:37:57 324

原创 Glide

另外,Glide 缓存机制还涉及到缓存键的生成,基于加载的模型(如 URL 或 File)以及可能的签名(Signature),确保不同变体的图片会被正确地分别缓存,并且能够在合适的时机复用已有的缓存数据。- `Glide.with(context)`:获取一个 `RequestManager` 对象,它是对 Glide 请求生命周期的管理器,确保图片加载与当前上下文(如 Activity 或 Fragment)的生命周期同步。对于本地图片,缓存变换后的资源。

2024-03-28 09:09:12 312

原创 在 Android 系统中,窗口(Window)按照功能和层级

子窗口是依附于应用窗口之上的附加窗口,它们通常嵌入在 Activity 的布局中,或者暂时出现在 Activity 之上。子窗口的 Z-order 高于应用窗口,但低于系统窗口。应用窗口的 Z-order(堆叠顺序)位于系统窗口之下,子窗口之上。窗口的层级关系决定了它们在屏幕上的显示顺序和相互覆盖关系,一般来说,层级越高(type 值越大)的窗口会显示在顶部,遮盖住层级较低的窗口。- 系统窗口拥有最高的 Z-order,它们通常由系统服务创建和管理,可以覆盖在所有应用窗口之上。

2024-03-28 08:38:53 425 1

原创 Java JMM

**原子性(Atomicity)**:对于非原子性的操作,比如读写一个long或double变量、非同步的复合操作,在多线程环境下可能造成数据不一致。- **有序性(Ordering)**:由于指令重排序的存在,可能导致多线程环境下的执行顺序变得不确定,JMM通过happens-before原则来保证多线程环境下操作的有序性。1. **可见性**:如果线程A执行的操作A对某个变量进行了写操作,而线程B随后执行的操作B对该变量进行了读操作,那么可以确保线程A对变量的修改对线程B是可见的。

2024-03-26 14:23:56 280

原创 Android平台上进行代码优化

合理安排UI更新,利用`Handler`、`Choreographer`或者`RecyclerView`的动画机制,避免过于频繁地刷新界面。- 适当使用弱引用、软引用以及生命周期感知组件,如`LiveData`和`ViewModel`,以适应组件生命周期的变化。- 控制内存分配,特别是在循环中避免创建大量临时对象,考虑使用局部变量、数组缓冲区等手段。- 优化算法,减少不必要的计算和循环,尤其是对于大量数据或频繁执行的操作。- 使用索引、合理设计表结构,并优化SQL查询语句,减少数据库查询时间。

2024-03-25 20:32:20 202

原创 Android设计模式

1. **观察者模式 (Observer)**:对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。3. **建造者模式 (Builder)**:将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表现形式。5. **对象池模式 (Pooling, 有时也被归为享元模式的一种变体)**:避免频繁地创建和销毁昂贵的对象,而是从一个对象池中获取已经存在的对象进行复用。7. **代理模式 (Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。

2024-03-22 08:48:46 1150

原创 HTTP Header Fields

**Connection**: 指定连接管理,如是否保持持久连接(`keep-alive`)或升级协议(`Upgrade`)。- **Accept-Encoding**: 客户端能够接受的内容编码方式,如gzip、deflate等压缩算法。- **Transfer-Encoding**: 指定传输编码方式,比如分块传输(`chunked`)。- **User-Agent**: 客户端软件的信息,通常指浏览器的名称和版本。- **Set-Cookie**: 设置要发送给客户端的HTTP Cookie。

2024-03-22 08:17:11 731

原创 ADB/ADB shell

不过,请注意在进行此类操作时,必须谨慎对待,以防误操作导致设备出现问题。- 连接调试器:`adb forward tcp: jdwp:` 或 `adb shell am start --activity-clear-top -D `- 对单个设备或指定序列号的设备操作:`adb -s `- 启动、停止或重启设备的ADB服务:`adb start-server`, `adb kill-server`

2024-03-21 11:11:53 1245

原创 图形绘制和合成

在HWUI的工作机制中,特别提到了Display List的概念,它是一种优化策略,将View的绘制命令序列化并存储起来,当View的内容没有变化或仅发生部分变化时,可以直接重用或更新Display List,然后快速地通过OpenGLES调用执行这些预编译的渲染指令,减少不必要的重复计算,进一步提升了渲染性能。5. **3D渲染中的合成**:在3D环境中,合成包括光照计算、深度缓冲(Z-buffering)、阴影投射、反射和折射等效果,将多个渲染结果整合到最终的帧缓冲区中。

2024-03-21 10:32:58 282

原创 invalidate() 和 requestLayout()

如果视图的尺寸或位置需要改变,则应调用 `requestLayout()`,同时,由于布局变更通常也会引起内容变化,所以调用 `requestLayout()` 后系统一般会自动跟进 `invalidate()` 更新显示内容。- 这个方法会导致视图的部分或全部区域被标记为“dirty”(无效),随后系统会在下一个绘图周期中调用 `onDraw()` 方法重绘视图内容。- 当视图的外观(如颜色、图形、图像等)发生改变,但不涉及视图尺寸或位置的变化时,应当调用 `invalidate()` 方法。

2024-03-14 11:38:26 511

原创 Android Looper.loop()不会阻塞主线程?

没有消息时,主线程不会执行任何实质性的工作,也不会阻塞在某个长任务上。在Android中,`Looper`的`loop()`方法负责处理消息队列(Message Queue)中的消息,这个方法内部是一个无限循环,不断地从消息队列中取出消息并分发到对应的处理器(Handler)进行处理。综上所述,`Looper.loop()`在主线程中执行时,由于其巧妙的设计和异步消息处理机制,可以确保主线程不会因为这个循环而被阻塞,从而确保UI的流畅性和响应性。,从而保持主线程的可响应性。

2024-03-14 11:28:25 468

原创 Java 常量池存储区域

字符串常量池是专门用于存储字符串字面量的区域,当创建字符串时,如果字符串的内容相同,那么JVM会确保它们指向同一个内存地址,以节省内存空间并提高性能。- 运行时常量池除了包含类文件常量池中的信息之外,还会在运行时动态生成新的常量,例如string intern()方法会将字符串加入运行时常量池。Java中的常量池是Java虚拟机(JVM)内存区域中的一部分,主要用来存储各种类型常量的数据。然而,在Java 7更新版本中,对永久代进行了调整,字符串常量池被移出了方法区,改到了Java堆内存中。

2024-03-14 10:30:04 435

原创 java static /static final 初始化时机

如果`static final`变量的值无法在编译时确定(例如,它的值是从方法调用、文件读取或者其他不确定来源获取的),那么这个变量会在类加载的过程中初始化,具体是在类初始化的静态初始化块执行之前或在首次访问该变量时(如果还没有初始化的话)进行初始化赋值。- 如果`static final`变量是基本类型或String类型,并且其值在声明时就可以明确计算出来(例如字面量或简单的算术运算结果),那么Java编译器会将其视为编译时常量。静态变量可以在声明的同时进行初始化赋值,这也是最常见的赋值时机。

2024-03-14 10:18:55 425

原创 ConcurrentHashMap 加锁

然后,将这个哈希码与`ConcurrentHashMap`的并发级别进行取模运算(`hash % concurrencyLevel`),得到的余数就是Segment数组的索引,从而定位到对应的Segment。当多个线程试图修改同一个桶时,才会发生锁竞争,而对不同桶的操作可以并发进行。当HashMap中的元素数量超过负载因子(load factor,默认是0.75)与当前容量的乘积时,将会触发扩容操作,容量翻倍,并将所有的键值对重新计算索引位置后放入新的数组中,这一过程也称为rehashing。

2024-03-14 09:34:40 1192

原创 Android 定时任务

AlarmManager在API级别大于等于19(KitKat)时,建议使用`setExact()` 或 `setAndAllowWhileIdle()` 来确保定时任务尽可能准确执行。- `Handler` 和 `postDelayed()` 可以用来实现较短时间内的定时任务,尤其在同一个应用进程中。.observeOn(AndroidSchedulers.mainThread()) // 结果在主线程回调。.subscribeOn(Schedulers.io()) // 指定任务在IO线程执行。

2024-03-14 09:20:00 949

原创 AIDL(Android Interface Definition Language)

这样,虽然客户端发起的仍然是一个同步调用,但服务端在接收到请求后立即返回并在后台线程处理实际任务,然后通过预先注册的回调接口将结果异步地通知给客户端,从而达到了异步调用的效果。在服务端的服务类中,实现AIDL接口,并在`doAsyncTask`方法中启动一个新线程执行耗时操作,完成后通过回调接口通知客户端。在客户端,创建一个实现了INotify接口的类,并在绑定服务成功后,传入这个回调对象到服务端的`doAsyncTask`方法。在服务端创建AIDL文件,定义需要被客户端调用的方法。

2024-03-14 09:10:18 342

原创 java 对象创建过程

当new关键字执行时,JVM会检查堆内存是否足够分配一个新的对象。这块内存不仅包含对象实例数据(成员变量),还包括对象头信息,如对象的类元数据指针、哈希码、锁状态标志等。对象内存空间分配好后,JVM会为对象的实例变量(非static变量)分配默认值,如整型变量为0,布尔型为false,引用类型为null等。在这段代码中,`new MyClass(args)`创建了一个MyClass对象,并将其引用赋给了变量`obj`。构造方法执行完毕后,对象的创建过程完成,现在可以使用这个新创建的对象进行操作。

2024-03-14 08:30:05 401

原创 TYPE_APPLICATION_OVERLAY 悬浮窗

在Android 6.0(API级别23)及以上版本,为了保证用户隐私和安全,如果应用想要创建。这个权限允许应用显示在其他应用上面,如果不授权,应用将无法创建或显示悬浮窗口。类型的窗口,从而实现在任何界面(包括锁屏界面)上显示悬浮窗口的效果。当用户同意授权后,应用才能成功创建并显示。类型的窗口,必须动态请求。

2024-03-14 08:29:19 918

原创 java double check

为了解决这个问题,从Java 1.5开始引入了`volatile`关键字来修饰instance变量,以确保对其的读写操作具有原子性和可见性,禁止了指令重排序,从而解决了double check在旧版JVM中的线程安全问题。最初,在一些旧版JVM实现中,单纯使用double check可能会导致线程安全问题,这是因为编译器和处理器的优化措施可能会导致。在多线程环境下,由于指令重排序的影响,步骤2和步骤3可能被打乱顺序,导致其他线程在初始化完成前就看到了非空但未初始化完成的instance对象。

2024-03-13 16:27:56 497 1

原创 kotlin 协程原理

Kotlin 协程的核心特性是suspend函数。这类函数可以在执行过程中被挂起并恢复而不会阻塞线程。编译器会对suspend函数进行特殊处理,将其转换为状态机的形式,每个挂起点对应状态机中的一个状态。: 协程背后的编程风格采用了CPS,这是一种将控制流通过函数参数(continuation)传递的编程技术。在Kotlin协程中,,共同实现了非阻塞的异步编程体验,使得开发者可以写出简洁、易于理解和维护的异步代码。层面对suspend函数的特殊处理,结合底层的。总的来说,Kotlin协程通过。

2024-03-13 16:19:48 485

原创 Android invalidate() postInvalidate()

请注意,如果视图需要在其尺寸、位置或可见性改变时自动重绘自身,通常应当调用 `invalidate()` 而不是 `postInvalidate()`。具体来说,当你需要更新视图的显示状态,但又不希望立即阻塞UI线程时,使用 `postInvalidate()` 方法是非常合适的。例如,在动画或者数据模型发生变化后,视图可能需要重新绘制以反映新的状态,这时调用这个方法就会触发视图内容的重新布局和绘制。不过通常情况下,对于标准的属性动画,系统会在内部自动处理视图的重绘,不需要开发者手动调用。

2024-03-13 16:11:57 404

原创 EventBus 线程调度

当设置为 `threadMode = ThreadMode.BACKGROUND` 时,无论事件从哪个线程发布,EventBus 都会确保事件在后台线程中执行。如果事件本来就是在后台线程发布的,则直接在该线程中处理,否则,它会启动一个新的后台线程来处理事件。- 如果设置了 `threadMode = ThreadMode.MAIN`,那么无论事件在哪一个线程发布,订阅者的回调方法都会在 Android UI 主线程中执行。如果事件在后台线程中发布,则订阅者也在同一个后台线程中接收到事件。

2024-03-13 16:08:19 364

原创 Android View 绘制原理

对于动画效果,Android提供了视图动画机制,包括Tween动画和属性动画,这些动画可以在不改变视图的实际属性的情况下模拟视图的动态变化,并且在每次动画帧的过程中触发视图的重绘。- Android UI是由一系列嵌套的视图构成的层次结构,顶层通常是`DecorView`,它包裹着`ContentView`(即Activity的根视图)和其他窗口装饰元素。综上所述,Android视图的绘制是一个多阶段协同工作的过程,涉及到了系统的图形栈、硬件加速机制以及视图本身的方法回调等一系列技术和原理。

2024-03-13 15:59:18 711

原创 Android中View的事件分发机制

如果一个View没有消费事件(`onTouchEvent()`返回`false`),并且没有ViewGroup截获事件,那么事件会沿着ViewGroup的层次结构回传,逐级向上寻找下一个能够处理的View。- 如果`onInterceptTouchEvent()`返回`true`,那么该ViewGroup会截获事件,并在自身的`onTouchEvent()`方法中处理,而事件不会再传递给其子View。- 最终,事件到达最底层的View时,View的`onTouchEvent()`方法会被调用。

2024-03-13 15:50:53 370

原创 ANR 分析方法和步骤

Android系统会在设备的 `/data/anr/` 目录下生成一个名为 `traces.txt` 的文件,其中包含了详细的线程堆栈信息和CPU状态。- 打开 `traces.txt` 文件,查找与ANR发生时刻对应的日志条目,分析其中的线程堆栈,可以找到哪个线程处于阻塞状态以及阻塞的原因。- 结合 `traces.txt` 中提供的线索,回顾与ANR相关的代码段,查找是否存在长时间运行的操作、阻塞操作或不当的同步控制。### **步骤5:使用第三方工具**### **步骤7:检查线程状态**

2024-03-13 15:48:07 474

原创 Android ANR

如果在一个设定的时间阈值内(默认情况下,对于交互事件大约是5秒,对于BroadcastReceiver大约是10秒),AMS发现该应用的主线程仍未完成处理并回到可接受事件的状态,AMS就会判断该应用没有响应(ANR:Application Not Responding)。在这种情况下,AMS会采取行动,显示一个“应用无响应”的对话框,通知用户该应用可能出现了问题,并给予用户选择等待或强制关闭该应用的机会。此外,优化应用性能,减少不必要的资源消耗,也是防止ANR的重要措施。

2024-03-13 15:29:08 325

原创 android <permission> 和 <uses-permission>

示例:如果你的应用需要访问用户的联系人、发送短信、获取网络状态等,那么在 Manifest 中使用 `` 标签来声明对这些预定义系统权限的需求,比如 `READ_CONTACTS`、`SEND_SMS` 或 `ACCESS_NETWORK_STATE` 等。- `` 则是你的应用向系统表明它**需要何种权限才能正常运行**,这些权限通常是系统已经定义好的标准权限或其他应用定义的自定义权限。

2024-03-13 15:17:15 459

原创 CAS 无锁机制

例如,在`ConcurrentHashMap`中,当需要更新一个桶内的元素时,会使用CAS操作尝试更新节点的值或者移动节点,如果在这个过程中有其他线程修改了节点,那么CAS操作就会失败并重新尝试,而不是阻塞等待锁释放,这样就大大提高了并发场景下的性能表现。3. **设置**(Set):只有在比较成功后才会将新值写入到内存中,这一过程是原子性的,不会被其他线程中断。1. **比较**(Compare):先获取内存中某个变量的当前值(V)与预期原值(A)进行比较。

2024-03-13 15:07:40 418

原创 Android https使用CA证书

这样,你创建的OkHttpClient将只会信任你提供的服务器证书。不过,请注意,这种方法只适用于自签名证书或特定场景,生产环境中应尽量使用受信任的CA颁发的证书,以便让用户设备默认信任。首先,你需要获取服务器的证书文件。使用自定义的`TrustManager`创建`SSLContext`,然后将其设置到OkHttp的`SSLSocketFactory`。创建一个自定义的`X509TrustManager`,使其只信任你提供的服务器证书。// 返回信任的证书列表,此处只信任我们的服务器证书。

2024-03-13 14:55:58 603

原创 Android项目 接入https

对于Android原生HTTP/HTTPS请求,您可以使用`HttpURLConnection`或者更现代且推荐的`OkHttp`库,因为它提供了更好的性能和易用性。如果服务器使用的是自签名证书或来自不受信CA的证书,则需要在应用程序中手动导入服务器证书或信任该证书链。- 在正式环境下,应确保应用只信任合法颁发且受信任的CA签发的服务器证书,而不是使用上述的“信任所有证书”策略。// 安全警告:在生产环境中不要盲目信任所有证书,这会导致安全漏洞!// 或者,加载指定的服务器证书并仅信任该证书。

2024-03-13 14:49:52 565

原创 SQL注入、参数化查询

在执行SQL语句时,不是直接将用户输入或变量拼接到SQL字符串中,而是将变量值作为参数传递给查询,数据库引擎会自动处理参数值的转义和类型转换,确保查询语句的安全执行。- **使用ORM框架**:很多现代编程框架内置了防止SQL注入的功能,通过对象关系映射(ORM)的方式操作数据库可以减少直接拼接SQL的风险。4. **执行操作系统命令**:在某些情况下,通过SQL注入还可以执行数据库管理系统支持的操作系统命令。- **参数化查询**:使用预编译语句或参数化查询,确保用户输入不会影响SQL语句的结构。

2024-03-13 14:41:41 487

原创 APK 安全性

为APK文件签名,确保其完整性,防止恶意篡改。总之,保障APK安全是一个全方位的过程,涵盖了开发、测试、部署以及运维各个阶段,需要开发者在各个环节严格把控,确保应用在安全可控的环境下运行。- 在Manifest文件中合理设置权限,避免过度请求不必要的权限,同时对涉及隐私和个人数据的操作加强权限校验。- 对敏感的资源文件(如数据库、配置文件等)进行加密存储,确保即使APK被解压,也无法直接读取明文数据。- 集成安全框架,如梆梆安全、360加固保等,可以对APK进行加固,增强应用对抗逆向工程和篡改的能力。

2024-03-13 14:31:05 422

原创 多手势识别

对于复杂的多手势识别,可能需要结合深度学习和计算机视觉技术,这类高级手势识别通常不在Android SDK的基础功能之内,需要开发者自行设计和实现模型。- 使用MotionEvent封装的触控事件,根据两点或多点之间的相对位置变化和时间间隔来识别特定的手势,例如通过计算两点间距离和夹角变化来实现缩放和旋转手势识别。- 使用如GestureCompat库、TouchImageView等实现更复杂的手势识别功能,或者自定义实现多点触控的手势检测算法。- 用于识别缩放手势,通常用于图片或地图等元素的放大缩小。

2024-03-13 14:29:22 318

原创 android 打开系统组件

android 打开系统组件

2023-12-02 10:25:48 402 1

原创 android binder原理

Binder通信:在用户空间中,每个进程都有一个Binder驱动实例,称为Binder进程。当一个进程需要与另一个进程通信时,它可以通过Binder进程与Binder驱动进行通信。Binder代理:在客户端进程中,通过继承Binder类创建一个代理类,该代理类会持有一个对应的服务端Binder对象的引用。Binder对象:在进程中,通过继承Binder类可以创建Binder对象。Binder服务:进程中的Binder对象可以注册为Binder服务,其他进程可以通过Binder驱动查询和访问这些服务。

2023-09-25 18:50:16 45 1

原创 Android Activity为全屏

Android Activity为全屏

2023-08-21 10:02:12 1017 1

原创 android app 打开自己的设置页面

android app 打开自己的设置页面

2023-08-21 09:03:18 205 1

空空如也

空空如也

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

TA关注的人

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