# 能力层 SDK 使用说明（单例模式）

## 📋 为什么用单例？

- 连接/服务是全局唯一的（BLE、Socket.IO、推送等）
- 多个界面需要共享同一个连接状态
- 避免重复连接、浪费资源

## 🎯 推荐使用方式（本项目）

### 方式1：直接获取单例（最简单，推荐）

所有能力层都使用 `getInstance()` 获取单例：

```kotlin
// BLE服务（第一次调用需要context，后续不需要）
val bleService = BLEServiceImpl.getInstance(this)  // 或 getInstance(context)

// Socket.IO服务（不需要context）
val socketService = SocketIOServiceImpl.getInstance()

// 推送服务（不需要context，但initialize方法需要）
val pushService = PushServiceImpl.getInstance()

// 二维码服务（不需要context，但scanQRCode方法需要Activity）
val qrCodeService = QRCodeServiceImpl.getInstance()

// 分享服务（不需要context，但share方法需要Activity）
val shareService = ShareServiceImpl.getInstance()

// NFC服务（不需要context，但initialize方法需要Activity）
val nfcService = NFCServiceImpl.getInstance()
```

**说明**：
- BLE服务：第一次调用`getInstance(context)`时需要context（用于获取BluetoothManager），后续调用可以不带context
- 其他服务：`getInstance()`不需要context，但具体方法（如initialize、scanQRCode等）可能需要Activity

### 方式2：依赖注入（如果项目用了Dagger/Hilt）

```kotlin
@Module
@InstallIn(SingletonComponent::class)
object CapabilityModule {
    @Provides @Singleton
    fun provideBLEService(@ApplicationContext context: Context) = BLEServiceImpl.getInstance(context)
    
    @Provides @Singleton
    fun provideSocketIOService() = SocketIOServiceImpl.getInstance()
    
    @Provides @Singleton
    fun providePushService() = PushServiceImpl.getInstance()
}

// 在Activity中注入
@Inject lateinit var bleService: BLEService
@Inject lateinit var socketService: SocketIOService
```

## 📝 各能力层使用示例

### 1. BLE服务（capability-ble）

```kotlin
class VehicleControlActivity : AppCompatActivity() {
    private val bleService = BLEServiceImpl.getInstance(this)
    
    fun connectDevice(device: BLEDevice) {
        // 统一使用lambda回调
        bleService.connect(device) { response ->
            if (response.success) {
                // 连接成功
            } else {
                // 连接失败
                val error = response.errorMessage
            }
        }
    }
    
    fun lockCar() {
        bleService.sendAppControlCommand(
            AppControlInstruction.SET_DEFENSE,
            byteArrayOf(0x01)
        ) { response ->
            if (response.success) {
                // 设防成功
                val data = response.data  // ByteArray?
            } else {
                // 设防失败
                val error = response.errorMessage
            }
        }
    }
}
```

### 2. Socket.IO服务（capability-socketio）

```kotlin
class MessageActivity : AppCompatActivity() {
    private val socketService = SocketIOServiceImpl.getInstance()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // 初始化并连接
        socketService.init("ws://server.com", token)
        socketService.connect()
        
        // 监听消息
        socketService.on("message") { response ->
            // 处理消息
        }
        
        // 发送消息
        socketService.emit("send_message", data)
    }
}
```

### 3. 推送服务（capability-push）

```kotlin
class MainActivity : AppCompatActivity() {
    private val pushService = PushServiceImpl.getInstance()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // 初始化
        pushService.initialize(this)
        
        // 设置别名
        pushService.setAlias(userId)
        
        // 监听推送消息
        pushService.setMessageListener { message ->
            // 处理推送消息
        }
        
        // 注册推送
        pushService.register()
    }
}
```

### 4. 二维码服务（capability-qrcode）

```kotlin
class ScanActivity : AppCompatActivity() {
    private val qrCodeService = QRCodeServiceImpl.getInstance()
    
    fun scanQRCode() {
        qrCodeService.scanQRCode(this) { response ->
            if (response.success) {
                // 处理扫码结果（统一使用data字段）
                val content = response.data  // String?（二维码内容）
            } else {
                // 扫码失败
                val error = response.errorMessage
            }
        }
    }
    
    fun generateQRCode(content: String): Bitmap? {
        return qrCodeService.generateQRCode(content, 300)
    }
}
```

### 5. 分享服务（capability-share）

