Android BroadCast (一)

SPI 总线信号完整性与时序一致性测试 SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性 阅读详情

Android BroadCast (一)


我们先来看看网络上对BroadCast较为普遍的看法:

到底怎么看待BroadCast

如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束
BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的
所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 .

上面这个看法是对还是错,还是并不完善?

Android Process

先来看看Android官方文档对于进程的几种定义:

To determine which processes should be killed when low on memory, Android places each process into an “importance hierarchy” based on the components running in them and the state of those components. These process types are (in order of importance):

A foreground process

A foreground process is one that is required for what the user is currently doing. Various application components can cause its containing process to be considered foreground in different ways. A process is considered to be in the foreground if any of the following conditions hold:

  • It is running an Activity at the top of the screen that the user is interacting with (its onResume() method has been called).
  • It has a BroadcastReceiver that is currently running (its BroadcastReceiver.onReceive() method is executing).
  • It has a Service that is currently executing code in one of its callbacks (Service.onCreate(),Service.onStart(), or Service.onDestroy()).

There will only ever be a few such processes in the system, and these will only be killed as a last resort if memory is so low that not even these processes can continue to run. Generally, at this point, the device has reached a memory paging state, so this action is required in order to keep the user interface responsive.

A visible process

A visible process is one holding an Activity that is visible to the user on-screen but not in the foreground (itsonPause() method has been called). This may occur, for example, if the foreground Activity is displayed as a dialog that allows the previous Activity to be seen behind it. Such a process is considered extremely important and will not be killed unless doing so is required to keep all foreground processes running.

A service process

A service process is one holding a Service that has been started with the startService() method. Though these processes are not directly visible to the user, they are generally doing things that the user cares about (such as background mp3 playback or background network data upload or download), so the system will always keep such processes running unless there is not enough memory to retain all foreground and visible process.

A background process

A background process is one holding an Activity that is not currently visible to the user (its onStop() method has been called). These processes have no direct impact on the user experience. Provided they implement their Activity life-cycle correctly (see Activity for more details), the system can kill such processes at any time to reclaim memory for one of the three previous processes types. Usually there are many of these processes running, so they are kept in an LRU list to ensure the process that was most recently seen by the user is the last to be killed when running low on memory.

An empty process

An empty process is one that doesn’t hold any active application components. The only reason to keep such a process around is as a cache to improve startup time the next time a component of its application needs to run. As such, the system will often kill these processes in order to balance overall system resources between these empty cached processes and the underlying kernel caches.

上面将Android的5中进程都描述了一遍。从高优先级到低优先级分别是:

  • 前台进程
    • Activity在生命周期内,并且onResume()执行过,此时Activity获得焦点。
    • Broadcast在生命周期内onReceive()正在执行。
    • Service.onCreate(),Service.onStart(), or Service.onDestroy()任何一个方法被执行。
    • 归结为一句话就是 Applicaton的三大组件在运行中,这个时候就是前台进程。
  • 可见进程
    • 当Activity在生命周期中,并且onPause执行过,此时Activity失去焦点。
  • 服务进程
    • 当Service startService()以后,
  • 后台进程
    • 当Activity在生命周期中,并且onStop执行过,此时Activity不可见。
  • 空进程
    • 该进程木有Application的任何组件。

结论

当Android资源紧张的时候会按照从低到高优先级回收这些进程。
对于一个尚未在Mainfest中配置各个组件属于哪个进程的情况下,一个Application默认会将四大组件放在同一个Process中。而对于这样一个项目来说,一般会有个Activity组件存在,所以此时的Process是上面的哪种情况呢?

  • A foreground process 当该Acticity是活动的,获得焦点
  • A visible process 当该Activity是活动的,但是被遮挡,失去焦点
  • A background process 当该Activity不是活动的,被完全盖住

