Android Binder 数据边界:一次 Intent 过大崩溃的排查方法
Intent 和 Bundle 看起来只是进程内对象,启动 Activity 时却要经过 Binder 事务。本文从一个无明确业务堆栈的崩溃出发,解释 TransactionTooLarge、Parcel 尺寸、复现方法和架构修复。
RUOYE / TOPIC
这个主题下的文章。
Intent 和 Bundle 看起来只是进程内对象,启动 Activity 时却要经过 Binder 事务。本文从一个无明确业务堆栈的崩溃出发,解释 TransactionTooLarge、Parcel 尺寸、复现方法和架构修复。
近一段时间有做 iOS 的开发,经常会使用到 delegate,在使用的时候经常是对标 Android 中 listener 的功能,大致流程就是给宿主类设置一个 delegate,然后当宿主会要回传一些信息的时候,就调用 delegate 的方法。 举个例子: 这是一个自定义的进度条 View,它…
Android jni 使用说明(cmake) 项目中使用 jni 1. 添加 jni 文件 首先在 main 文件夹下新增一个 cpp 文件夹,然后在文件夹中创建一个 CMakeList.txt 文件,用于 ndk 相关的配置,基本如下 首先使用 add library 添加一个库,指定了库的名字…
activity 是 Android 系统四大应用组件之一,其它三个为 Service (服务) 、 BroadcastReceiver (广播)、 ContentProvider (内容提供器)。 1. android中一个app的入口是 activity ,一个app至少要有一个 activit…
Volley 是谷歌推出的一款轻便的网络请求库,全部不足 50 个文件,与 OkHttp 相比实在算不上臃肿。使用上也比较方便,你可以自由地定义自己的 Request 类,直接将返回数据转换成自己需要的格式,如果你需要使用 ImageView 展示网络图片的话那就更巧了,Volley 提供了一个 N…
ViewModel ,开发中的又一大利器,其名字也正好对应着 MVVM 中 ViewModel ,这并不是巧合。从功能上看,它负责为 Activity 和 Fragment 提供和管理数据,也就是为 View 层提供数据服务,它能够在屏幕方向切换的时候保存数据,也能够在多个 Fragment 组件中…
LiveData 是一个用于存储数据的类,但它并不是仅仅用于数据的存储,还用于传递,每一个 LiveData 都是一个观察者模式的实现。其存储功能即在其内部有一个 mData 变量,并提供了 getValue() 和 setValue() 等方法对这个数据进行操作,其传递功能,就在于这个类也是观察者…
基本功能 Lifecycler 是一个生命周期管理工具,说的具体点,是用于管理 Activity 和 Fragment 生命周期的工具,它可以探测到 Activity 和 Fragment 这些宿主生命周期的变化,并将这些变化通知给需要的类。其使用场景,就是在某些时候,一个类需要在 onCreate…
EventBus 是 Android 中一个用于在组件之间传递时间的解决方案,基于观察者模式的思想,与 Android 中的本地广播有类似的实现原理,不过相比之下更加自由,在这种方案下,通信的组件之间没有耦合。在一般的组件通信中,大致有两种方式,第一种是利用回调方法,在这种方法中,事件处理者始终需要…
在 Android 开发中有一个常识,那就是子线程中不能更新 UI ,所以,在使用子线程执行一个任务之后,总是还需要一个 Handler 切换到主线程,然后才能将结果展示在 View 中,否则就会抛出 CalledFromWrongThreadException 异常。 那么是否一定不能在子线程中更…
Activity 有四种启动模式,分别用于不同的使用场景: 1. standard 2. singleTop 3. singleTask 4. singleInstance 下面将介绍每种启动模式的特点、使用场景以及使用方式。 Standard 这是 Android 中默认的 Activity 启动…
广播是 Android 的四大组件之一,是观察者模式的一种实现,利用广播能够轻松的进行应用内不同组件的通信、应用之间的通信等,一个广播分为两个部分,广播发送者和广播接收者,一般来说充当发送者的是 Context ,在 Context 中有 sendBroadcast() 、 sendOrderedB…
在 Android 属性动画 中讲到,ValueAnimator 的工作需要使用到 Choreographer 类,这个类负责的不只是与动画相关的功能,准确来说,它负责协调动画、输入和绘制这三种事件的工作。在这个类内部保存了回调队列数组 mCallbackQueues ,每一个队列存放着一个类型的回…
前面讲到 Android View 加载流程,使用 LayoutInflater 将 xml 文件转变成 View ,但是还需要将 View 绘制出来,才能被用户看到,这一过程为绘制流程。由于 Android 的整个 View 是以树的形式出现的,所以很多关于 View 的机制,如加载、事件分发等,…
一般情况下, Activity 会绑定一个 xml 文件,作为 Activity 展示的页面,对应的方法为 setContentView(int) 或者是 setContentView(View) ,以前者为例,这个方法是如何将一个 xml 文件展示出来的?下面就追本溯源,寻其根本。 Activit…
OkHttp 是 Android 上的一个第三方网络请求库,提供了一系列关于网络请求的方法,现今一般的 APP 都会涉及到网络请求,而且一般是比较频繁的网络请求,所以会用一个网络请求库,以及了解其内部实现原理,是有必要的。 对于 OkHttp 网络请求库来说,发起一个网络请求需要用到类有这么几个: …
Service 是 Android 中的四大组件之一,相比于多运行在前台用户可见的 Activity ,Service 的存在用户往往察觉不到,如果说 Activity 主要是负责与用户进行交互的话,那 Service 则更多的用来处理任务,如一些后台文件的下载,或者是大量数据的处理等,用户提交给 …
SharedPreferences 是 Android 中一种轻量级的持久化存储方案,其本质是使用 XML 文件存储一系列的键值对,为了提高其使用效率,采用了异步写、内存缓存等方法。 关于调用 SharedPreferences 是一个接口,其实现类是 SharedPreferencesImpl ,…
Android 手机的内存是有限的,一般情况下用户打开了某个软件然后返回到主菜单的时候,应用所占的内存一般不会直接释放,而是先保留一段时间。随着用户打开的应用越来越多,内存总有见底的时候,这时就需要移除某些在系统看来不需要的进程,释放出足够的空间供用户打开新的应用。 先移除哪些进程是需要根据进程的优…
很长一段时间没有碰过 Android 开发了,最近重拾之前开发过的软件,先更新了一下版本,将 targetSdkVersion 更改为了 28 ,重新编译安装之后发现怎么也加载不出来东西,并且有报错,java.net.UnknownServiceException: CLEARTEXT commun…
对于计算机上的数据持久化而言,归根结底就是将数据保存在磁盘上,使得即使在断电的情况下数据仍然能够留存,不同的是使用不同存储方式时数据存储结构的不同,在 Android 开发中常用的数据持久存储方式大致有以下五个: 1. SharedPreferences 2. SQlite 3. ContentPr…
Handler 机制是 Android 独有的一套切换线程的方式,Java 中并没有类似的东西(毕竟 Android 是以消息驱动的,Java 不是),那么是否可以在 Java 中实现类似的一套机制,下面先对 Android 中 Hanlder 机制使用到的东西进行分析: Handler 机制分析 …
ANDROID 消息机制 Android 系统的运行采用消息机制,在主线程中所有的操作的执行都需要依靠 Hadnler 发送消息的方法来完成,因为在 ActivityThread 中创建了主线程的 Looper 并且调用了 Looper:loop() 方法,这个方法会堵塞当前线程(因为其内部有一个死…
Context Context 是一个抽象类,根据其翻译“上下文、环境”就可以了解到,Context 与应用的运行密不可分。下面是源码中对 Context 的介绍: Interface to global information about an application environment. T…
Android 动画 界面时用户与程序交互的媒介,一个好的界面会让用户更愿意使用这个程序,动画则能很大程度上提升用户的操作体验,使得界面的切换不那么突兀,给人一种水到渠成的感觉,所以在合适的时间、合适的地点使用动画非常必要,Android 提供了几种不同类型的实现动画的方式,视图动画、属性动画和帧动…
背景 自从 Android 7.0(M) 版本之后,Android 的资源文件访问方式出现了变化。在开发的过程中,有些时候我们需要使用 Uri 和 File 互相转化,比如调用系统的相册选取图片的时候, 就是通过传递文件的 Uri 传递选取的图片的,我们在得到这个 Uri 之后一般并不能直接使用,还…
IPC(Inter Process Communication): 进程间通信 是所有系统中不可忽略的一部分,在 Android 中,我们知道系统会为每个 APP 分配一个 DVM 实例,而每个 DVM 实例都处于一个单独的进程中,也就是说,一般情况下每个 APP 都处于一个单独的进程,而 APP …
Apk 编译 Android 软件开发,一般情况下是指将一个空白的项目,一点一点变得丰满,使得这份代码生成的 Android 应用能够完成越来越多的功能的过程,所以大部分人的工作就是,写代码,然后点击运行,就可以看到代码变现成了一个一个的功能,所以大部分的软件开发也就到写代码为止了。不过从一段代码变…
Android 官方提供的 Material Design 库让我们的 App 很轻松的就能实现一个比较炫酷的效果,如 CoordinatorLayout ,能够通过 Behavior 来协调它的各个子 View ,使得在 CoordiantorLayout 中的一个子 View 的状态发生变化的时…
在实际开发中有时会使用到使 ViewPager 不可滑动的要求,比如在 ViewPager 与它包含的某一页出现了滑动冲突,同时这个滑动冲突还不能依靠修改当前页中的某个控件来进行修复的,可以通过关闭 ViewPager 的手势滑动功能来消除滑动冲突。具体的代码如下:
概述 作为一名 android 开发工作者,想要在 android 开发的道路上走得更远,阅读源码肯定是一种必要。然而在日常写代码的时候我们使用的是 android SDK 提供的一系列的接口,使用 SDK 的过程中总会不可避免地遇到各种各样的问题,这时候阅读源码则能够帮助我们更好地解决遇到的问题,…
Android 页面显示层次 由此图可以看到 Activity 作为显示一个页面最基本的元素,它本身并不负责显示页面,而是通过 PhoneWindow 这个窗口映射到显示屏上一系列的 View 来显示内容,PhoneWindow 里面又包含一个 ViewGroup ,即 DecorView ,Dec…
android事件分发 责任链模式 有一公司A,一客户给公司的boss发派了一个任务,然后boss比较忙,旨在锻炼下属,就把任务抛给了下属,即二级boss,然后这个二级boss也与大boss有同样的想法,就再把这个任务抛给了下一级,一层一层,直到传递到最后一层了,一个刚入职的萌新,试用期还没过,一看…
获取照片方法 1. 打开相册方法 这里 Intent.ACTION GET CONTENT 表明了要打开的activity的类型, setType() 标示了要选取的文件类型。 2. 打开相机方法 这里 Intent.EXTRA OUTPUT 指定了拍照之后将照片存储的Uri路径,这里需要提供一个U…