自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 问答 (1)
  • 收藏
  • 关注

原创 Looper机制详解

前言此前有过一篇关于JAVA层Looper的介绍和MessageQueue的介绍网络上也有一篇很详细的介绍用一张图来说明looper运作的机制looper顾名思义是轮询,轮询的目的是为了查找消息队列(MessageQueue)中的消息并且处理消息(Message)。MessageQueue和Looper是一一对应的关系,一个prepare后的线程中只有一个Looper对象和以及MessageQueue,且线程独有。消息可以是来自Looper所在线程,也可以是来自其他子线程,贴一段代码解释一下

2022-02-23 21:11:44 4819

原创 UE中Activity优雅退出

背景UE Android lib集成过程,使用普通Activity+SurfaceView的方式加载UElib,在退出游戏Activity时,出现nativeOnInputQueueDestroyed引擎的崩溃原因InputQueue处理流程onDestroy()onInputQueueDestroy()这两个里面都可以在native层处理inputQueue,主要是 AInputQueue_detachLooper取消looper绑定然后是在native的ondestroy中设置andr

2022-02-17 21:12:27 3736

原创 UE4启动GameActivity

UE Android项目工程中的GameActivity基于NativeActivity,相关知识请参考之前的一篇文章,NativeActivity介绍在之前NativeActivity介绍中,我们知道胶水层app_native_app_glue会创建一个子线程并prepare()开启loop循环。UE中这个线程又叫做GameThread,用于处理游戏逻辑业务。初次之外,通过android_main()入口,在UE4引擎代码LaunchAndroid中会创建一个AndroidProcessEvents,用

2022-02-10 17:17:19 4717

原创 Android ABI与应用打包

基础认识1.armeabi-v7a: 第7代及以上的 ARM 处理器,很多手机还在使用。2.arm64-v8a: 第8代、64位ARM处理器,目前主流手机CPU架构。3.armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。4.x86: 平板、模拟器用得比较多。5.x86_64: 64位的平板。目前手机基本使用的都是ARM架构,X86架构平板在使用。armeabi架构是早期使用,现在基本只用考虑v7和arm64-v8a两种。google官方文档对Android ABI架构的说明

2022-02-10 11:38:58 5537

原创 【NativeActivity介绍】

官方文档API介绍:https://developer.android.com/reference/android/app/NativeActivity官方Demo:https://github.com/android/ndk-samples/tree/master/native-activityNativeActivity是基于Activity的页面,有Activity的全部功能。除此之外,NativeActivity通过loadNativeCode方法实现了一套自有looper事件处理逻辑。mN

2022-01-28 17:01:40 3719

原创 Android笔记(18)应用层Crash处理逻辑

Android发生Crash时,说明代码执行出现异常,此时的运行时环境(RunTime)将会首先感知到问题。如果此时代码设置了try-catch,将这个运行时异常RunTimeException(更加具体的可能是NPE or 数组越界等)捕获后,将不会触发运行时环境(Runtime)触发crash机制。如果一旦没有处理,将会出现Crash!!!下面我们来探讨下应用层最终崩溃的机制RuntimeI...

2020-03-01 23:54:30 292

原创 Android笔记(十七)Android多线程问题

参考 https://mp.weixin.qq.com/s/gBZcogHizremZoJRvd8fHQ线程的几个方法run()。非静态start()。非静态join()。非静态。如果线程 A 调用了线程 B 的 join() 方法,那线程 A 会进入等待状态,直到线程 B 运行结束。currentThread()。静态yield()。静态。降低当前线程优先级,调用该方法就像是是对线...

2020-02-23 20:35:45 192

原创 JAVA基础(七) ArrayList与LinkList

ArrayMap是java中重要的数据结构,底层是基于动态数组的结构实现。包括下面几个关键特征:初始化容器大小为10没有扩容因子这一说法,或者说扩容因子大小为1。当新增加后的数据量超过容器本身时,容器将按照 oldsize + oldsize>1 的方式扩容1.5倍当一次添后的数据大于1.5倍时,使用新的容器大小动态数组查找O(1),插入O(n)...

2020-02-23 17:00:43 121

原创 比较Activity和Dialog的窗口添加流程

之前在我的这篇blog中写到了Activity启动时activity / window /view之间的关系。大概的流程是,先创建activity,然后attach中执行window创建,接着setContentView中创建DecorView并且将DecorView和window进行绑定,接着在resume过程中通过将decorView添加到windowManager中WindowManager...

