Android 开发中实现数据传递:广播和Handler

简介: Android 开发中实现数据传递:广播和Handler

在 Android 开发中,我们经常需要在不同的 Java 文件(如类或活动)之间传递数据。本文将介绍两种主要的数据传递方式:广播(Broadcast)和 Handler。我将以我开发的一个实例为例,展示如何在 TcpServer(Tcp服务器工具类)和 SerialPortActivity(主线程活动)之间进行数据传递。

使用广播

在 TcpServer 中,当需要将数据传递给 SerialPortActivity 时,可以发送一条广播。SerialPortActivity 接收到该广播后即可处理数据。

在 TcpServer 中发送广播的代码如下:

// 发送广播
Intent intent = new Intent("com.example.ACTION_TCP_DATA");
intent.putExtra("data", tcpData);
sendBroadcast(intent);

在 SerialPortActivity 中注册广播接收器:

// 注册广播接收器
private void registerReceiver() {
    IntentFilter filter = new IntentFilter("com.example.ACTION_TCP_DATA");
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("com.example.ACTION_TCP_DATA")) {
                String tcpData = intent.getStringExtra("data");
                // 在此处处理tcpData
            }
        }
    };
    registerReceiver(receiver, filter);
}

使用 Handler

另一种方式是在 SerialPortActivity 中创建一个 Handler 对象,并将其传递给 TcpServer。在 TcpServer 中发送数据时,使用该 Handler 对象发送消息,然后在 SerialPortActivity 中通过覆写该 Handler 的 handleMessage() 方法来处理消息。

在 SerialPortActivity 中创建 Handler 对象:

private Handler mHandler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case MSG_TCP_DATA:
                String tcpData = (String) msg.obj;
                // 在此处处理tcpData
                break;
            default:
                super.handleMessage(msg);
                break;
        }
    }
};

在 TcpServer 中发送消息给 SerialPortActivity:

// 发送消息
Message message = Message.obtain();
message.what = MSG_TCP_DATA;
message.obj = tcpData;
mHandler.sendMessage(message);

选择广播还是 Handler 主要取决于具体需求。如果数据需要被多个组件(如其他活动或服务)共享,那么广播可能是更好的选择。如果只有一个组件需要处理数据,使用 Handler 会更加简单直接。

就性能而言,Handler 更高效。广播需要进行广播注册、解注册等操作,并且可以被多个组件接收,因此一旦有新的广播到来,系统需要遍历所有已注册的接收器,并且复制 Intent 的内容,然后将广播传递给所有接收器。这些操作会占用相当大的系统资源,导致性能下降。相比之下,Handler 基于消息队列实现,不需要注册和注销过程,也不需要拷贝 Intent,只需往消息队列中添加消息。接收到消息后,Handler 会直接调用主线程的 Looper.loop() 方法,将消息分发给对应的处理方法。

// 发送消息
Message message = Message.obtain();
message.what = SerialPortActivity.MSG_TCP_DATA;
message.obj = tcpData;
mHandler.sendMessage(message);

如果只在单个组件中传递数据,建议使用 Handler;如果需要多个组件共享数据,则可以考虑使用广播。

定义一个名为 MSG_TCP_DATA 的 int 常量,可以在 SerialPortActivity 中进行定义,例如:

public static final int MSG_TCP_DATA = 1;

在 TcpServer 中就可以直接引用该常量了,例如:

需要注意的是,在 TcpServer 中需要获取 SerialPortActivity 的 Handler 对象才能调用 sendMessage() 方法。为避免内存泄漏,建议使用弱引用(WeakReference)来保存 Handler 对象的引用。以下是一个示例实现:

public class TcpServer {
    private WeakReference<Handler> mHandlerRef;
 
    public void setHandler(Handler handler) {
        mHandlerRef = new WeakReference<>(handler);
    }
 
    // 在需要发送数据时调用此方法
    public void sendData(String data) {
        if (mHandlerRef != null && mHandlerRef.get() != null) {
            Handler handler = mHandlerRef.get();
            Message message = handler.obtainMessage(SerialPortActivity.MSG_TCP_DATA, data);
            handler.sendMessage(message);
        }
    }
}

在 SerialPortActivity 中,通过 setHandler() 方法将 Handler 对象传递给 TcpServer:

TcpServer tcpServer = new TcpServer();
tcpServer.setHandler(mHandler);

这样就可以在 TcpServer 中使用 SerialPortActivity 定义的常量 MSG_TCP_DATA,并且避免了内存泄漏问题

相关文章
|
6月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
836 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
311 0
|
6月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1048 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
995 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
764 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
7月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
842 6
|
9月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
370 0
|
消息中间件 存储 机器学习/深度学习
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(二)
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(二)
277 0
|
消息中间件 存储 调度
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(一)
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(一)
304 0

热门文章

最新文章