```kotlin
class ShareActivity : AppCompatActivity() {
    private val shareService = ShareServiceImpl.getInstance()
    
    fun shareToWeChat() {
        val content = ShareContent(
            title = "标题",
            description = "内容",
            imageUrl = "https://...",
            url = "https://..."
        )
        
        shareService.shareToWeChat(this, content) { response ->
            if (response.success) {
                // 分享成功（统一使用data字段）
                val platform = response.data  // SharePlatform?
            } else {
                // 分享失败
                val error = response.errorMessage
            }
        }
    }
}
```

### 6. NFC服务（capability-nfc）

```kotlin
class NFCActivity : AppCompatActivity() {
    private val nfcService = NFCServiceImpl.getInstance()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // 初始化（需要Activity）
        nfcService.initialize(this)
        
        // 检查NFC支持
        if (nfcService.isNFCSupported()) {
            // 读取NFC标签
            nfcService.readTag { response ->
                if (response.success) {
                    // 处理NFC数据
                }
            }
        }
    }
}
```

## ✅ 使用要点

1. **所有界面获取的都是同一个实例**
   ```kotlin
   // 界面1
   val service1 = XxxServiceImpl.getInstance()
   
   // 界面2
   val service2 = XxxServiceImpl.getInstance()
   
   // service1 和 service2 是同一个对象
   ```

2. **连接状态在所有界面共享**
   ```kotlin
   // 界面1：连接
   socketService.connect()
   
   // 界面2：直接使用（无需重新连接）
   if (socketService.isConnected()) {
       socketService.emit("event", data)
   }
   ```

3. **不需要手动销毁**
   - 单例在应用生命周期内一直存在
   - 不需要在Activity的`onDestroy()`中销毁
   - 需要断开连接时调用对应的`disconnect()`方法

## 📨 响应处理说明

### 1. BLE服务响应处理

BLE服务统一使用lambda回调处理响应：

```kotlin
// 连接响应（统一使用lambda）
bleService.connect(device) { response ->
    if (response.success) {
        // 连接成功
    } else {
        // 连接失败
        val error = response.errorMessage
    }
}

// 指令响应（统一使用lambda）
bleService.sendAppControlCommand(
    AppControlInstruction.SET_DEFENSE,
    byteArrayOf(0x01)
) { response ->
    if (response.success) {
        // 指令成功，response.data包含响应数据（ByteArray）
        val data = response.data
    } else {
        // 指令失败
        val error = response.errorMessage
    }
}

// 数据接收监听（实时数据）
bleService.setDataReceivedListener(object : DataCallback {
    override fun onDataReceived(data: ByteArray) {
        // 接收到实时数据（车辆状态、电池信息等）
        // 需要解析数据包
    }
})
```

**响应数据格式**（统一结构）：
- `BLEResponse.success`: 是否成功
- `BLEResponse.data`: 响应数据（ByteArray?，需要根据协议解析）
- `BLEResponse.errorCode`: 错误码（可选）
- `BLEResponse.errorMessage`: 错误消息（可选）
- `BLEResponse.timestamp`: 时间戳

### 2. Socket.IO服务响应处理

Socket.IO使用事件监听和回调处理响应：

```kotlin
// 监听事件（接收消息）
socketService.on("vehicle_status") { response ->
    // response.event: 事件名称
    // response.data: JSON字符串
    // response.timestamp: 时间戳
    
    val jsonData = JSONObject(response.data)
    // 解析数据
}

// 发送消息（不需要响应回调，单向发送）
socketService.emit("control_command", commandData)

// 如果需要响应，可以监听对应的事件
socketService.on("command_response") { response ->
    // 处理响应
}
```

**响应数据格式**：
- `SocketIOResponse.event`: 事件名称（String）
- `SocketIOResponse.data`: 数据（JSON字符串）
- `SocketIOResponse.timestamp`: 时间戳（Long）

### 3. 推送服务响应处理

推送服务使用监听器处理消息：

```kotlin
// 设置消息监听器
pushService.setMessageListener { message ->
    // message.title: 推送标题
    // message.content: 推送内容
    // message.extras: 额外数据（Map<String, String>）
    
    // 处理推送消息
    showNotification(message.title, message.content)
}

// 其他操作（setAlias、setTags等）通常不需要响应回调
pushService.setAlias(userId)
pushService.setTags(listOf("tag1", "tag2"))
```

**响应数据格式**：
- `PushMessage.title`: 推送标题
- `PushMessage.content`: 推送内容
- `PushMessage.extras`: 额外数据（Map）

### 4. 二维码服务响应处理

