Android 四大组件基础(Activity/Service/BroadcastReceiver/ContentProvider)工控场景用法
Android 四大组件基础Activity/Service/BroadcastReceiver/ContentProvider工控场景用法四大组件是安卓应用开发的地基。手机开发可能只用 Activity 就够了但工控场景下四个组件各司其职缺一不可。今天咱们把每个组件在工控中的角色和实战代码都捋清楚。一、四大组件概述与工控中的角色Android 应用由四种核心组件构成它们各司其职组件官方定义工控中的角色Activity提供用户界面的组件数据监控大屏、参数配置页面Service后台运行的无界面组件串口数据采集、Modbus 轮询、看门狗守护BroadcastReceiver接收系统或应用广播开机自启、网络状态监听、外设热插拔检测ContentProvider跨应用数据共享多 APP 共享传感器数据、设备配置信息在工控场景中四大组件的使用优先级和手机开发完全不同手机开发 Activity 占 80%而工控开发中Service 才是核心——你写的 APP 很多时候根本不需要界面。二、Activity工控界面的承载者2.1 工控 Activity 的特点工控设备的 Activity 和手机 APP 的 Activity 有本质区别全屏无标题栏工控 APP 不需要 ActionBar不需要导航栏不需要花里胡哨的动画固定横屏/竖屏设备是横装还是竖装焊死在机柜里不允许旋转无返回键依赖用户可能根本没有返回键所有导航必须在界面内完成防退出按返回键不能退出 APP必须通过特定流程长按、密码退出2.2 工控 Activity 配置模板在AndroidManifest.xml中activityandroid:name.MainActivityandroid:screenOrientationlandscapeandroid:themestyle/Theme.AppCompat.NoActionBarandroid:configChangesscreenSize|orientation|keyboardHiddenintent-filteractionandroid:nameandroid.intent.action.MAIN/categoryandroid:nameandroid.intent.category.HOME/categoryandroid:nameandroid.intent.category.DEFAULT//intent-filter/activity关键配置说明screenOrientationlandscape锁定横屏设备转不了HOMEcategory把 APP 设为桌面开机直接进你的应用configChanges自己处理配置变化不让系统重建 Activity2.3 防退出处理OverridepublicvoidonBackPressed(){// 工控 APP 禁用返回键退出// 可以是空实现也可以做特定逻辑showExitConfirmDialog();// 弹出自定义退出确认}OverridepublicvoidonWindowFocusChanged(booleanhasFocus){super.onWindowFocusChanged(hasFocus);if(hasFocus){hideSystemUI();// 隐藏虚拟按键和状态栏}}privatevoidhideSystemUI(){ViewdecorViewgetWindow().getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY|View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);}这段代码把你的 Activity 变成真正的全屏无干扰模式——下拉通知栏都拉不出来。三、Service工控 APP 的灵魂3.1 为什么 Service 是核心工控设备的大部分工作跟界面无关——串口一直在收传感器数据Modbus 协议每 100ms 轮询一次 PLCCAN 总线上车辆数据不断涌来。这些操作必须脱离 Activity 的生命周期否则用户一切换界面数据就断了。3.2 前台 Service不被系统杀死的后台任务从 Android 8.0 开始后台 Service 会被系统限制甚至杀死。工控 APP 必须用前台 Service带一个常驻通知publicclassSerialServiceextendsService{privatestaticfinalintNOTIFICATION_ID1;privatestaticfinalStringCHANNEL_IDserial_channel;OverridepublicvoidonCreate(){super.onCreate();createNotificationChannel();startForeground(NOTIFICATION_ID,buildNotification());// 初始化串口开始数据采集initSerialPort();}OverridepublicintonStartCommand(Intentintent,intflags,intstartId){// 返回 START_STICKY被系统杀死后自动重启returnSTART_STICKY;}privatevoidcreateNotificationChannel(){NotificationChannelchannelnewNotificationChannel(CHANNEL_ID,串口服务,NotificationManager.IMPORTANCE_LOW);channel.setDescription(工控串口数据采集服务);NotificationManagermanagergetSystemService(NotificationManager.class);manager.createNotificationChannel(channel);}privateNotificationbuildNotification(){returnnewNotificationCompat.Builder(this,CHANNEL_ID).setContentTitle(数据采集运行中).setContentText(串口服务正在运行).setSmallIcon(R.drawable.ic_serial).setOngoing(true)// 用户无法滑动删除.build();}NullableOverridepublicIBinderonBind(Intentintent){returnnull;}}在AndroidManifest.xml中声明uses-permissionandroid:nameandroid.permission.FOREGROUND_SERVICE/serviceandroid:name.SerialServiceandroid:enabledtrueandroid:exportedfalseandroid:foregroundServiceTypedataSync/3.3 Service 的启动方式// 方式一startServiceService 独立运行不依赖调用者IntentintentnewIntent(this,SerialService.class);startService(intent);// 方式二bindService调用者和 Service 绑定可以互相通信IntentintentnewIntent(this,SerialService.class);bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);工控场景大多用startService让 Service 独立于 Activity 运行。3.4 工控 Service 典型用途用途实现方式串口数据采集Service 中开线程循环读取/dev/ttyS*Modbus TCP 轮询Service 中定时任务读写 PLC 寄存器MQTT 连接保活Service 维持长连接断线自动重连看门狗喂狗Service 定时写/dev/watchdog或 GPIOGPS/RTK 定位Service 持续解析 NMEA 数据四、BroadcastReceiver系统的耳朵BroadcastReceiver 是 Android 的事件监听机制。工控场景中它主要用于感知环境变化。4.1 开机自启广播这是工控 APP 最常用的广播——设备通电后自动拉起你的服务publicclassBootReceiverextendsBroadcastReceiver{OverridepublicvoidonReceive(Contextcontext,Intentintent){if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){// 启动串口采集服务IntentserviceIntentnewIntent(context,SerialService.class);context.startService(serviceIntent);// 启动主界面IntentactivityIntentnewIntent(context,MainActivity.class);activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(activityIntent);}}}在 Manifest 中声明uses-permissionandroid:nameandroid.permission.RECEIVE_BOOT_COMPLETED/receiverandroid:name.BootReceiverandroid:exportedtrueintent-filteractionandroid:nameandroid.intent.action.BOOT_COMPLETED//intent-filter/receiver4.2 其他工控常用广播广播 Action触发时机工控用途BOOT_COMPLETED系统启动完成自启 Service 和 ActivityCONNECTIVITY_CHANGE网络状态变化网络断了告警、切换备用网络BATTERY_LOW电量过低UPS 供电告警TIME_TICK每分钟触发定时任务不精确但省电PACKAGE_ADDED新 APP 安装安全检测、自动配置4.3 动态注册 vs 静态注册// 动态注册代码中注册更灵活IntentFilterfilternewIntentFilter();filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(networkReceiver,filter);// 记得在 onDestroy 中反注册unregisterReceiver(networkReceiver);工控设备一般用静态注册在 Manifest 中声明因为动态注册依赖组件生命周期设备重启后不一定还在。五、ContentProvider工控多 APP 数据共享ContentProvider 在日常手机开发中很少用——除了读系统通讯录。但在工控场景中它是一个被低估的家伙。5.1 工控场景的典型需求假设你的工控设备上跑了三个 APP数据采集 APP负责读写串口、采集传感器数据本地监控 APP负责显示实时数据和报警远程上报 APP负责把数据上传到云平台这三个 APP 需要共享数据传感器数值、设备状态、报警记录。用文件互传太原始。用 SQLite 数据库互相访问Android 11 已经锁死了/data/data/的跨应用访问。这时候 ContentProvider 就是正道。5.2 实现一个简单的数据共享 ContentProvider数据采集 APP 作为数据提供方publicclassSensorProviderextendsContentProvider{publicstaticfinalStringAUTHORITYcom.example.collector.provider;publicstaticfinalUriCONTENT_URIUri.parse(content://AUTHORITY/sensors);OverridepublicbooleanonCreate(){// 初始化数据库dbHelpernewSensorDbHelper(getContext());returntrue;}OverridepublicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder){SQLiteDatabasedbdbHelper.getReadableDatabase();returndb.query(sensor_data,projection,selection,selectionArgs,null,null,sortOrder);}OverridepublicUriinsert(Uriuri,ContentValuesvalues){SQLiteDatabasedbdbHelper.getWritableDatabase();longiddb.insert(sensor_data,null,values);getContext().getContentResolver().notifyChange(uri,null);returnContentUris.withAppendedId(uri,id);}OverridepublicStringgetType(Uriuri){returnvnd.android.cursor.dir/vnd.example.sensors;}// 工控场景一般不提供删除和更新接口Overridepublicintdelete(Uriuri,Stringselection,String[]selectionArgs){return0;}Overridepublicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs){return0;}}监控 APP 作为数据消费方// 查询最新的传感器数据CursorcursorgetContentResolver().query(Uri.parse(content://com.example.collector.provider/sensors),newString[]{sensor_name,value,timestamp},null,null,timestamp DESC LIMIT 10);while(cursor.moveToNext()){Stringnamecursor.getString(0);floatvaluecursor.getFloat(1);Log.d(Monitor,name value);}cursor.close();5.3 ContentProvider 在工控中的价值优势说明安全可控可以精确控制哪些 APP 能访问、能做什么操作解耦架构数据采集和数据展示分离单 APP 崩溃不影响数据内容观察者ContentObserver 实现数据变化实时通知系统级支持Android 框架原生支持不依赖第三方库六、四大组件工控用途总结组件工控核心用途典型场景必要性Activity数据监控大屏、参数配置产线看板、设备参数设置页中无屏设备可不要Service后台常驻任务执行串口采集、Modbus 轮询、看门狗极高BroadcastReceiver系统事件感知开机自启、网络断连告警高ContentProvider多 APP 数据共享采集/监控/上报三 APP 数据互通中单 APP 可不用七、总结四大组件在工控开发中的分量和手机开发完全不同。手机开发以 Activity 为中心重在交互和体验工控开发以Service 为中心重在稳定和自动化。记住几个原则Service 用前台模式带通知栏常驻系统不敢随便杀你BroadcastReceiver 用静态注册不依赖 Activity 生命周期开机就能干活Activity 锁定全屏别让工人碰到状态栏和虚拟按键ContentProvider 在多 APP 场景才用不要为了用而用增加复杂度把这些组件吃透你在工控安卓开发这条路上就算正式入门了。

