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

真正高维护、高效率


相关推荐
utf8mb4安全女神31 分钟前
MySQL5.7升级到MySQL8.0并进行数据迁移
android
黄林晴39 分钟前
Android XR DP4 重磅发布:手机 App 直投眼镜,Compose 原生玩转 3D 内容
android·google io
workbuddy小能手39 分钟前
腾讯云ADP Agent Portal vs 自建智能体:架构选型对比
架构·云计算·腾讯云
就改了1 小时前
微服务异步场景链路断裂完整解决方案
微服务·云原生·架构
沪漂阿龙2 小时前
《LangChain 系列》用 LangGraph 搭建智能客服 Agent
人工智能·架构·langchain
炼川淬海DB2 小时前
数据库开发规范
android·adb·数据库开发
by————组态2 小时前
Ricon组态技术架构 - 企业级Web组态解决方案
运维·服务器·前端·物联网·架构·组态·组态软件
微学AI2 小时前
递阶式智能体开发范式(HADP):从超级Agent到智能体应用的层级架构理论与工程实践
人工智能·架构·agent
老刘说AI2 小时前
类Sora模型:解锁动态视觉艺术的密码
人工智能·stable diffusion·架构·embedding
山东点狮信息科技有限公司3 小时前
点狮OA-企业级 OA 办公自动化系统架构设计与实践
spring cloud·微服务·性能优化·架构·系统架构