所以这样一个Process无论如何都不会是个空进程,这一点是肯定的,

  • 此时在 Broadcast 的 Onreceive() 方法中开启一个子线程去做异步操作是可行的。
  • 对于比较特殊的项目来说,没有任何Activity存在,也没有任何Service存在,那么在执行到OnReceive(),此时Apk进程是一个A foreground process,而当执行结束以后,此时Apk进程很可能是An empty process,所以系统很容易结束掉这个Apk进程,所以在OnReceive()中启用一个子线程是不安全的,如果此时在OnReceive()中启用Service,那么起码在OnReceive()中执行结束以后,Apk进程还可以处于A service process,所以不可能被系统无端Kill掉

关于Broadcast的基本情况介绍到这里,接下来会继续介绍发送广播的两种方式:Android BroadCast (二)

CAM350常用快捷键 CAM350快捷键 CAM350常用快捷键 阅读详情

相关推荐

PaddleOCR实战:如何在CentOS 8.5上搭建高性能OCR识别环境

本文详细介绍了在CentOS 8.5系统上搭建高性能PaddleOCR识别环境的完整指南。从系统环境准备、PaddlePaddle框架部署到PaddleOCR的定制化安装与性能优化,提供了针对生产环境的解决方案,包括GPU/CPU环境配置、内核参数调优及常见问题排查,帮助用户实现高效OCR识别。

weixin_29223603的博客 349

Android学习——BroadCast(一)

初识广播 BroadCast即为广播,为安卓四大组件之一,用于在应用程序和Activity间传输信息。一条广播,分为发送和接收两部分,发送方通过Intent存储信息,并进行发送。接收方通过BroadCastReceiver来接收消息。如果要指定接受的消息类型,则可以通过过滤器intentfilter来过滤。BroadCastReceiver的生命周期很短,只有十秒左右,所以一...

diying1591的博客 174

告别串口助手!手把手教你用Matlab直接读取STM32的传感器数据(附完整代码)

本文详细介绍了如何利用Matlab直接与STM32进行串口通信,实现传感器数据的实时采集与分析。通过完整的代码示例和系统架构设计,帮助开发者告别传统的串口助手工具链,打造高效、自动化的数据采集系统。文章涵盖了从硬件配置、通信协议设计到Matlab数据处理与可视化的全流程,特别适合嵌入式开发与数据分析结合的实践场景。

weixin_42629671的博客 428

android 模拟 broadcast,Android 浅析 Broadcast (一) 使用

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?前言Linus Benedict Torvalds : RTFSC – Read The Funning Source Code概括广播(Broadcast)是在组件之间传播数据(Intent)的一种机制。通过Broadcast发送者和接收者,并且不需要知道对方存在。使用Step 1. 创建接收类创建一个接收类继承Bro...

weixin_35780601的博客 322

从零到一:RT-Thread与W5500的硬件抽象层设计哲学与实践启示

本文深入探讨了RT-Thread操作系统下W5500以太网模块的硬件抽象层(HAL)设计哲学与实践。通过GD32F103和STM32F103平台的适配案例,详细阐述了如何利用RT-Thread的驱动框架实现跨平台硬件无关性、模块化设计及配置定制,为嵌入式开发者提供了可复用的HAL设计方法论和实战经验。

7z8x2c4v6b9的博客 197

【Anaconda】解决“libGL error: MESA-LOADER: failed to open iris”问题

