
Android
文章平均质量分 90
Seas.Su
这个作者很懒,什么都没留下…
展开
-
Binder的基本原理
多进程有哪些优点?多进程一般在webView、图片加载、推送、闹钟之类的比较常见,还有比如在使用getSystemService获取系统服务的时候,虽然在自己写的代码中没有发现多进程,其实在内部实现中也是多进程。它们为什么需要被做成多进程的呢?1、解决手机内存问题虽然现在手机的运行内存是很大的,但是手机的APP是运行在独立的虚拟机中的,虚拟机会为每一个进程分配运行内存是有限的,一般只有32M、48M、64M,所以经常会发生一些内存不足的问题,就像加载一个大的图片,可能就直接OOM。2、其原创 2020-06-04 23:34:27 · 624 阅读 · 0 评论 -
Handler中Looper死循环为什么不会导致应用卡死?
ANR所产生的原因?1、5秒钟之内没有响应输入的事件,比如按键、屏幕触摸等。2、广播接收器在10秒内没有执行完毕。原创 2020-05-27 23:50:44 · 2463 阅读 · 0 评论 -
Handler往MessageQueue中添加数据,消息队列是怎样变化的?如何保证线程安全的?
多个Handler往MessageQueue中添加数据,其内部是如何保证线程安全的?Handler是一个线程间通信的机制,很多消息都会从子线程发送至主线程,而主线程只有一个Looper,发送的消息都被放置在MessageQueue这个队列中来,如何保证队列的混乱(如何保证线程安全)?看入队列的方法enqueueMessage: boolean enqueueMessage(Message msg, long when) { if (msg.target == null原创 2020-05-25 23:09:58 · 1626 阅读 · 1 评论 -
子线程中:new Handler需要做哪些准备?消息队列中无消息的时候,Looper的处理方案是什么?
为什么主线程可以new Handler?在ActivityThread.java里有一个main()函数,它是Android每一个应用最早执行的函数。 public static void main(String[] args) { ..... Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(fa原创 2020-05-19 00:00:59 · 2388 阅读 · 0 评论 -
Handler内存泄漏的原因是什么?为什么其他内部类没有这个问题?
Handler为什么会内存泄漏?内部类持有了外部类的引用。 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { MainActivity.this.click(); //click(); } }; public void click(){ ...原创 2020-05-12 23:18:32 · 859 阅读 · 0 评论 -
一个线程中有几个Handler?几个Looper?怎么保证?
一个线程中有几个Handler?N个。因为Handler可以在Activity可以new,在Service里面也可以new,而Activity全部都跑在了主线程里面,这就证明了主线程中可以有多个Handler。一个线程中有几个Looper?1个。我们来到Looper初始化的地方Looper.prepare()。 /** Initialize the curr...原创 2020-05-10 23:46:44 · 2972 阅读 · 0 评论 -
Handler源码流程梳理
Handler的工作流程需要搞明白Handler的流程,就是从sendMessage一直到handleMessage的过程。Handler.sendMessage()首先来看sendMessage,从图中就可以看出来,它就是把货物放到了这个传送带上来。在Handler.java这个类里面,有很多函数用来发送消息。其中send开头的就有这些:然后还有post开...原创 2020-05-07 22:38:01 · 222 阅读 · 0 评论 -
Android 服务概要
在Android Framework或应用开发主要API都是以系统服务的形式存在的。像读感应器的值、获取终端的位置,都是在Framework中以服务的形式存在的。Android服务的种类Android 应用程序服务Android应用程序服务都是Android的一种应用程序组件。开发者可以通过以下两种方法来使用这些服务:1. 服务的启动和终止;2. 通过服务绑...原创 2020-03-15 12:37:27 · 261 阅读 · 0 评论 -
okhttp框架 同步请求流程和源码分析
创建Client的外部调用OKHttpClient client = new OkHttpClient.Builder().readTimeOut(5,TimeUnit.SECONDS).build();先来看下OkHttpClient的内部类Builder的构造方法: public Builder() { dispatcher = new Dispatcher(...原创 2020-02-23 18:39:59 · 323 阅读 · 0 评论 -
okhttp 同步/异步 请求方法
okhttp同步请求请求步骤1. 创建一个OkHttpClient类。代表着OKHttp请求的一个客户端类,在整个okhttp库中,这个OkHttpClient类是处于一个很核心的地位。很多功能需要通过这个客户端类进行转发,或者直接由这个客户端类进行实现。它的创建方式有两种:一、通过默认的,也就是直接通过new一个对象来实例OkHttpClient。二、考虑到现实网络情况下...原创 2020-02-11 21:36:51 · 11156 阅读 · 1 评论 -
Android.mk 文件 之 入门语法介绍
一、Android.mk介绍Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练掌握Android.mk的语法规范。它的基本格式如下:LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) ...原创 2019-12-23 23:29:16 · 296 阅读 · 0 评论 -
序列化 : Serializable 与 Parcelable ( 下 )
在看Parcelable之前需要先了解一下Parcel。ParcelParcel提供了一套机制,就是可以将序列化之后的数据写入到一块共享内存中,然后别的进程可以通过Parcel从这块共享内存中读出字节流,并反序列化成一个对象。Parcel在内存中的结构是一块连续的内存,会根据需要自动扩展大小。从上图就可以看出来,这个Parcel就是一个消息容器,消息就是数据和对象引用,这些对象...原创 2019-12-16 23:28:18 · 229 阅读 · 0 评论 -
序列化 : Serializable 与 Parcelable ( 上 )
序列化想要在intent上传输对象的时候,直接传输是做不到的,需要对这个对象处理一下,而这个处理的过程,就叫做序列化。关于序列化的定义,百度百科这样定义:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。比如说内存中有一组的对象集合,我们想要把这里的数据持久的保存下来。而序列化,就是将对象保存成一连串字节描述的过程;相反,反序列化,就...原创 2019-12-03 00:06:39 · 141 阅读 · 0 评论 -
Android.mk 之 常用变量
一个Android.mk文件可以编译多个模块,每个模块属下列类型之一:APK程序-- 一般的Android程序,编译打包生成apk文件 JAVA库-- java类库,编译打包生成jar文件 C\C++应用程序--可执行的C\C++应用程序 C\C++静态库-- 编译生成C\C++静态库,并打包成.a文件 C\C++共享库-- 编译生成共享库(动态链接库),并打包成.so文,有且只有...原创 2019-11-24 22:18:10 · 677 阅读 · 0 评论 -
Android.mk 之 编译生成
如何使用Android.mk编译生成apk?LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)//all-subdir-java-files 把底层所有java文件取到LOCAL_SRC_FILES := $(call all-subdir-java-files)//使用这个做编译可以生成一个 LocalPackage.apkLOCA...原创 2019-11-20 00:54:08 · 642 阅读 · 0 评论 -
Android.mk 之 引入库
如何在代码中引入系统库?假如目前有这样一份文件:#include<stdio.h>#define LOG_TAG "Main"#include <utils/Log.h>int main(void){ ALOGE("test"); return 0;}在这份文件中,除了引用了<stdio.h>,还使用了<utils.L...原创 2019-11-18 00:22:29 · 1279 阅读 · 0 评论 -
Android.mk 之 静态库和动态库
如何将工程下的所有源码文件添加到变量中?关于这个问题可以有两种解决思路:1. 可以手动将每个文件添加到Android.mk中。LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := testLOCAL_SRC_FILES := test.c \ test1.cLOC...原创 2019-11-07 23:18:54 · 454 阅读 · 0 评论 -
分析第一个Android.mk
概述Android.mk这个文件可以放在Android的某一个目录下,就可以使用mm或者其他一些命令来对它进行编译。Android.mk的作用对于 C/C++ 来说,可以编译二进制的可执行文件、静态库、动态库;对于 Java 来说,可以编译生成Jar包、APK。分析第一个Android.mkLOCAL_PATH := $(call my-dir) //环...原创 2019-10-24 17:34:52 · 1172 阅读 · 0 评论 -
Java 线程 初识
说完这个线程,java部分就要结束了,就开始真正的Android路程就开始了,下一篇文章是Android的四大组件讲解。1. 在学习线程之前需要知道的几个概念多线程:一个进程运行时产生了多个线程,目的是为了节约CPU资源。并发:是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。并行:同时发生两个并发事件。线程安全:在并发的情况下,该代码经过多线程使用,...原创 2018-12-17 16:34:39 · 320 阅读 · 0 评论 -
Android 四大组件Activity
1. Activity状态转换2. Activity生命周期3. Activity栈4. 启动另一个ActivityIntent intent =new Intent(FirstActivity.this,OtherActivity.class); startActivity(intent);5. Activity之间通信bun...原创 2018-12-24 20:47:28 · 189 阅读 · 0 评论 -
Android 四大组件 Service
1. 适用范围Service主要使用在后台比较耗时和运行时间较长的逻辑。但是在service中使用 Thread.currentThread().getId() 获取得到的却是1,也就是主线程。如果想要在服务里执行耗时的逻辑,也需要创建一个子线程,否则也会阻塞线程。2. 生命周期左图是startService()所创建;右图是bindService()所创建。...原创 2019-01-21 14:51:02 · 188 阅读 · 0 评论 -
Android 四大组件 BroadcastReceiver
1. Broadcast简介Broadcast用到的场景是非常多的,比如说实现在同一个App内的通信;或者不同App之间的通信;还有在特定情况下的通信(开机需要给更新App的提示等)。Broadcast的角色主要有一个广播发送者,和需要接受到消息的广播接收者。广播发送者先将广播发送出去,然后由广播接收者进行接收,收到广播后,就可以在广播接收器中做一些操作了。值得注意的是广播接收器...原创 2019-02-15 12:03:18 · 293 阅读 · 0 评论 -
Java 回调机制 初识
之前我对回调机制很不理解,回调机制是什么?它有什么用?怎样使用回调机制?看了这篇文章,肯定会明白的。1. 回调机制是什么?它有什么用?回调机制大体意思就是:借助一个接口,A发送一条消息给B,就去做别的事情了;然后B忙完手上的活,给A回复了一条消息。2. 回调机制的具体实现流程首先,要先定义一个接口。public interface CallBackInterfac...原创 2018-12-14 15:01:05 · 227 阅读 · 0 评论 -
记录 VMware + Ubuntu14.4 + repo 的开发环境搭建
我下载的iso有980多M,我家网速有点慢,就先下载iso等待的时间搞点别的。1.下载Ubuntu 14.04打开下载地址:http://old-releases.ubuntu.com/releases/14.04.5/我下载64位的,选这个。竟然还有Mac版,好奢侈。2. 安装VMware从百度上一搜这个,很多下载的,下载完成后,一路确定。...原创 2019-07-10 00:10:01 · 948 阅读 · 0 评论 -
Android Framework 仿 WindowManager 添加系统服务
引言该demo为基于Android P(9.0)。根据原生WindowManager的调用方式,用AIDL跨进程通讯的方式实现。1. IWindowManager.aidl位置:/frameworks/base/core/java/android/os/IWindowManager.aidlpackage android.os;interface IWindowMa...原创 2019-06-16 00:36:37 · 475 阅读 · 0 评论 -
Android TV 平台 新添按键 与 GlobalKey
新添按键关于Android TV,Android平台按键的配置大致可分为以下几步(以Settings为例):1. 检查驱动在添加按键之前,要先检查一下驱动层是否配置成功。可以抓一份遥控器按下Settings按键的打印,查看有没有code产生;或者直接去问驱动的同事添没添就好了。:)2.Vendor_XXX_Product_XXX.kl这个文件名对于不同的代...原创 2019-02-25 23:34:24 · 1275 阅读 · 0 评论 -
Android Framework 之 SystemUI的启动流程
前面先说一下本文以Android O(8.0)代码为例。主要介绍从SystemService.java到启动SystemUI的过程,至于SystemUI的其他方面放至其他地方说啦。本文所涉及的类/frameworks/base/services/java/com/android/server/SystemServer.java/frameworks/base/packages...原创 2019-09-01 20:49:15 · 1773 阅读 · 1 评论 -
Android Framework 编译环境 分析
Android编译过程1. 初始化参数设置2. 检查环境变量和目标环境3. 选择lunch并读取目标配置和平台信息4. 清空输出目录5. 编译6.生成升级包1. .build/envsetup.sh 分析1. 加载编译命令在 .build/envsetup.sh 这个文件中,是将下面这些命令加载到终端上,也就是说,在还未执行 source .build/e...原创 2019-09-16 22:14:56 · 321 阅读 · 0 评论 -
Java 各类集合的对比
1.集合就是一个放数据的容器,准确的说是放数据对象引用的容器。2.常用集合:Collection:是一个接口。1List:元素有序、可重复、并引入位置下标。 1.1LinkedList:底层是双向循环链表。增删快、查询慢、线程不安全、效率高。 1.2ArrayList:底层数据结构是数组。查询快、增删慢、线程不安全、效率高。 1.3Vecto...原创 2018-12-13 21:30:27 · 498 阅读 · 0 评论