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,并且避免了内存泄漏问题

相关文章
|
7月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1393 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1006 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1106 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
8月前
|
开发工具 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)-优雅草卓伊凡
875 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
7月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
377 0
|
8月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
1136 6
|
10月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
434 0
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
703 1
|
编解码 Android开发 iOS开发
安卓与iOS开发:平台差异下的技术创新之路
在数字时代的浪潮中,移动应用开发如同两股潮流——安卓与iOS,各自携带着独特的技术生态和文化基因。本文将深入探讨这两大平台的开发环境、编程语言和工具的差异,以及它们如何塑造了不同的用户体验和技术趋势。通过比较分析,我们旨在揭示跨平台开发的可能性和挑战,同时探索未来技术创新的方向。让我们一起跟随代码的足迹,穿越安卓的开放草原和iOS的精密园林,发现那些隐藏在平台差异之下的创新机遇。
250 28
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
337 5

热门文章

最新文章