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

真正高维护、高效率


相关推荐
小羊子说12 小时前
Android ANR 原理浅析
android·性能优化·车载系统
Be for thing12 小时前
Android Studio 常用快捷键总结
android·学习
apollowing12 小时前
Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃
ui·架构
heimeiyingwang13 小时前
【架构实战】管道模式与责任链模式实战
架构
Vect__13 小时前
MySQL的数据类型和约束
android·数据库·mysql
前端不太难13 小时前
鸿蒙 App 架构升级:从页面到 System
架构·状态模式·harmonyos
ChoSeitaku13 小时前
5.MySQL表的约束|空属性|默认值|列描述|主键|自增长|唯一键|外键
android·数据库·mysql
Mr.456714 小时前
SpringBoot多模块依赖冲突排查与架构优化实战(避坑指南)
java·spring boot·架构
easy_coder14 小时前
ReAct 进入死循环?用 Harness 把它拉回来
人工智能·架构·云计算