二维码服务使用回调处理响应（统一结构）：

```kotlin
// 扫码响应
qrCodeService.scanQRCode(this) { response ->
    if (response.success) {
        // 扫码成功（统一使用data字段）
        val content = response.data  // String?（二维码内容）
    } else {
        // 扫码失败
        val error = response.errorMessage
    }
}

// 识别图片中的二维码
qrCodeService.recognizeQRCode(bitmap) { response ->
    if (response.success) {
        val content = response.data  // String?
    } else {
        val error = response.errorMessage
    }
}
```

**响应数据格式**（统一结构）：
- `QRCodeResponse.success`: 是否成功
- `QRCodeResponse.data`: 二维码内容（String?）
- `QRCodeResponse.errorCode`: 错误码（可选）
- `QRCodeResponse.errorMessage`: 错误消息（可选）
- `QRCodeResponse.timestamp`: 时间戳

### 5. 分享服务响应处理

分享服务使用回调处理响应（统一结构）：

```kotlin
shareService.shareToWeChat(this, content) { response ->
    if (response.success) {
        // 分享成功（统一使用data字段）
        val platform = response.data  // SharePlatform?
        Toast.makeText(this, "分享成功", Toast.LENGTH_SHORT).show()
    } else {
        // 分享失败
        val error = response.errorMessage
        Toast.makeText(this, "分享失败: $error", Toast.LENGTH_SHORT).show()
    }
}
```

**响应数据格式**（统一结构）：
- `ShareResponse.success`: 是否成功
- `ShareResponse.data`: 分享平台（SharePlatform?）
- `ShareResponse.errorCode`: 错误码（可选）
- `ShareResponse.errorMessage`: 错误消息（可选）
- `ShareResponse.timestamp`: 时间戳

### 6. NFC服务响应处理

NFC服务使用回调处理响应（统一结构）：

```kotlin
// 读取NFC标签
nfcService.readTag { response ->
    if (response.success) {
        // 读取成功（统一使用data字段）
        val data = response.data  // ByteArray?
    } else {
        // 读取失败
        val error = response.errorMessage
    }
}

// 写入NFC标签
nfcService.writeTag(data) { response ->
    if (response.success) {
        // 写入成功
    } else {
        val error = response.errorMessage
    }
}

// 设置标签发现监听器（实时监听）
nfcService.setTagDiscoveredListener { response ->
    // NFC标签靠近时触发
    if (response.success) {
        val data = response.data  // ByteArray?
    }
}
```

**响应数据格式**（统一结构）：
- `NFCResponse.success`: 是否成功
- `NFCResponse.data`: 数据（ByteArray?）
- `NFCResponse.errorCode`: 错误码（可选）
- `NFCResponse.errorMessage`: 错误消息（可选）
- `NFCResponse.timestamp`: 时间戳

## ⚠️ 注意事项

### 响应处理通用原则（统一模式）

1. **统一响应结构**：所有能力层（除Socket.IO）都使用相同的响应结构
   ```kotlin
   data class XxxResponse(
       val success: Boolean,
       val data: T? = null,              // 数据类型不同
       val errorCode: Int? = null,
       val errorMessage: String? = null,
       val timestamp: Long = System.currentTimeMillis()
   )
   ```

2. **统一回调方式**：所有能力层都使用lambda回调
   ```kotlin
   service.xxx(...) { response ->
       if (response.success) {
           val data = response.data
       } else {
           val error = response.errorMessage
       }
   }
   ```

3. **异步回调**：所有响应都是异步的，不要在主线程中阻塞等待

4. **错误处理**：始终检查`success`字段，处理失败情况

5. **数据解析**：
   - BLE/NFC：响应数据是`ByteArray?`，需要根据协议文档解析
   - QRCode：响应数据是`String?`（二维码内容）
   - Share：响应数据是`SharePlatform?`（分享平台）
   - Socket.IO：响应数据是JSON字符串，需要解析

6. **生命周期**：注意在Activity/Fragment销毁时取消监听，避免内存泄漏

### 各服务特殊注意事项

- **BLE服务**：传入的Context会自动转换为ApplicationContext，避免内存泄漏
- **Socket.IO服务**：连接状态在所有界面共享，注意事件监听的注册和注销（使用`off()`方法）
- **推送服务**：通常在Application中初始化一次即可，消息监听器全局有效
- **NFC服务**：需要Activity上下文，单例内部会管理当前Activity
- **测试**：可以调用`XxxServiceImpl.destroyInstance()`重置单例
