Android App的工作原理

2023-11-18

Android App的工作原理


Android系统是基于liunx内核的,但是与传统的基于liunx的pc系统不同, 用户对Android app没有绝对的掌控权。pc系统中, 在应用程序的系统菜单上选择“退出”或者“关闭”之类的选项会直接杀死进程。在Android系统中不是这样的。 而是由系统,当系统需要释放内存来运行新进程或者保证某些后台进程和前端进程顺利执行的时候才会释放相应应用程序的资源,这个释放过程有一个重要性的层次,接下来就听乐居猫做一下说明:

android中进程的层次如下(重要性由高到低):
    1、前端进程。顾名思义,前端进程就是目前显示在屏幕上和用户交互的进程,在系统中前端进程数量很少,而这种进程是对用户体验的影响最大,只有系统的内存稀少到不足以维持和用户的基本交互时才会销毁前端进程。因此这种进程重要性是最高的。
    2、可见进程。可见进程也拥有一个可视化的界面,只是目前不是最上层界面(最上层界面在前端进程里面),可见进程一般调用了OnPause(),可见进程比前端进程重要性低,但是在交互方面影响还是很大,因为用户可能随时切换过去,所以系统不会轻易销毁它。
    3、服务进程。一个服务进程就是一个Service,它调用了startService(),就是UNIX中说的守护进程,对用户不可见,但是保证了一些重要的事件被监听或者维持着某些状态,比如网络数据传输、后台音乐播放,这类进程在内存不足且为了保证前端交互的顺利进行的时候被销毁。
    4、后台进程。这里叫后台进程可能会和一般意义上的后台进程混淆,要说明的是,android里的后台进程是调用了OnStop()的,可以理解成用户暂时没有和这个进程交互的愿望,所以这里后台进程有点“待销毁”的意思。
    5、空进程。这是一种系统缓存机制,其实就是个进程的外壳,当有新进程创建的时候,这个空进程可以加快进程创建速度,当系统内存不足的时候,首先销毁空进程。
android中进程重要性层次

接下来结合Android Activity的生命周期来说明一下:


 

一个进程创建时系统会为它创建一个Activity(活动),紧接着调用onCreate(),onCreate()中主要是进行一些初始化,例如读取XML资源文件创建布局,设置主界面各种监听函数等等,每个进程都会调用onCreate()。


     接着是onStart(),需要说明的是,在默认 Activity中(就是程序一启动我们看到的那个Activity实体),程序员在写代码的时候并不需要显式去调用onStart(),系统会默默帮你调用;但是,当你需要在这个程序中创建除了默认Activity以外的所有新Activity的时候,你必须显式调用这个onStart(),这个 onStart()有个新名字叫做startActivity(intent),这里的intent表示一个意图,就是我们想创建的新Activity。
     然后是onResume(),当我们从主程序界面跳到别的地方再跳回来的时候调用onResume()。然后程序就跑起来了,我们叫他进程 A,如果这个时候其他进程变成了前端进程(进程B),此时进程A就会调用onPause(),这会保存进程的状态做数据持久化。这时候有两种情况,进程A 再次成为前端进程,于是进程A调用onResume()来恢复运行;如果在进程A处于onPause()这段时间内系统内存不足了,进程A就有可能被销毁,来为别的进程腾出内存(为什么是“可能”被销毁?详见上面的android进程重要性层次说明),如果用户再次切换到进程A,这是系统只是重新创建一个进程,它不再是进程A了(因为此时进程A已经被销毁了)。


        当onPause()被调用以后用户按了返回键(back),那进程A会调用 onStop(),之前说了用户此时已经没有和进程A交互的愿望了,所以进程A成为了“待销毁”的对象(为什么没有直接销毁呢?答案还是在android 进程重要性层次说明)。那么如果在一个进程A还没有被销毁的时刻用户再次切换到进程A,进程A又成为了前端进程,此时进程A会调用 onRestart(),进而调用onStart()来再次开始进程(此时重新开始的还是进程A本身,没有换成其他的,因为进程A还未被销毁),在这里可以理解成把进程A“唤醒”了。如果很不幸,系统内存又不足了,调用了onStop()后的进程A可能再次被销毁,就像图上画的那样,这里不再赘述。至于 onStop()后面的onDestroy()调用是在系统内存不足的时候由系统调用来销毁进程和释放内存的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android App的工作原理 的相关文章

  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 为什么 Google 建议将库复制到您的树中?

    谷歌的Play 服务 API 的使用说明 http developer android com google play services setup html 例如 说 将 extras google google play service
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 在android中从SD卡上传图像到facebook

    我无法从 SD 卡上传 Facebook 上的图像 我使用了下面的代码 但它没有给我错误 但同时它没有上传图像 byte data null try FileInputStream fis new FileInputStream filep
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • partitioningBy 必须生成一个包含 true 和 false 条目的映射吗?

    The 分区依据 https docs oracle com javase 8 docs api java util stream Collectors html partitioningBy java util function Pred
  • 如何解决 greenDAO 在执行 InsertOrReplace 时“不存在这样的表错误”?

    我正在使用 greenDAO 并且已成功生成所有必需的类和实体 并且我可以看到我的表已创建 但是在要替换的行上放置断点后 我收到一条错误消息 告诉我 不存在这样的表错误 try appTimeUsageDao insertOrReplace
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho
  • View.post(),以及当Runnables被执行时

    我最初的问题是需要知道我的根的高度和宽度View这样我就可以进行程序化的布局更改 就我的目的而言 我不一定需要在onCreate 对于我来说 以编程方式添加我的孩子就足够了View根布局完成后 因此我很乐意使用onWindowFocusCh

