原生 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

真正高维护、高效率


相关推荐
KaMeidebaby5 分钟前
卡梅德生物技术快报|适配体筛选技术架构演进:SPARK-seq 高通量平台原理与技术流程解析
大数据·前端·其他·百度·架构·spark·新浪微博
qq_2518364578 分钟前
基于java 安卓-RSS阅读系统毕业论文
android·java·开发语言
heimeiyingwang15 分钟前
【架构实战】Jenkins+GitLab CI/CD:持续集成与持续部署实践
架构·gitlab·jenkins
blue_dou28 分钟前
2026主流CRM对比:工贸业财融合一体化选型解析
架构·逻辑回归·流程图
小新同学^O^37 分钟前
简单学习 --> Transformer架构
学习·架构·transformer
fengxin_rou39 分钟前
【Feed 高并发架构实战】:雪花 ID + 三级缓存 + 计数旁路设计详解
数据库·redis·缓存·架构·事务·并发
晓梦林10 小时前
cp520靶场学习笔记
android·笔记·学习
有味道的男人12 小时前
Open Claw对接1688平台
android·rxjava
_李小白13 小时前
【android opencv学习笔记】Day 17: 目标追踪(MeanShift)
android·opencv·学习
用户860225046747214 小时前
AI 分析头部APP系统优化框架
android