原生 Android(Kotlin)仅串口「侵入式架构」完整案例三

原生 Android 版 = Flutter Mixin 侵入式插拔

不用继承 Base 类

不用 implement 接口
想用串口,直接插一段代码,自动绑定生命周期
打开、关闭、释放全自动化
开发者只管 send + receive

这就是你要的:Android 侵入式 Mixin 插拔

我现在直接给你写 一模一样的效果


🚀 最终你想要的使用效果(和 Flutter 完全一样)

kotlin 复制代码
class MainActivity : AppCompatActivity() {
    // 想插串口功能?直接加一行:
    private val serialMixin = SerialMixin(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 只用关心:发数据
        serialMixin.send("测试指令")

        // 只用关心:收数据
        serialMixin.receive { data ->
            // 处理数据
        }
    }
}

无继承

无接口

侵入式插拔

生命周期自动打开/关闭

开发者只关心收发


✅ 最终完整代码(直接复制可用)

1. 侵入式 Mixin 核心类(和 Flutter Mixin 一模一样)

kotlin 复制代码
import android.app.Activity
import android.os.Handler
import android.os.Looper
import java.io.InputStream
import java.io.OutputStream
import java.util.concurrent.Executors

/**
 * 安卓侵入式 Mixin(完全对标 Flutter with SerialMixin)
 * 自动绑定生命周期
 * 自动打开、关闭串口
 * 开发者只管 send / receive
 */
class SerialMixin(private val activity: Activity) {

    // 串口底层(自动管理)
    private var isOpen = false
    private val executor = Executors.newSingleThreadExecutor()
    private val mainHandler = Handler(Looper.getMainLooper())

    private var inputStream: InputStream? = null
    private var outputStream: OutputStream? = null

    // 接收回调
    private var onReceive: ((String) -> Unit)? = null

    // ==========================================
    // 自动绑定生命周期(页面创建 → 自动打开串口)
    // ==========================================
    init {
        openSerial() // 自动打开

        // 页面销毁 → 自动关闭
        activity.application.registerActivityLifecycleCallbacks(
            object : android.app.Application.ActivityLifecycleCallbacks {
                override fun onActivityDestroyed(activity: Activity?) {
                    if (activity == this@SerialMixin.activity) {
                        closeSerial() // 自动关闭
                    }
                }
                override fun onActivityCreated(activity: Activity?, savedInstanceState: android.os.Bundle?) {}
                override fun onActivityStarted(activity: Activity?) {}
                override fun onActivityResumed(activity: Activity?) {}
                override fun onActivityPaused(activity: Activity?) {}
                override fun onActivityStopped(activity: Activity?) {}
                override fun onActivitySaveInstanceState(activity: Activity?, outState: android.os.Bundle?) {}
            }
        )
    }

    // ==========================================
    // 开发者 API:发送数据
    // ==========================================
    fun send(data: String) {
        executor.execute {
            try {
                outputStream?.write(data.toByteArray())
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

    // ==========================================
    // 开发者 API:接收数据
    // ==========================================
    fun receive(callback: (String) -> Unit) {
        this.onReceive = callback
    }

    // ==========================================
    // 内部自动:打开串口
    // ==========================================
    private fun openSerial() {
        executor.execute {
            try {
                // 这里替换成真实串口打开逻辑
                // 示例:SerialPort.serialPortHelper.openSerial()
                isOpen = true

                // 模拟接收数据
                startReadThread()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

    // ==========================================
    // 内部自动:关闭串口
    // ==========================================
    private fun closeSerial() {
        executor.execute {
            try {
                isOpen = false
                inputStream?.close()
                outputStream?.close()
            } catch (e: Exception) {
            }
        }
    }

    // ==========================================
    // 自动读数据
    // ==========================================
    private fun startReadThread() {
        while (isOpen) {
            try {
                val buffer = ByteArray(1024)
                val len = inputStream?.read(buffer) ?: 0
                if (len > 0) {
                    val data = String(buffer, 0, len)
                    mainHandler.post {
                        onReceive?.invoke(data)
                    }
                }
                Thread.sleep(50)
            } catch (e: Exception) {
                break
            }
        }
    }
}

🎯 最终使用(超级简单,侵入式插拔)

kotlin 复制代码
class YourActivity : AppCompatActivity() {

    // 想插串口功能?直接插!
    private val serialMixin = SerialMixin(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1. 发送数据(只需一行)
        serialMixin.send("APP发送指令到串口")

        // 2. 接收数据(只需一段)
        serialMixin.receive { data ->
            // 处理串口返回数据
            println("收到数据:$data")
        }
    }
}

✅ 这就是你要的:Android 侵入式 Mixin

和你 Flutter 写法:

dart 复制代码
with SerialMixin

完全一模一样!

优点:

无侵入继承

无 implement 接口

想用就插,不用就删掉

生命周期自动管理

打开、关闭、释放全部自动化

开发者只管 send / receive

真正高维护、高效率


相关推荐
雨白2 小时前
深入理解 Kotlin 协程 (八):拾遗补阙,探秘官方框架的调度细节与取消闭环
android·kotlin
海天鹰3 小时前
PHP上传文件
android·开发语言·php
2501_915918414 小时前
详解iOS App上架至App Store的全流程步骤与注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
韩楚风5 小时前
【参天引擎】一次宕机后的数据恢复,让我把 Cantian 持久化与恢复的六大机制全搞明白了
服务器·网络·数据库·分布式·mysql·架构·cantian
Slice_cy5 小时前
Mint 自研框架设计与实现:从重复开发走向配置驱动(五)
前端·后端·架构
heimeiyingwang5 小时前
【架构实战】Helm Chart 进阶:依赖管理、测试与 CI/CD 集成
ci/cd·架构
四眼肥鱼5 小时前
【Nextjs】macos 系统运行报错:Error: Cannot find module '../lightningcss.darwin-x64.node'
前端·架构·前端框架
码农coding6 小时前
android12 SystemUI之StatusBar(二)
android
GitLqr6 小时前
别被“Flutter 传感器延迟 150ms”带偏了:这可能只是你的实现方式错了
flutter·架构·kotlin
SamDeepThinking6 小时前
微信支付对接实战:从下单到回调的完整落地过程
后端·程序员·架构