Android
文章平均质量分 80
Android
Yawn__
“就像热爱漫无边际。”
展开
-
Android——定时器轮询
时间片轮询原创 2022-09-15 11:59:38 · 1560 阅读 · 1 评论 -
Android——protobuf的简单使用
android protobuf原创 2022-09-15 11:22:44 · 1342 阅读 · 1 评论 -
Android——应用进程和应用生命周期
1. 概述在大多数情况下,每个 Android 应用都在各自的 Linux 进程中运行。当需要运行应用的一些代码时,系统会为应用创建此进程,并使其保持运行,直到不再需要它且系统需要回收其内存以供其他应用使用。应用进程的生命周期并不由应用本身直接控制,而是由系统综合多种因素来确定的,比如系统所知道的正在运行的应用部分、这些内容对用户的重要程度,以及系统中可用的总内存量。这是 Android 非常独特的一个基本功能。一个不常见但很基础的Android特性是,一个应用进程的生命周期并不是由应用本身直接控制的原创 2021-12-24 15:37:18 · 1206 阅读 · 3 评论 -
Android——应用上下文Context
1. 简介Context是Android的一个总父类,启动四大组件,获取资源,获取类加载器等都是通过Context来完成,Activity,Service,Application也都是派生于Context。是应用程序环境的全局信息的接口。是一个抽象类,由Android系统提供。允许访问特定于应用程序的资源和类,以及调用应用程序级操作,如启动活动,广播和接收意图等。Context是维持Android程序各组件能够正常工作的一个核心功能类,而这个核心功能类相当于一个大的环境,只有在这个环境下,An原创 2021-12-21 17:20:57 · 855 阅读 · 0 评论 -
Android——SharedPreferences
1. 场景首先我们来看看,SharedPreferences在什么场景比较适用:SharedPreferences是一种轻量级的存储,数据会写在本地的一个xml文件中,以键值对的形式存在,如果程序卸载,此文件也跟着卸载以Map形式存放简单的配置参数可以保存的数据类型有:int、boolean、float、long、String、StringSet。保存位置:data/data/程序包名/share_prefs主要用途:1.保存应用的设置 例如:设置静音,下次进入还是静音2.判断是否是第原创 2021-12-09 16:44:17 · 6666 阅读 · 1 评论 -
Android——BroadcastReceiver里怎么执行耗时操作
一个进程如果正在执行BroadcastReceiver的 onReceive() 方法,就会被当做一个前台进程,不易被系统杀死。当 onReceive() 执行完毕,BroadcastReceiver 就不再活跃,其所在进程会被系统当做一个空进程,随时有可能被系统杀死。所以在 onReceive 方法中执行异步请求操作,很可能请求结果没有返回,BroadcastReceiver就被系统回收了。在BroadcastReceiver里执行耗时操作,一般有两种写法:(1)由当前BroadcastRece原创 2021-12-09 15:01:16 · 4163 阅读 · 0 评论 -
Android——BroadcastReceiver广播机制(自定义广播)
普通广播可见: Android——广播1. 概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间);2.同一app内部的不同组件之间的消息通信(单个进程);3.同一app具有多个进程的不同组件之间的消息通信;4.不同app之间的组件之间消息通信;5.Android系统在特定情况下与Ap原创 2021-12-06 18:46:56 · 5324 阅读 · 0 评论 -
Android——ClipBoard(复制和粘贴)
1. ClipBoard 简介ClipBoard框架,会将数据放入一个剪贴对象中,然后将该剪贴对象放到系统级剪贴板中。剪贴对象可以采用以下三种形式之一:Text:文本字符串,您可以直接将字符串放入剪贴对象中,然后将剪贴对象放到剪贴板中。如需粘贴字符串,您需要从剪贴板获取剪贴对象,然后将字符串复制到应用的存储空间。URI:一Uri 对象,表示任何形式的 URI。它主要适用于从 Content Provider 复制复杂的数据。如需复制数据,您需要将一个 Uri 对象放入一个剪贴对象中,并将该剪贴对原创 2021-11-18 16:55:56 · 5822 阅读 · 0 评论 -
Android——使用Intent打开第三方应用
一个普通的应用默认会有一个入口 Activity与其 icon,在 AndroidManifest.xml 中:<application> <activity android:name=".MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent原创 2021-11-12 15:13:21 · 5334 阅读 · 1 评论 -
Android——小知识点总结
(1)stub什么是stub?如果一个接口有很多方法,如果要实现这个接口,就要实现所有的方法。一个类从业务来说,可能只需要其中一两个方法。如果直接去实现这个接口,除了实现所需的方法,还要实现其他所有的无关方法。而如果通过继承存根类就实现接口,就免去了这种麻烦。举个例子:接口类public interface IRepo { public void remove(String... sarr); public void add(String... sarr);原创 2021-11-01 16:30:16 · 1462 阅读 · 0 评论 -
Android——APP性能如何优化
1. 四个方面可以把用户体验的性能问题主要总结为4个类别:流畅稳定省电、省流量安装包小性能问题的主要原因归根到底,也就是内存使用、代码效率、合适的策略逻辑、代码质量、安装包体积这一类问题,整理归类如下:主要就四点:快:使用时避免出现卡顿,响应速度快,减少用户等待的时间,满足用户期望。稳:减低 crash 率和 ANR 率,不要在用户使用过程中崩溃和无响应。省:节省流量和耗电,减少用户使用成本,避免使用时导致手机发烫。小:安装包小可以降低用户的安装成本。2. 卡顿优化按场景原创 2021-07-06 19:40:38 · 761 阅读 · 3 评论 -
Android显示——一帧的渲染过程(VSYNC)
1. 概述一帧是如何显示的?简单来说,SurfaceFlinger用于合成显示图层,再将其刷入到HWComposer封装的显示设备中就可以显示了对于一帧内容,先等App UI画完了,SurfaceFlinger再出场对其进行合并渲染后放入framebuffer,最后整到屏幕上。当显示驱动支持时,VSYNC由硬件定时发送到HWComposer中;否则HWComposer会新起一个线程模拟发送VSYNC信号,其原理也十分简单,就是定期唤起线程发送信号。Surface跟LayerLayer是一个原创 2021-07-02 11:18:30 · 2232 阅读 · 2 评论 -
Android studio Cause: unable to find valid certification path to requested target怎么处理
有时候,刚刚下载安装Android studio会出现以下报错:Cause: unable to find valid certification path to requested target这是由于默认配置的源被墙了,导致部分资源不能访问报错把以上红框标红的值替换为以下:// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscrip原创 2021-07-01 11:39:22 · 284 阅读 · 0 评论 -
Android进阶——AMS浅析(1)
1. 简介AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。Activity与WIndow:Activity只负责生命周期和事件处理Window只控制视图一个Activity包含一个Window,如果Activity没有Window,那就相当于ServiceAMS与WMS:AMS统一调度所有应用程序的ActivityWMS控制所有Window的显示与原创 2021-06-29 01:29:02 · 1786 阅读 · 1 评论 -
Android进阶——WMS与AMS浅析
1.简介可以毫不夸张的说,Android的framework层主要是由WMS、AMS还有View所构成,这三个模块穿插交互在整个framework中,掌握了它们之间的关系和每一个逻辑步骤,你对framework的了解至少有百分之五十AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。在没有深入了解AMS与WMS前,对它俩负责的功能一直很模糊,一直搞不清区别。所以在深入原创 2021-06-29 00:44:24 · 6340 阅读 · 2 评论 -
Java/Android——多线程详解
1. 继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。1. package com.thread; 2. 3. public class FirstThreadTest extends Thread{ 4. int i = 0; 5. //重写run方原创 2021-05-09 18:52:09 · 515 阅读 · 0 评论 -
Android——多进程
之前我们了解了 :-----------------------------------Java——多线程浅析.-----------------------------------Android——Handler详解-----------------------------------Android——HandlerThread浅析-----------------------------------Java——ThreadPool线程池让我们继续看看Android多进程:1. 概述默认情况原创 2021-06-24 18:19:19 · 3230 阅读 · 1 评论 -
Android——SELinux 权限简介
1. 问题1.问题logE SELinux : avc: denied { find } for service=display pid=3015 uid=1046 scontext=u:r:mediacodec:s0tcontext=u:object_r:display_service:s0 tclass=service_manager permissive=0I auditd : avc: denied { find } for service=display pid=3015 uid=1046原创 2021-06-23 10:48:32 · 2096 阅读 · 0 评论 -
Android——如何编译生成SO文件
1.新建一个 Project,选择C++模版2.在app-java-cpp-CmakeLists文件中,添加以下代码。3.修改build.gradle,添加NDK支持4. 编译一下,出现includes(SO在里面)5.但是SO文件过大,使用以下命令原创 2021-06-23 10:38:33 · 2137 阅读 · 0 评论 -
JNI——Android Native代码的内存泄漏问题
利用开源的LeakTracer项目可以打印出内存的调用栈,从而发现内存泄漏问题。首先下载LeakTracer的代码LeakTracer.zip,在这里为大家准备好了一份,见我的资源。然后将代码解压至AS的JNI目录下,即native代码的第一层。将LeakTracer的相关文件导入CMake在代码块的开端添加头文件并在主函数中的开头和结尾添加如下代码,即start和stop抓取的操作这样就可以在指定目录得到一个文件,里面记录了所以未释放的内存调用信息,里面全都是地址信息,需要对so进原创 2021-06-23 10:30:34 · 683 阅读 · 0 评论 -
JNI——Android Native中跨线程使用JNI的问题
在Android Native中使用JNI是需要从java层传输JNIenv的,而这个env是无法跨线程使用的。也就是说如果你的子线程是无法利用env去调java的函数的,所有的类和方法都无法找到。因此如果需要在子线程中去调用java的函数,那么必须要做特殊处理。虽然JNIenv无法跨线程使用,但是JavaVM虚拟机却是所有线程公用的。因此第一步,JavaVM* xxx_jvm;创建一个全局变量JavaVm,目的是为了将这个主线程的变量保存下来。接下来在主线程的代码开始处添加env-GetJa原创 2021-06-23 10:16:15 · 1245 阅读 · 0 评论 -
Android——系统架构
1. 简介虽然Android系统非常庞大且错综复杂,需要具备全面的技术栈,但整体架构设计清晰。Android底层内核空间以Linux Kernel作为基石上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间与用户空间。对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统。Android 是一种基于 Linux 的开放源代码软件栈,为各类设备和机型而创建。下图原创 2021-06-18 17:10:46 · 336 阅读 · 0 评论 -
Android——Runnable和Thread,进阶:Callable接口 / Runnable接口 / Future接口
1. 简介为什么要有,Callable接口和Runnable接口?我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种创建线程的方式都有个问题,执行完任务后无法获取返回结果,于是,就有了Callable接口和Runnable接口。看看创建线程的两个方法:Class MyThread extends Thread{ @Override Void run(){}}new MyThread().start();Cla原创 2021-06-09 09:54:43 · 2485 阅读 · 0 评论 -
Android——APP启动流程&&Android开机流程
1.流程概述启动流程:①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;②system_server进程接收到请求后,向zygote进程发送创建进程的请求;③Zygote进程fork出新的子进程,即App进程;④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder I原创 2021-06-07 11:25:06 · 2191 阅读 · 0 评论 -
Android——Parcelable和Serializable浅析
1. 简介Parcelable是一个接口、用来实现序列化,Android特有的与此类似的还有一个接口Serializable,这是JavaSE本身支持的,而Parcelable是android特有的。二者比较:实现Parcelable就是为了进行序列化,那么,为什么要序列化?序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。1)永久性保存对象,保存对象的字节序列到本地文件中;2)通过序列化对象原创 2021-06-04 17:41:19 · 471 阅读 · 1 评论 -
Android——Binder机制
1.简介Android系统中,涉及到多进程间的通信底层都是依赖于Binder IPC机制。例如当进程A中的Activity要向进程B中的Service通信,这便需要依赖于Binder IPC。不仅于此,整个Android系统架构中,大量采用了Binder机制作为IPC(进程间通信,Interprocess Communication)方案。也存在部分其他的IPC方式,如管道、SystemV、Socket等为什么使用Binder:性能方面:Binder相对于传统的Socket方式,更加高效原创 2021-06-04 17:21:53 · 18087 阅读 · 10 评论 -
Android——MVP模式
1. MVP模式简介MVP,全称 Model-View-Presenter,即模型-视图-层现器。提MVP,就必须要先介绍一下它的前辈MVC,因为MVP正是基于MVC的基础发展而来的MVC模式:全称Model-View-Controller,即模型-视图-控制器View:对应于布局文件Model:业务逻辑和实体模型Controllor:对应于ActivityView对应于布局文件,其实能做的事情特别少,实际上关于该布局文件中的数据绑定的操作,事件处理的代码都在Activity中,造原创 2021-06-04 15:20:22 · 268 阅读 · 0 评论 -
Android——进程优先级
1. 前置知识每一个App至少是会有一个进程的。创建进程是件麻烦而且耗资源的事情,Android为了让App启动的时候能更快,会把那么暂时不使用的App的进程缓存起来但是内存是有限的,所以Android有一个淘汰机制,会根据App的运行状态设置一个进程的优先级(oom_adj),然后根据内存的紧张程度,把那些优先级低(oom_adj值大)的进程kill掉,以保证其他的进程能够有足够的内存使用。Zygote进程:这个是Android框架的主要进程,所有的App进程以及系统服务进程SystemSe原创 2021-06-03 20:45:32 · 2955 阅读 · 5 评论 -
Android进阶——AIDL详解
1. 简介AIDL(Android 接口定义语言),可以使用它定义客户端与服务端进程间通信(IPC)的编程接口,在 Android 中,进程之间无法共享内存(用户空间),不同进程之间的通信一般使用 AIDL 来处理。使用流程:在 .aidl 文件中定义 AIDL 接口,并将其添加到应用工程的 src 目录下,创建完成之后 rebuilAndroid SDK 工具会自动生成基于该 .aidl 文件的 IBinder 接口,具体的业务对象实现这个接口,这个具体的业务对象也是 IBinder 对象,当绑原创 2021-06-01 19:53:52 · 22804 阅读 · 5 评论 -
Android——进程间通信方式
1.IntentActivity,Service,Receiver 都支持在 Intent 中传递 Bundle 数据,而 Bundle实现了 Parcelable 接口,可以在不同的进程间进行传输。在一个进程中启动了另一个进程的 Activity,Service 和 Receiver ,可以在Bundle 中附加要传递的数据通过 Intent 发送出去。可以看看,Android——Bundle浅析2. 文件共享Windows 上,一个文件如果被加了排斥锁会导致其他线程无法对其进行访问,包括读和原创 2021-06-01 17:57:01 · 4771 阅读 · 8 评论 -
Android——Bundle浅析
Bundle主要用于传输数据,以key-value的形式存储数据。Bundle常用于在Activity间传递数据当bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口,下面分别介绍bundle在activity间如何传递基本数据类型和对象。传递方法:举个例子:写数据: Bundle bundle=new Bundle(); bundle.putString("name","police"); bundle.putInt("yea原创 2021-05-31 19:14:46 · 3029 阅读 · 4 评论 -
Android——IntentService浅析
1. 简介IntentService是Android里面的一个封装类,继承自四大组件之一的Service。主要是为了处理异步请求,实现多线程。注意:若启动IntentService多次,那么每个耗时操作则以队列的方式在IntentService的onHandleIntent回调方法中依次执行,执行完自动结束。工作流程图:实现步骤:步骤1:定义IntentService的子类:传入线程名称、复写onHandleIntent()方法步骤2:在Manifest.xml中注册服务步骤3:在Acti原创 2021-05-31 16:39:51 · 950 阅读 · 0 评论 -
Android——HandlerThread浅析
1. 简介在Android系统中,我们执行完耗时操作都要另外开启子线程来执行,执行完线程以后线程会自动销毁。想象一下如果我们在项目中经常要执行耗时操作,如果经常要开启线程,接着又销毁线程,这无疑是很消耗性能的。HandlerThread是Google帮我们封装好的,可以用来执行多个耗时操作,而不需要多次开启线程,里面是采用Handler和Looper实现的。怎么使用?//创建实例对象,该参数表示线程的名字HandlerThread handlerThread = new HandlerThread原创 2021-05-31 12:09:44 · 4052 阅读 · 2 评论 -
Android——AsyncTask浅析
1.简介AsyncTask是一个抽象类,它是由Android封装的一个轻量级异步类(轻量体现在使用方便、代码简洁),它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。内部封装了两个线程池:SerialExecutor,THREAD_POOL_EXECUTOR,和一个Handler:InternalHandler其中SerialExecutor线程池用于任务的排队,让需要执行的多个耗时任务,按顺序排列,THREAD_POOL_EXECUTOR线程池才真正地执行任务原创 2021-05-31 11:20:27 · 305 阅读 · 2 评论 -
Android——ContentProvider详解
1. 简介ContentProvider,内容提供者属于Android的四大组件之一用于进程间 进行数据交互 & 共享,即跨进程通信原理:使用binder机制(后续再进行介绍统一资源标识符(URI):MIME数据类型:全称Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务,是一种多用途网际邮件扩充协议作用:指定某个扩展名的文件用某种应用程序来打开 如指定 .html 文件采用 text 应用程序打开、指定 .pdf原创 2021-05-28 16:33:44 · 8544 阅读 · 6 评论 -
Android——广播(BroadcastReceiver)
1. 简介BroadcastReceiver (广播接收器),属于Android四大组件之一Android 广播分为两个角色:广播发送者、广播接收者用于监听 / 接收 应用发出的广播消息,并做出响应应用场景:不同组件之间通信(包括应用内 / 不同应用之间)与 Android 系统在特定情况下的通信,如当电话呼入时、网络可用时多线程通信实现原理:使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。有3个角色:消息订阅者(广播接收者)消息发布者(广播发布者)消息中原创 2021-05-27 18:00:46 · 1570 阅读 · 1 评论 -
Android——Timer和TimerTask
1. 简介Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。举个例子:import java.util.Timer;import java.util.TimerTask;public class Reminder { Timer timer; public Reminder(int seconds) { timer = new Ti原创 2021-05-27 16:56:18 · 1534 阅读 · 0 评论 -
Android——Handler详解
1. 简介Handler是一套 Android 消息传递机制可以说只要有异步线程与主线程通信的地方就一定会有 Handler。在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全2. 相关概念解释Handler、Message、Message Queue、LooperAndroid消息机制:以Handler的sendMes原创 2021-05-27 11:29:31 · 68316 阅读 · 17 评论 -
Android——PendingIntent浅析
1. 简介PendingIntent可以看作是对Intent的一个封装,在满足某些条件或触发某些事件后才执行指定的行为(启动特定Service,Activity,BrcastReceive)。A组件 创建了一个 PendingIntent 的对象然后传给 B组件,B 在执行这个 PendingIntent 的 send 时候,它里面的 Intent 会被发送出去,而接受到这个 Intent 的 C 组件会认为是 A 发的。B 以 A 的权限和身份发送了这个 Intent。比如,我们的 Acti原创 2021-05-27 10:50:36 · 394 阅读 · 4 评论 -
Android——Service浅析
Service是Android程序中四大基础组件之一适用于去执行那些不需要和用户交互而且还要求长期运行的任务Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,不要在Service中执行耗时的操作1. Service分类按运行地点分类:按运行类型分类:按使用方式分类:2. Service 方法手动调用:自动调用:3. Service 生命周期OnCreate()系统在service第一次创建时执行此方法,来只运行一次的初始化.原创 2021-05-26 17:03:06 · 342 阅读 · 4 评论