随机推荐

  • Java代码质量评估工具

    概述 Java代码的质量评估主要包括代码的可维护性 健壮性 以及在运行时能达到既定的性能目标 可维护性主要包括代码的可读性 在关键的代码上提供详细注释 在设计类或方法以及代码逻辑时符合设定的编码规范 健壮性主要包括编写代码时应使用常用的设计
  • Spring系列之@Aspect中5中通知详解

    Aspect中有5种通知 Before 前置通知 在方法执行之前执行 Aroud 环绕通知 围绕着方法执行 After 后置通知 在方法执行之后执行 AfterReturning 返回通知 在方法返回结果之后执行 AfterThrowing
  • Java EE企业级-第1章 Spring的基本应用

    第1章 Spring的基本应用 重点 ApplicationContext容器使用 属性setter方法注入的实现 Spring中的IoC和DI Spring Spring是分层的JavaSE EE full stack 轻量级框架 以Io
  • Mockito 如何 mock 静态方法

    在实际工作当中 我们经常会遇到需要对静态方法进行 mock 的情况 在 mockito 2 x 的时代 我们需要借助 powmock 才能实现 当 mockito 进化到了 3 4 0 版本以后 也开始对静态方法 mock 进行了支持 主要
  • 组装台式计算机需要哪些配件,组装一台电脑需要哪些配件【详细列举】

    电脑是我们生活中常见的电子产品 尤其是台式机是我们大家常用的工具 而对于电脑而言大部分朋友都是不陌生的 因为电脑在我们平时生活中是经常使用的 但是对于购买电脑的时候 很多朋友都会觉得商场的电脑总是不符合我们心意 这个时候组装电脑就是非常有需
  • 你真的把数据库事务搞懂了吗,有图有真相,图文并茂!

    数据库事务 数据库事务 jdbc事务 事务的ACID 数据库的并发 数据库的四种隔离级别 数据库事务 数据库事务 transaction 是访问 并可能操作各种数据项的 一个数据库操作序列 这些操作要么 全部执行 要么 全部不执行 是一个不
  • 利用 DNSLog无回显注入

    DNSLog概念 DNSLog 域名系统日志 是一种特殊的技术和服务 用于捕获和记录通过域名系统 DNS 协议进行的请求和响应 它的目的是帮助用户跟踪 分析和管理DNS流量 并收集与域名相关的信息 基本上 DNSLog服务提供了一个自定义的
  • Archlinux 折腾记录~

    新建虚拟机 值得注意 典型配置 直接选择镜像文件 官网下载 版本选择 其他Linux N x 或更高版本内核64位 开机前 虚拟机设置 gt 选项 gt 高级 gt 选择UEFI 必须 配置 1 确保网络畅通 ping www baidu
  • 直播APP源码开发,直播APP源码搭建,如何优化程序?

    直播APP源码由最初的传统秀场类直播 再到现在各种细分垂直分类的游戏和电商等类别 随着技术和时代的不断发展和更新迭代 出现了一种名为SDK的东西 成为了开发直播app源码时必需的好帮手 1 节约成本 开发软件的过程中 如果是一点点地敲代码完
  • 解决python在windows上运行弹出cmd窗口(dos窗口)

    运行python程序的时候会在背景显示一个cmd 要想不显示其实很简单 虽然是我找了1个小时 才了解的基本知识 方法1 pythonw xxx py 方法2 将 py改成 pyw 这个其实就是使用脚本解析程序pythonw exe 原文 1
  • Ubuntu安装ROS

    原文链接 https blog csdn net qq 44830040 article details 106049992 这也是我在ubuntu里面安装ROS的第N次 以前每次安装过程都忘记总结了 导致每次安装ROS都浪费了很多的时间用
  • Mysql 安装

    Mysql 安装 环境 windwos 10 1511 64bit mysql 5 7 14 一 下载mysql 1 在浏览器里打开mysql的官网http www mysql com 2 进入页面顶部的 Downloads 安卓培训 IT
  • Vite3 + Svelte3使用@import导入scss样式

    近年来 前端技术日新月异 Vite Vue3 Svelte SolidJS 等框架工具大放异彩 身为一个前端开发 总感觉一刻不学习就要out了 最近使用 Vite3 Svelte3 来构建封装自定义的 Web Components 开始了艰
  • 开发板配置NFS服务

    文章目录 NFS介绍 NFS版本 NFS服务器和客户端 安装NFS 配置NFS服务器 启动NFS服务 挂载NFS共享 NFS安全性 NFS日志 开发板配置NFS环境 环境 操作前先关闭防火墙 配置过程 server端的配置 开发板的操作 常
  • 华为OD机试真题 Java 实现【拔河比赛】【2023 B卷 100分】,附详细解题思路

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA
  • JAVA--windows和linux下执行.class

    windows和linux下执行 class windows下执行 class linux下执行 class windows下执行 class title testJOb java cp jar com yang jobTest start
  • CMake命令

    1 aux source directory 查找当前目录所有源文件 并将源文件名称列表保存到DIR SRCS变量 不能查找子目录 aux source directory DIR SRCS 2 添加一个库或预编译库 添加一个库 名为
  • 企业实名认证接口

    详情链接 http www haoservice com docs 140 企业实名认证接口 通过营业执照全称 营业执照注册号 对公账户名 对公账号 清算联行号来验证信息一致不一致 支持格式 JSON XML 请求方式 GET POST 明
  • Springboot集成Redis——实现分布式锁

    目录 1 分布式锁 2 springboot集成redis 3 使用setnx命令实现分布式锁 4 使用Redission实现分布式锁 5 redission分布式锁的类型 1 分布式锁 分布式锁 即分布式系统中的锁 随着业务发展的需要 原
  • Android App的工作原理

    Android App的工作原理 Android系统是基于liunx内核的 但是与传统的基于liunx的pc系统不同 用户对Android app没有绝对的掌控权 pc系统中 在应用程序的系统菜单上选择 退出 或者 关闭 之类的选项会直接杀