相关新闻

ADB 工具全套工控实战:设备连接、日志抓取、文件推送、权限调试、重启刷机指令

ADB 工具全套工控实战:设备连接、日志抓取、文件推送、权限调试、重启刷机指令

ADB 工具全套工控实战:设备连接、日志抓取、文件推送、权限调试、重启刷机指令adb 是工控开发者的瑞士军刀——不会玩 adb 的安卓工控开发,约等于不会用万用表的硬件工程师。今天咱们把 adb 从头到尾盘一遍,全是现场实战会用到的真东西。一、…

2026/10/15 11:39:18 阅读更多 →
EOL(End of Life 生命周期终止)(指官方停止对该版本的一切支持的时间,之后不再有任何更新或安全补丁)Active LTS、Maintenance LTS、停止维护、软件升级

EOL(End of Life 生命周期终止)(指官方停止对该版本的一切支持的时间,之后不再有任何更新或安全补丁)Active LTS、Maintenance LTS、停止维护、软件升级

runner stage 剥掉包管理器(deps/builder 阶段保留,那里要跑 npm ci / npm run build)base image node:20-alpine → node:24-alpine:Node 24 是当前 active LTS(2025-10-28 起,EOL 2028-04-30)…

2026/10/15 12:07:02 阅读更多 →
基于大数据技术的医辽数据分析与研究-spark+django231(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于大数据技术的医辽数据分析与研究-spark+django231(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于大数据技术的医辽数据分析与研究-sparkdjango231(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ python3.8sparkdjangospidermysql5.7vue 管理员层面,具备用户管理、医疗数据处理、数据分析、药物分析、病理分析以及数据预测等…

2026/10/15 12:07:03 阅读更多 →

最新新闻

Zynq裸机UART升级方案:无JTAG下的固件更新与BOOT.bin烧录

Zynq裸机UART升级方案:无JTAG下的固件更新与BOOT.bin烧录

简介:面向Zynq 7020开发板的裸机UART在线升级方案可运行源码,适合嵌入式开发者、FPGA工程师以及需要在Zynq平台实现固件远程升级的工程师参考。方案重点解决升级失败导致的板砖问题,完整覆盖Multiboot启动回退机制、升级标志位判定、CRC16数据…

2026/10/18 15:54:16 阅读更多 →
UDP组播通信实战:从原理到Python实现与避坑指南

UDP组播通信实战:从原理到Python实现与避坑指南

1. 从一个"发一份、收多份"的真实需求说起很多人第一次接触组播这个概念,是在做设备发现或者状态同步的时候。你手里有十几台设备,它们需要知道彼此的存在,或者某一台设备要同时给所有设备下发一条指令。最直觉的做法是维护一张IP列…

2026/10/18 15:54:16 阅读更多 →
Traefik v2.10+ 国内落地实战:HTTPS/QUIC/动态配置工程化指南

Traefik v2.10+ 国内落地实战:HTTPS/QUIC/动态配置工程化指南

简介:本资源是面向中国开发者的AI原生IDE——Trae CN的深度解析配套代码包,专为软件开发初学者、教育机构学员及中小企业技术团队设计,旨在帮助用户快速理解其架构逻辑、交互模式与工程集成方式。压缩包共3个文件(8KB)…

2026/10/18 15:54:16 阅读更多 →
QB64:现代Windows原生编译器,让QuickBASIC重获工程可用性

QB64:现代Windows原生编译器,让QuickBASIC重获工程可用性

简介:QB64是面向编程初学者、教育工作者及复古开发爱好者的现代化QuickBASIC实现,完美解决经典BASIC代码在现代系统中无法运行、缺乏图形音视频支持与跨平台能力等痛点。资源包共2000个文件,主体为C/C底层源码(如glew.c、freeglut…

2026/10/18 15:54:16 阅读更多 →
WPS连接Zotero:文献引用与参考文献自动生成全攻略

WPS连接Zotero:文献引用与参考文献自动生成全攻略

简介:这份资源面向需要在WPS中高效管理文献的学术写作者与论文作者,聚焦解决WPS与Zotero无法直接联动、引用插入繁琐的问题。包内共2个文件,以inscode与html为主要类型,分别承担配置脚本与说明页面的功能,压缩包整体约…

2026/10/18 15:54:16 阅读更多 →
AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南

AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南

AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南 2026年9月,开源AI视频生成模型已经形成完整梯队。本文横向对比5大可本地部署模型的核心参数、显存需求和实测速度,给出不同显卡的选型建议。文末附工作流模板和模型资源网盘链…

2026/10/18 15:53:16 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →