Android实例] Service和广播联合更新UI的例子

Android与嵌入式设备USB串口通信实战:DS18B20温度监测系统开发 物联网应用的核心在于实现物理世界数据到智能终端的稳定传输。其基本原理是通过传感器采集环境信息,经由微控制器处理后,通过可靠的通信协议发送至应用层进行展示与分析。在众多连接方式中,USB串口通信以其高稳定性、低延迟和无需外部网络的特性,在设备直连场景中展现出独特的技术价值,尤其适用于工业控制、环境监测等对实时性与可靠性要求较高的领域。本文聚焦于构建一个端到端的温度监测系统,详细阐述了如何利用Seeeduino XIAO嵌入式开发板驱动DS18B20数字温度传感器,并通过USB CDC虚拟串口与Android应 阅读详情
在Android中,异步更新UI,通常我们会选用Handler启动线程,或者sendMessage的方式,那么利用Service和广播也可以更新UI的,例子如下:
我们建立一个Service:
package com.andy
import android.app.Service;//引入相关包
import android.content.BroadcastReceiver;//引入相关包
import android.content.Context;//引入相关包
import android.content.Intent;//引入相关包
import android.content.IntentFilter;//引入相关包
import android.os.IBinder;//引入相关包
//继承自Service的子类
public class MyService extends Service{
        CommandReceiver cmdReceiver;
        boolean flag;
        @Override
        public void onCreate() {//重写onCreate方法
                flag = true;
                cmdReceiver = new CommandReceiver();
                super.onCreate();
        }
        @Override
        public IBinder onBind(Intent intent) {//重写onBind方法
                // TODO Auto-generated method stub
                return null;
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {//重写onStartCommand方法
                IntentFilter filter = new IntentFilter();//创建IntentFilter对象
                filter.addAction("wyf.wpf.MyService");
                registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver
                doJob();//调用方法启动线程
                return super.onStartCommand(intent, flags, startId);
        }
        //方法:
        public void doJob(){
                new Thread(){
                        public void run(){
                                while(flag){
                                        try{//睡眠一段时间
                                                Thread.sleep(1000);
                                        }
                                        catch(Exception e){
                                                e.printStackTrace();
                                        }
                                        Intent intent = new Intent();//创建Intent对象
                                        intent.setAction("wyf.wpf.Sample_3_6");
                                        intent.putExtra("data", Math.random());
                                        sendBroadcast(intent);//发送广播
                                }                               
                        }
                       
                }.start();
        }       
        private class CommandReceiver extends BroadcastReceiver{//继承自BroadcastReceiver的子类
                @Override
                public void onReceive(Context context, Intent intent) {//重写onReceive方法
                        int cmd = intent.getIntExtra("cmd", -1);//获取Extra信息
                        if(cmd == Sample_3_6.CMD_STOP_SERVICE){//如果发来的消息是停止服务                               
                                flag = false;//停止线程
                                stopSelf();//停止服务
                        }
                }               
        }
        @Override
        public void onDestroy() {//重写onDestroy方法
                this.unregisterReceiver(cmdReceiver);//取消注册的CommandReceiver
                super.onDestroy();
        }       
}

建立一个activity

package com.andy;//声明包语句
import android.app.Activity;//引入相关包
import android.content.BroadcastReceiver;//引入相关包
import android.content.Context;//引入相关包
import android.content.Intent;//引入相关包
import android.content.IntentFilter;//引入相关包
import android.os.Bundle;//引入相关包
import android.view.View;//引入相关包
import android.view.View.OnClickListener;//引入相关包
import android.widget.Button;//引入相关包
import android.widget.TextView;//引入相关包
//继承自Activity的子类
public class Sample_3_6 extends Activity {
        public static final int CMD_STOP_SERVICE = 0;
        Button btnStart;//开始服务Button对象应用
        Button btnStop;//停止服务Button对象应用
        TextView tv;//TextView对象应用
        DataReceiver dataReceiver;//BroadcastReceiver对象
        @Override
    public void onCreate(Bundle savedInstanceState) {//重写onCreate方法
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);//设置显示的屏幕
        btnStart = (Button)findViewById(R.id.btnStart);
        btnStop = (Button)findViewById(R.id.btnStop);
        tv = (TextView)findViewById(R.id.tv);
        btnStart.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听               
                        @Override
                        public void onClick(View v) {//重写onClick方法
                                Intent myIntent = new Intent(Sample_3_6.this, wyf.wpf.MyService.class);
                                Sample_3_6.this.startService(myIntent);//发送Intent启动Service
                        }
                });
        btnStop.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听       
                        @Override
                        public void onClick(View v) {//重写onClick方法
                                Intent myIntent = new Intent();//创建Intent对象
                                myIntent.setAction("wyf.wpf.MyService");
                                myIntent.putExtra("cmd", CMD_STOP_SERVICE);
                                sendBroadcast(myIntent);//发送广播
                        }
                });
    }       
        private class DataReceiver extends BroadcastReceiver{//继承自BroadcastReceiver的子类
                @Override
                public void onReceive(Context context, Intent intent) {//重写onReceive方法
                        double data = intent.getDoubleExtra("data", 0);
                        tv.setText("Service的数据为:"+data);                       
                }               
        }
        @Override
        protected void onStart() {//重写onStart方法
                dataReceiver = new DataReceiver();
                IntentFilter filter = new IntentFilter();//创建IntentFilter对象
                filter.addAction("wyf.wpf.Sample_3_6");
                registerReceiver(dataReceiver, filter);//注册Broadcast Receiver
                super.onStart();
        }
        @Override
        protected void onStop() {//重写onStop方法
                unregisterReceiver(dataReceiver);//取消注册Broadcast Receiver
                super.onStop();
        }
}
拼多多Android面试题及参考答案 Android 系统采用分层架构设计,从底层到上层依次为Linux 内核层硬件抽象层(HAL)系统运行时库层应用框架层应用层,共五层。位置:Linux 内核层与系统运行时库层之间,是“硬件与系统的隔离层”。核心作用:屏蔽硬件差异,为上层提供统一的硬件访问接口,解决 Android 开源与硬件厂商闭源的矛盾,具体功能如下:硬件能力抽象:将硬件的具体实现(如不同厂商的摄像头芯片、音频芯片)封装为标准化接口(如Camera HALAudio HAL。 阅读详情

相关推荐

通过service发送广播通知activity修改UI的内容

通过service发送广播通知activity修改UI的内容,源代码,希望对你有所帮助

android广播案例,Android 广播介绍与service一起使用案例

packagecom.example.rfidlibrary;importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandroid.content.ServiceConnection;importandroid.os.IBinder;importand...

weixin_42353186的博客 201

java实现自动发送微信QQ消息(可发图片)

自动发送微信/QQ/微博等消息 一:功能:实现发送QQ/微信/微博消息,程序控制。 效果演示(实现自动发生QQ微信消息给女友,发微博信息也可以就不演示了) 二:原理讲解:将剪贴板的内容给发送到QQ微信中去,复制粘贴发送。 模拟真实操作进行发送信息。 三:前期准备,软件安装,及初步测试。...

XURUNFA950827的博客 1万+

Android广播及其实例

广播机制简介 在Android中,广播主要分为两种,标准广播和有序广播。注意:标准广播是一种完全异步执行的广播,发出的广播无法拦截;有序广播是一种同步执行的广播,在广播发出后,同一时刻只有一个广播接收器能接收到广播,而且该广播可以被当前广播接收器进行拦截,以阻止其继续发送下去。 1.接收系统广播之动态注册监听网络变化。

TopWilling的博客 1378

Mac本地大模型实战指南:Ollama+Metal+Apple Silicon深度优化

大语言模型(LLM)本地化部署正成为开发者关键技术能力,其核心在于推理效率、硬件适配与成本控制。Apple Silicon凭借统一内存架构(UMA)和Neural Engine,为本地LLM运行提供了独特优势;Metal加速则显著提升GPU计算吞吐,使Gemma 4、Qwen 3.5等模型在M系列Mac上实现低延迟、高精度、离线可用的工程落地。相比云端API,本地方案规避了token计费、网络依赖与数据外泄风险,特别适用于企业文档处理、实时语音分析、私有知识库检索等强隐私、低时延场景。本文聚焦Mac平台,系

weixin_33443333的博客 351

Macbook Pro上如何修改brew源

一、需求说明 我的macbook电脑安装了中科大的brew源码,发现安装gpg工具失败,其他工具可以正常安装,为了能将gpg安装成功,就找了找切换brew源的方案,记录如下。 二、切换至国内源 由于使用github默认源有可能存在路径远或者部分服务访问超时的原因,切换至国内源可以提速。 2.1 替换brew.git $ cd "$(brew --repo)" # 中国科大: $ git remote set-url origin https://mirrors.ustc.edu.cn/brew.git #

bufegar0的博客 1078

Service和广播联合更新UI的例子

在Android中,异步更新UI,通常我们会选用Handler启动线程,或者sendMessage的方式,那么利用Service和广播也可以更新UI的,例子如下: 我们建立一个Service: package com.andy import android.app.Service;//引入相关包 import android.content.BroadcastReceiver;//引入相关

dengcun的专栏 594

DEMATEL-ISM模型的Python实现——方法介绍以及代码复现

本文参考文献与网络资料,对DEMATEL-ISM方法做了介绍何步骤描述,并给出Python代码进行了计算和绘图。

cros1的博客 2万+

Service通过广播Broadcast更新Activity UI

原文地址::http://www.pocketdigi.com/20110303/197.html       今天学习到Service,在用Service下载文件时,一个问题就是Service没有界面,如何通知用户当前下载的进度,Service直接向Activity传数据有点麻烦,于是想到了用Broadcast,Service广播,Activity负责接收,再对接收到的数据进行处理,就达

xqhrs232的专栏 1451

Python+Tableau 全流程数据分析实战:从数据清洗到商业洞察可视化

本文通过Python+Tableau完整演示电商销售数据分析流程。首先使用Python进行数据清洗(缺失值处理、异常值过滤等)和探索性分析(商品类别、时间趋势等),然后导入Tableau创建交互式可视化仪表盘。分析发现电子产品销售额最高但利润率低,美妆类利润率最优,东部地区销售表现最好。最终提出优化供应链、加强美妆推广等商业建议,展示了Python数据处理与Tableau可视化的高效配合。所有代码可直接运行,适合数据分析初学者和从业者实战参考。

weixin_44520581的博客 337

使用Python爬虫获取Facebook帖子和评论数据

Web爬虫是用于自动抓取网页数据的程序。它通过发送HTTP请求,获取网页的HTML源代码,再对源代码进行解析,提取所需的内容。爬虫常用于数据收集、信息提取、数据分析等应用。

2201_76125261的博客 1998

[Android实例] Service和广播联合更新UI的例子

原文地址:Service和广播联合更新UI的例子">[Android实例] Service和广播联合更新UI的例子作者:上官飞儿     在Android中,异步更新UI,通常我们会选用Handler启动线程,或者sendMessage的方式,那么利用Service和广播也可以更新UI的,例子如下: 我们建立一个Service: package com.andy import andro

fobdddf的专栏 821

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分析。Impedance是时域阻抗曲线,也是最主要的观测指标,注意:impedance曲线的时间刻度不是延时,延时=时间刻度/2,因为TDR测量的是用一来一回的原理去测量的。Use Lossy peeling 默认不勾选,勾选的话代表同时仿真无损和有损方案,不勾选代表仅仿真有损方案。

weixin_54787054的博客 855

[Android] Service和广播联合更新UI

package com.roy import android.app.Service;//引入相关包 import android.content.BroadcastReceiver;//引入相关包 import android.content.Context;//引入相关包 import android.content.Intent;//引入相关包 import android.content.

Roy,Song@优快云 6571

一网打尽身份验证与授权:深入剖析ASP.NET Core Identity在C#中的全方位实战应用

ASP.NET Core Identity 是 Microsoft 提供的一个强大且可扩展的身份验证和授权框架,用于构建基于用户账户、角色和权限的Web应用程序。它提供了用户注册、登录、密码管理、多因素认证、角色分配、授权等功能,与ASP.NET Core框架深度集成,简化了安全相关的开发工作。通过上述代码示例和注释,展示了如何安装配置Identity、自定义用户实体与数据库上下文、实现用户注册登录、管理角色与用户角色关系,以及如何使用授权策略保护应用程序资源。,并指定用户和角色类型以及主键类型。

java专栏 1526

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Service联合Broadcase更新UI

在Android中,异步更新UI,通常我们会选用Handler启动线程,或者sendMessage的方式,那么利用Service和广播也可以更新UI的,例子如下: 我们建立一个Service: package com.andy import android.app.Service;//引入相关包 import android.content.BroadcastReceiver;//引入

djun100的专栏 851

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

使用Service+BroadcastReceiver实现定时更新天气

一、前言 最近两个月在做毕业设计:天气app,需要用到定时更新天气数据,用的是Service+BroadcastReceiver方法(之前对服务和广播也不是很了解,所以恶补了一下)。关于这个方法我借鉴了另一篇网络文章点击打开链接。 二、情景描述     2.1 HomeActivity(app启动页,城市天气显示界面) CityActivity(城市列表界面,跟墨迹天气,天气通一样,就是你

功能测试小白—魅靥 1222

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Drozer安卓安全评估框架:从环境搭建到实战漏洞挖掘

在移动应用安全领域,Android应用的安全评估是保障用户数据和隐私的关键环节。其核心原理在于通过动态分析技术,模拟攻击者视角,深入应用内部上下文进行渗透测试,以发现静态分析难以触及的漏洞。这项技术的核心价值在于能够有效识别权限滥用、数据泄露和组件暴露等高风险安全问题,广泛应用于移动应用安全审计、开发者自测和合规性检查等场景。本文聚焦于业界广泛使用的Drozer框架,这是一个功能强大的Android安全评估工具,它通过安装代理应用(Agent)并与控制台(Console)交互,实现对四大组件(Activit

weixin_33735077的博客 330

Android 15 适配整理——实践版

Android 15适配

wzj_what_why_how的博客 1万+

Android(1)--Application和Activity

一.Android应用程序类型:(1)前台应用程序--需要考虑Activity的生命周期只能运行在前台的应用,当他不可见时就会被挂起,例如:游戏应用;(2)后台应用程序--Service 和 BroadcastReceiver是后台应用程序的驱动者交互非常有限的一个应用,除非在配置期间,的其他生命期间都是隐藏的,例如:闹钟;(3)间歇性应用程序...

weixin_34345560的博客 161
上一篇: android Setting
下一篇: 1、屏幕相关概念
freemindhack
博客等级 码龄13年 53粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值