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

✔ 真正高维护、高效率


相关推荐
say_fall37 分钟前
【AI大模型】MCP 模型上下文协议:客户端-服务器架构、JSON-RPC 消息与能力协商、工具发现与调用链路、与函数调用的分工
服务器·人工智能·架构
Decay__2 小时前
14_MySQL 高可用与容灾架构 —— MGR / InnoDB Cluster / Keepalived+VIP / 双主 / 读写分离 / 两地三中心
运维·数据库·sql·mysql·架构
猿人谷2 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
疯华整猫2 小时前
混淆起初根本不是为了防破解:我用 Trae 把 Android 混淆这二十来年重跑了一遍
android·人工智能·计算机视觉
Kari112 小时前
企业级智能体平台怎么选:腾讯云ADP与其他主流技术路线的架构对比
架构·云计算·腾讯云
Carson带你学Android3 小时前
AI时代,你的 App 会被 Agent 这三种方式调用
android·ai编程
泯泷3 小时前
AI时代,中层还要替公司传多少次话?
人工智能·架构
Dawson Zhu3 小时前
【LLM推理与Serving⑧】多机多卡Serving:TP/PP/负载均衡与弹性扩缩容全攻略
人工智能·语言模型·架构·aigc·agi
恋猫de小郭4 小时前
Flutter 下 AOT 一个你怎么都想不出来的 Bug ,JIT 正常的计算,在 AOT 居然算错了
android·前端·flutter
Bode_20025 小时前
大语言模型与运筹规划双闭环共生(LLM-OR):体系架构、理论机理与落地实践
人工智能·语言模型·架构