stackoverflow中的“libGL error: MESA-LOADER: failed to open iris”问题。而在自己创建的conda环境中的lib下出现`GLIBCXX_3.4.30’ not found 的情况。在上述解决方案中,将第一行命令的lib路径换成自己创建的conda环境lib路径,运行指令,问题解决。目前问题解决,总结一下查找资料以及解决方法。运行如下命令,发现本地支持。

quintus0505的博客 5023

Android 四大组件之Broadcast【一】

一,什么是广播? 广播, 做为Android的四大组件之一,被用于发送和接收,来自系统或其它app的消息。其设计原理,是基于观察者模式来设计的,即先订阅,后接收。广播消息,并不受限于某一个单一进程。因此,它可以用于跨进程间的通信,在多个App之间传递消息。 二,广播的分类。 根据广播的订阅(定义)方式和生命周期,我们可以将广播归纳为2种类型,即静态广播与动态广播。 静态广播 静态注册的广播,在A...

李岳锋的专栏 422

YOLO26改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头

本文记录的是基于移动倒置瓶颈 MBConv 的 YOLO26 的检测头轻量化改进方法研究。采用了独特的倒置瓶颈结构,通过的操作以及,在高效提取特征的同时极大地降低了计算量。本文将的设计优势融入j检测头中,使其在目标检测任务中不仅能够更精准地识别各类目标,还能在计算资源有限的情况下快速响应,展现出更为卓越的实时检测能力。EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks的实现代码如下: 首先在代码中加入如下代码: 其

Limiiiing的博客 286

Android Broadcast原理分析之registerReceiver(一)

目录 BroadcastReceiver概述 BroadcastReceiver分类 registerReceiver流程图 源码解析 总结 1. BroadcastReceiver概述 广播作为四大组件之一,在平时开发过程中会大量使用到,使用方式也是多种多样的,既可以自己在manifest中注册,也可以在java代码中动态注册,既可以接收由系统发出的广播,也可以接受自己定义并发送的广播。广播...

人生如逆旅 1万+

【LLM数据篇】预训练数据集+指令生成sft数据集

在《Aligning Large Language Models with Human: A Survey》综述中对LLM数据分类为典型的人工标注数据、self-instruct数据集等 优秀的开源sft数据集:alpaca_data、belle、千言数据集、firefly、moss-003-sft-data多轮对话数据集等 文章目录 note 构造指令实例的3种方式 sft:Aligning Large Language Models with Human: A Survey Alpaca 1. self

发现问题,并解决问题,批判性思维 1万+

Linux kernel crypto的介绍和代码导读

在Linux kernel的module_init阶段会将algif_type_skcipher、algif_type_aead、algif_type_hash、algif_type_rng 四种算法注册.在userspace通过netlink调用了,kernel种的af_alg模块收到消息后, 根据上层传来的算法种类名字来选择走哪一个结构体(alg_type_xxx)的ops函数。也就是添加到af_alg维护的alg_types链表种. alg_types链表种仅有这四个数据.

baron-周贺贺-代码改变世界ctw 321

Android >> 30. 广播-Broadcast(一)

为了便于进行系统级别的消息通知,Android 引入了Broadcast 机制。 Android 中每个应用程序都可以对自己感兴趣的Broadcast 进行注册,其消息可能来自系统,也可能来自其他应用程序。 Android 的Broadcast 主要分为两种:标准广播(Normal broadcasts)和有序广播(Ordered broadcasts) Normal broadcasts 在广播...

原谅我这一生不羁放纵爱自由 438

搞定ESD(七):静电放电问题典型案例分析(二)

静电放电噪声耦合的方式主要是:传导耦合与辐射耦合,辐射耦合主要以磁场耦合、 电场耦合为主要形式。电场耦合发生的主要条件是:静电放电高频在参考地平面寄生电感中产生电平波动,平行于参考地平面上的较长信号布线就很容易通过分布电容发生电场耦合。根据高速信号回流路径的特性可知,其回流路径是贴近信号布线下方,或者信号两侧,若信号回流路径跨分割后,环路面积会随之增大;信号环路面积大从EMI角度看其空间辐射更强,从EMS角度看则更容易耦合外部噪声干扰(雷击浪涌、EFT、ESD、RS)。

记得诚 2801

Android笔记一(Broadcast)

1、接收系统的广播----使用动态注册监控网络的变化         广播接收器可以自由地对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能够收到该广播,并在内部处理相应的逻辑。一般的注册广播有两种形式1、动态注册 (即在java代码中注册)  2、静态注册 (在AndroidManifest.xml 中注册),这里使用的是动态注册的形式。         那么该如何创建一个

xq_sq的博客 577

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android广播管理一--Broadcast机制介绍

在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用。     在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间

Kitty_Landon的专栏 1315

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android学习笔记14——Broadcast机制(一)

Android广播机制 Broadcast 初步

山顶冻人的专栏 1820

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

USB 3.0 U盘识别失败根因:Rx Detect原理与实测调试

在高速串行链路中,链路训练是设备正常通信的前提,而接收端终端电阻检测(Rx Detect)则是链路训练的第一步。其原理是通过注入微弱电流并检测对端接收差分对上的电压变化,判断终端电阻是否在位,从而决定链路能否进入Polling状态。这一机制直接影响USB 3.0、Type-C扩展坞及存储类产品的设备识别率与传输稳定性。当U盘出现“USB 2.0正常但USB 3.0不认”或“插上要等一两秒才识别”时,往往与Rx Detect失败有关,涉及LTSSM状态机、Redriver/Retimer信号调理及信号完整性。

weixin_34234721的博客 401

Android之Activity ContentProvider Service Broadcast,线程间通信,AIDL(一)

1. 请描述下Activity的生命周期。  2. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?  3. 如何将一个Activity设置成窗口的样式。(Edited by Sodino)  4. 如何退出Activity?如何安全退出已调用多个Activity的Application?  5. 请介绍下Android中常用的五种布局。  6. 请介

2715

Android中Intent,service,broadcast应用浅析(一)

Android中Intent,service,broadcast应用浅析(一) 典型的Android应用程序由两部分构成,一个是在前台运行的Activity和View,一个就是在后台运行的Intent 和Service对象,还有一种是是广播接收器,BroadCastReceiver,我们通常启动一个service(服务)对象或者发送一个广播,都是由Intent 来启动的...

weixin_34224941的博客 159

Android 实战 (一) Remote Service,Thread,Handler,Broadcast

两个APP,说明如下。 ServiceApp: 有一个界面,上面有两个按钮,一个是启动服务,一个是停止服务,并且有一个TextView显示当前service的状态(停止/正在运行)。服务启动的时候每隔一秒向外广播成员变量i的值(i是int类型,每广播一次加1)。service要求用remote service实现。 ClientApp: 有一个界面,两个按钮,一个是BindServic

Dake 2093

Android中BroadCast与Activity之间的通信(一) 使用观察者模式Observer

观察者模式是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都将得到通知,并自动更新”,可以理解成多个观察者向一个被观察者订阅消息,当被观察者发生改变时通知相应的观察者去作自己的事情。 Android 中的观察者 实现Observer接口,被观察者继承Observable类。 1、被观察者类(ObservableObject) public ...

JUN_LLLL的博客 926

Android监听器实现(一)Broadcast方式监听系统事件

注:下面红色的字体暂时不能理解的请先略过,在文后会有详细解释监听类似于挂钩函数,大致是做到当被监听的事件发生了之后系统提醒我们去处理,而不是我们启动一个线程不断去询问系统这个事件有没有发生。例如:(1)给Button设置按下监听(2)java.awt.Frame的windowsListener等。在安卓种该如何实现监听呢?废话不多说,我们直接按照步骤直接来试试。1.在Andr...

weixin_33858336的博客 347

Android-9: 持续打印non-protected broadcast 问题

1. 问题 将App打包成系统App时,自己App新增的广播,发送广播时总是打印如下log: ActivityManager: Sending non-protected broadcast 2. 分析 PackageManagerService启动的时候会扫描App,检测AndroidManifest.xml ...

3572

android上app后台运行的相关知识(一)————android的四大组件:Activity、Service、BroadCast Recevicer、Content provider

以前所测试的项目基本没有涉及到需要后台记录功能的,前阵子去某app面试被问到后台运行的app的测试问题,所以回来大概查了一下,一般我们看到的前台界面属于android中得activity,但是多媒体播放或者后台记录运行轨迹等功能都是靠后台的service运行来保障的,一下是我搜索到得android四大组件,前两个就是activity和service以及二者的联系和差别。接下来应该搞明白androi

momoko的专栏 1122

[Android新手学习笔记28]-Broadcast-例一广播检测网络变化

新建一个带MainActivity的项目,注意这里需要获得网络使用状态,需要在AndroidMainfest文件中注册权限: package="top.xiexiaodong.broadcastdemo"> android:name="android.permission.ACCESS_NETWORK_STATE" /> MainActivity代码如下: p

幼发拉底 603

Android中的广播Broadcast详解

Android中的广播Broadcast详解

younger 289
上一篇: Android BroadCast (二)
下一篇: Android 代码优化
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值