2019-12-29 23:42:48 573

翻译 Android Developer官网ANR分析

当主线程被阻塞太长时间时,会触发ANR(Application Not Response)。如果App正在前台运行,系统将向用户展示ANR弹框如下。ANR弹框让用户可以强制退出应用。ANR是指:因为应用主线程,也就是负责更新界面的线程,不能处理用户输入事件或者绘制,给用户造成困扰。ANR可能会在如下情况下出现:当activity处于前台时,应用在5s内不能完成输入或者广播事件当activ...

2019-12-27 23:32:44 225

原创 Android笔记(十六)Activity启动

Activity启动分为两种情况Activity所在进程不存在,冷启动Activity所在进程存在于后台针对于这两种情况,我们都可以对此用一套流程来描述,针对冷启动情况,其中会添加一部分创建ActivityThread的流程 还是先上图,图片出处GitYuan 假设在图片流程之前,我们做的是点击桌面按钮操作,那么会去执行activity的startActivity操作,该方法里...

2018-04-15 11:14:30 610

原创 Android笔记(十五)ContentProvider源码浅析

ContentProvider作为四大组件之一,由于业务上用到的地方不多,目前业务是系统界面,属于系统应用,最适合使用ContentProvider来进行少量数据存储,我们业务中涉及到的Settings.system和Settings.Secure等数据库,就是通过ContentProvider来封装、用ContentResolver来访问的//通过ContentResolver来访问Sett...

2018-04-15 00:39:07 321

原创 基本算法

冒泡排序:private String bubbleSort(int[] a){ if(a == null || a.length < 1) return null; int length = a.length; for(int i = length-1;i>=1;i--){ for...

2018-04-04 08:47:24 158

转载 JAVA基础(六)内存泄漏

内存泄漏:应用/JVM使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述。android中常见的常见有下面几种Activity对象未被回收容器造成1.Activity对象未被回收1.1静态变量引用Activity对象通过静态变量引用 activity对象时,会导致Activity对象所占有的内存不被回收,造成内存泄漏。因为静态变量存在与JVM的方法...

2018-03-24 11:44:54 157

原创 JAVA基础(五)单例模式

网上盛传单例模式有7种,大致分为懒汉式和饿汉式。其他都是他俩的变种。这里重点分析下二次枷锁的懒汉式单例模式public class Singleton { private volatile static Singleton mInstance;//注意点1 private Singleton(){}//注意点2 public static Singleton get...

2018-03-24 09:17:08 168

原创 JAVA基础(四)JVM基础

JVM知识内容很多。这里只描述JVM内存模型以及GC基本原理 参考文章: JVM内存和垃圾回收 JVM内存模型 JVM内存模型JVM所管理的内存也叫运行时数据区,分为下面几个子区域方法区(线程共享),即我们常说的永久代(Permanent Generation), 用于存储被JVM加载的类信息、常量、静态变量堆区(线程共享),几乎所有对象实例和数组都要在堆上分配,常分为...

2018-03-20 23:39:03 179

原创 Android笔记(十四) JAVA线程池

线程池的由来:由于业务需求,我们需要多个线程同时执行(也叫并发执行),我们会去创建多个线程来执行任务。如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。因此线程池就诞生了,线程池中的线程会在任务执行完毕后不会被立即销毁,而是被重复利用,避免创建新的线程。在java中,有专门一个类用来创建线程池并使用线...

2018-03-20 22:14:53 151

原创 Android笔记(十三)AsyncTask源码分析

AsyncTask,异步任务,参照源码中的一段注解:/** * <p>AsyncTask enables proper and easy use of the UI thread. This class allows you * to perform background operations and publish results on the UI thread wit...

2018-03-13 00:45:57 230

原创 Android笔记(十二)Volley开源库

Volley是著名的用于网络请求和图片存储显示的第三方开源库。 图片来自 简单的使用方法看这里 小结一下大概是:用Volley.java实例化一个RequestQueue再new一个请求,XXXRequest(有StringRequest,ImageRequest,JSonRequest等)将这个request添加到requestQueue中,获取数据用代码表示如下...

2018-03-11 11:22:23 167

原创 Android基础(十一)HTTP网络连接

应用层协议HTTPAndroid一般使用Http协议进行网络连接,来发送和接收数据。Http协议格式一般分为请求格式和应答格式:请求格式:请求行|请求头部|空白行|请求体响应格式:响应行|响应头部|空白行|响应数据在请求格式中,通常的请求行中的Method方法包括POST GET HEAD(作用类似与于GET方法) OPTION DELETE PUT等 ,除此之外还包括URL,...

2018-03-10 22:54:18 1126

原创 JAVA基础(三)String类源码分析

我们知道String类是不可变、不可继承的类,那么String是如何通过代码保证不可变性?此外,在操作对String 进行添加时,StringBuffer和StringBuilder为何比‘+’更受推荐?1 保证String不可变性/*The {@code String} class represents character strings. All * string liter...

2018-01-08 19:54:32 378

原创 JAVA基础(二)LinkedHashMap和ArrayMap

LinkedHashMap数据结构

2017-12-21 01:01:18 466

原创 JAVA基础(一)HashMap

HashMap集合类是JAVA中常用的数据结构,与此相关的集合还有LinkHashMap和TreeMap,这里主要介绍HashMap HashMap是一种基于线性存储结构(也就是数组)的数据结构,数据以Entry(K,V)的形式保存在数组table中。Entry本身是一个链表结构,如下所示Entry{ final K key;//键 V value;//值 Ent...

2017-12-20 22:08:50 180

原创 Android笔记(十)Android O SystemUI启动流程

我们知道systemui属于系统级应用,在开机过程中就会启动。具体来讲是在SystemServer进程中startOtherService()方法来启动的。startOtherService(){...startSystemUi(context,windowManagerf);...}startSystemUi()方法中就是做了启动SystemUIService服务的操作static fin

2017-10-28 11:41:10 2344

转载 Android笔记九(ServiceManager浅析)

该怎么获取和系统service对应的代理接口呢?Android是这样设计的:先启动一个特殊的系统服务,叫作Service Manager Service(简称SMS),它的基本任务就是管理其他系统服务。其他系统服务在系统启动之时,就会向SMS注册自己,于是SMS先记录下与那个service对应的名字和句柄值。有了句柄值就可以用来创建合法的BpBinder了。这段话出自这里 用图表示大概如下:

2017-10-12 17:01:10 2633

转载 Android笔记(八)Context

本篇文章是看gitYuan博客Context理解一文作出的笔记先来张类图,有个大概的框架概念 我们常用的Application、Activity、Service都间接继承自ContextWrapper类,该类继承自Context抽象类,ContextImpl也继承自Context抽象类。ContextWrapper类对Context进行了包装,包装的方式为:将Context作为自己的一个属性。

2017-06-28 21:21:16 204

原创 Android笔记(七)SystemUI通知栏框架

一张图读懂SystemUI通知事件处理流程:

2017-06-15 22:21:40 2449

转载 Android笔记(六)ANR

转一篇非常棒的文章戳这里顺便写下点分析ANR的笔记step1 Trace文件中cmd line 看group=”main” 中的blocked-wait,有些trace文件中可以直接找到ANR堆栈信息。step2 分析找不到问题所在就看event log 中的am_anr字段,找到原因所在。如果是inputevent事件没有响应就看5s前做了什么操作,类似地如果是BroadcastTimeOut

2017-06-14 15:34:28 269

原创 Android笔记五(Binder例子)

写之前,我们要明确一点:服务端存在Binder实体BBinder,客户端只有对应的Binder代理BpBinder。在java层中,Binder实体被Stub继承,而Binder代理为Stub.Proxy。举个栗子: 假设要执行这样的场景:应用A作为客户端,要调用服务端B中的f方法。下面进行具体分析 对于服务端B,我们需要有Binder实体这样才能进行IPC通信,AIDL文件可以帮我们生成一个接

2017-06-03 19:01:32 979

原创 Android笔记(100)通知流程

通知流程,从框架到应用我们都知道,Android应用想要发送通知,都需要先用Notification.Builder来构建一个通知,然后NotificationManager.notify()来将这个通知发送出来。发送出来的通知Notification将通过Binder通信,在框架中被处理后,封装成StatusBarNotification,传递到systemUI系统应用中,在通知栏中呈现出Expa

2017-05-25 21:53:09 1159

原创 Android笔记(四)DecorView & ViewRootImpl & Window

这三者之间的关系网络上有很多篇不错的blog。比如这篇。为了让自己更加熟悉View绘制的流程,在这里特意将这三者的关系好好梳理一番。 为了理清这三者的关系,还是先上一张图 ViewRootImpl是ViewRoot的实现类,ViewRoot不是view,而是整个ViewTree的管理者。DecorView是整个ViewTree的根布局视图ViewRoot通过在Activity.att...

2017-05-20 19:26:13 1167 2

原创 Android笔记三(Handler)

关于Android消息机制中的另外一个类Handler,我在之前的两篇文章中有做讲解 handler message looper机制 handler message looper机制(二) 这里再做下总结: Handler处理消息的过程:首先,检查Message的callBack是否为空,不为空就让HanderCallback来处理消息,这个callback是一个Runnable对象,也

2017-05-18 21:02:56 205

原创 Android笔记二(MessageQueue && Message)

MessageQueue对于这个类,开始时,我们需要注意到google源码对其的注释说明: 消息是通过Handler以及Looper添加到Messagequeue消息队列中去的。我们可以通过new Looper()构造方法在当前线程中创建一个消息队列。也就是说创建Looper的时候就会创建相应的消息队列。既然消息队列最重要的作用就是对消息的处理,下面重点了解下两个方法enqueueMessa

2017-05-13 23:29:45 506

原创 Android笔记(一 Looper)

Looper类分析Looper、Thread、Handler以及MessageQueue是Android通信中消息机制中几个关键点,我们常常会用下面的图来表示他们之间的关系,以及构成的整个Android消息机制 在上图中,Handler发送Message到MessageQueue中,通过Looper循环取出消息,完成整个消息传输。 本章主要介绍Looper类。我们知道在主线程中,不需要我们创建L

2017-05-11 21:27:51 331

原创 handler message looper机制(二)

handler message looper机制(二)在handler message looper一文中,我们已经大概了解了这三者之间的关系。本篇文章在此基础上详细介绍Looper循环的流程以及post()和sendMessage()之间的区别。目录handler message looper机制二目录Looper循环之loop方法post以及sendMessage系列方法的区别Loope

2017-04-21 19:59:23 260

原创 深入理解Android内核——Android启动分析

系统启动进程android设备的启动分为三个阶段:Boot Loader, Linux Kernel,Android 系统服务。Android系统实际上是运行在Linux Kernel之上的一系列系统服务进程。init进程是Android中被启动的第一个进程,PID = 0 。它通过解析init.rc脚本来构建出android运行初始化形态(android系统服务程序大多是在这个脚本中被启动) 系

2016-06-14 22:03:05 7463 1

原创 MVP模式探讨

先从字面意义上来了解MVP M——Model 模型 V——View 视图 P——Presenter 呈献者 *这里的View不是Android 组件,而是MVP模式的一部分从Android控件方面来说,View部分都是一些Fragment以及View,其中不包括数据、逻辑,只做单纯的显示,这样大大地简化了View的代码量,而且与Model完全解耦。**The

2016-06-14 19:24:23 296

转载 Android之图片缓存

为了避免出现OOM,在对图片进行相关处理时,常常采用图片缓存技术。图片缓存机制常用的有两种:软引用内存缓存技术在对图片进行加载显示之前,由于本来的图片太大,太占用内存空间,所以需要先进行图片压缩。以下是压缩图片的示例代码:/*** 加载内存卡图片*/ BitmapFactory.Options options = new BitmapFactory.Options();

2016-04-06 15:24:35 270

转载 Android笔记五(LayoutInflater)

LayoutInflater。Layout 布局,inflater,充气,填充,这个类用于将XML文件转换成相对应的ViewGroup和控件Widget等View。官方的解释为Instantiates a layout XML file into its corresponding View objects. It is never used directly. Instead, use getL

2016-04-04 17:04:05 336

转载 Android基础之IO流

Java IO 按照不同类型来分,可以从以下几个方面来进行分类:输入/输出流字节流/字符流节点流/处理流对于前两个我们比较容易理解。那什么是节点流,什么是处理流呢。从斐青这篇文章中可以了解到:Java的IO使用装饰者模式将IO流分成了底层节点流和上层处理流。节点流直接和底层的物理存储节点关联,虽然不同的物理节点获取的节点流可能存在差异,但程序可以把不同的物理节点包装成统一的处理流,从而允许程序

2016-03-25 22:10:28 4478

空空如也

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

TA关注的人

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