浅谈Service

本文深入探讨Android Service的启动模式(startService和bindService),并结合实例展示了如何利用Service与BroadcastReceiver结合进行消息传递。通过具体代码演示,详细说明了Service的生命周期方法及实际应用。

接触Android有一段时间了,今天就来讲讲我对Service的理解吧(PS:有理解错误的希望大家说出来哦~~)

Service 作为四大组件之一,在每个应用程序中都起着重要的作用,一般是在后台处理一些耗时的逻辑,有时候我们要退出应用程序的时候,可以让Service 在后台继续运作。

关于Service 的用法,就是如何启动Service 。启动Service 有两种模式:startService和bindService

这两种模式又分别有不同的生命周期方法:

startService :启动模式的Service 需要调用Context的startService方法启动,并且可以调用context对象的stopService停止service ,当然,例如我们希望在service 内部停止service 可以调用stopService()。

bindService : Service的绑定模式相当于activity和service之间建立了一个长连接(ServiceConnection),在activity中可以借助此连接对象操作service中的方法。Service 的绑定模式要借助 context 的 bindService 实现绑定,借助 unBindService 解除绑定。

这里写图片描述
这里写图片描述

这个Demo是BroadcastReceiver与Service 相结合。

发广播

            Intent intent=new Intent("BroadcastRevices");
            String numberStr = number.getText().toString().trim();
            System.out.println("number:"+numberStr);
            intent.putExtra("name", numberStr);
            MainActivity.this.sendBroadcast(intent);

收到广播

public class BroadcastRevices extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("BroadcastRevices")){
            System.out.println("收到广播服务,启动Service");
            Intent mIntent=new Intent(MainActivity.instance,ServiceDemo.class);
            mIntent.putExtra("name", intent.getStringExtra("name"));
            context.startService(mIntent);
        }
    }
}

收到广播启动服务

private void senMessage(String number) {
        System.out.println("number:"+number);
        //启动service
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //创建消息栏
        Notification notification = new Notification.Builder(MainActivity.instance)
                .setTicker(number)
                .setContentText(number)
                .setContentTitle(number)
                .setSmallIcon(R.drawable.ic_launcher)
                .build();
        Intent intent=new Intent(this,SecondActivity.class);
        intent.putExtra("number",number );
        //消息栏的焦点,PendingIntent.FLAG_UPDATE_CURRENT覆盖前一条信息的内容
        notification.contentIntent=PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //启动notification
        manager.notify(R.drawable.ic_launcher, notification);
    }

服务启动发消息

public int onStartCommand(Intent intent, int flags, int startId) {
        //传值
        String number = intent.getStringExtra("name");
        System.out.println("服务已启动开始发送消息通知:"+number);
        senMessage(number);
        return super.onStartCommand(intent, flags, startId);
    }
### MQTT协议介绍 MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的消息传输协议,设计用于低带宽、高延迟或不可靠的网络环境。由于其高效、简单和可靠性,MQTT在多种应用场景中得到了广泛的应用[^1]。该协议工作在TCP/IP协议族之上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议[^4]。 #### 协议特点 - **轻量级**:MQTT 的协议开销小,适用于资源受限的设备,如传感器、物联网设备等。 - **灵活和可扩展**:支持多种传输层协议,如 TCP/IP、WebSocket 等。它还提供了 QoS(Quality of Service)级别,以确保消息的可靠传输。 - **异步通信**:使用发布/订阅模型,发布者和订阅者之间不需要直接通信,使得系统的解耦更容易。 - **处理低带宽和高延迟网络**:可以在网络连接不稳定或带宽有限的环境中可靠地传输数据[^3]。 #### 工作原理 MQTT 使用发布/订阅模型进行消息传递。在这个模型中,消息的发送方(发布者)不会将消息直接发送给接收方(订阅者),而是将消息发布到一个主题(Topic)。订阅了该主题的客户端会自动接收到消息。这种机制允许发布者和订阅者之间的解耦[^2]。 --- ### MQTT协议的应用场景 MQTT 的特性使其非常适合以下应用场景: #### 1. 智能家居 在智能家居领域,MQTT 可以用于控制和监控家庭中的各种智能设备,例如灯光、温度控制器、安防系统等。通过 MQTT,用户可以远程控制这些设备并接收实时状态更新[^2]。 #### 2. 工业物联网(IIoT) 工业物联网中,设备通常分布在广阔的地理区域,并且需要在恶劣的网络条件下工作。MQTT 的低带宽需求和可靠性使其成为工业设备监控和管理的理想选择[^1]。 #### 3. 车联网 车联网需要在车辆之间以及车辆与基础设施之间进行高效的数据交换。MQTT 的实时性和可靠性使得它非常适合用于车辆位置跟踪、路况信息共享等应用[^2]。 #### 4. 环境监测 环境监测系统通常需要收集来自多个传感器的数据。MQTT 的轻量级特性和对低带宽的支持使其非常适合用于空气污染监测、水质检测等场景[^1]。 #### 5. 医疗健康 在医疗健康领域,MQTT 可以用于远程监控患者的健康状况。例如,通过 MQTT,医生可以实时接收来自患者佩戴的健康监测设备的数据[^2]。 #### 6. 物流与供应链 物流和供应链管理需要实时跟踪货物的位置和状态。MQTT 的高效消息传递能力可以帮助企业实现这一目标[^1]。 #### 7. 智能能源 智能电网中的设备需要相互通信以优化能源分配和使用。MQTT 的可靠性使其成为智能电网通信的理想选择。 #### 8. 公共安全 公共安全系统需要在紧急情况下快速传递信息。MQTT 的实时性和可靠性使其适合用于警报系统、应急响应协调等场景[^1]。 --- ```python # 示例代码:使用 Paho-MQTT 库实现简单的发布者和订阅者 import paho.mqtt.client as mqtt # 定义回调函数 def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("test/topic") def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) # 创建客户端实例 client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message # 连接到 broker client.connect("broker.hivemq.com", 1883, 60) # 阻塞式循环 client.loop_forever() ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值