feat: 新增站内消息系统,支持通知与订单跳转

This commit is contained in:
andyesfly committed 2026-10-23 17:18:21 +08:00
1 parent 411ec8be23
commit c799b62f6b
14 files changed
+464 -9

No files matched your search

+6
View File
@@ -13,6 +13,8 @@ android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
// flutter_local_notifications 需要 core library desugaring
isCoreLibraryDesugaringEnabled = true
}
kotlinOptions {
@@ -42,3 +44,7 @@ android {
flutter {
source = "../.."
}
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
}
+10
View File
@@ -1,6 +1,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 访问局域网后端接口(release 包也需要) -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Android 13+ 展示系统通知 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<!-- 后台保持进程存活,持续轮询派单消息 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<application
android:label="smart_grid_iot_app_flutter"
android:name="${applicationName}"
@@ -28,6 +33,11 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- 后台保活:让 App 退到后台后仍能轮询站内消息 -->
<service
android:name=".KeepAliveService"
android:exported="false"
android:foregroundServiceType="dataSync"/>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
@@ -0,0 +1,66 @@
package com.voltlink.smart_grid_iot_app_flutter
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
/**
* 前台服务:仅用于让进程在退到后台后保持存活,
* 从而让 Flutter 侧的 30s 轮询继续运行并弹出系统通知。
*
* 它不是推送通道:用户手动「强行停止」或清理后台后仍会中断。
*/
class KeepAliveService : Service() {
companion object {
private const val CHANNEL_ID = "voltlink_keepalive"
private const val NOTIFICATION_ID = 1001
}
override fun onBind(intent: Intent?): IBinder? = null
override fun onCreate() {
super.onCreate()
createChannel()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
startForeground(NOTIFICATION_ID, buildNotification())
return START_STICKY
}
private fun createChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (manager.getNotificationChannel(CHANNEL_ID) == null) {
val channel = NotificationChannel(
CHANNEL_ID,
"后台接单提醒",
NotificationManager.IMPORTANCE_MIN
)
channel.description = "保持 App 运行以接收派单消息"
channel.setShowBadge(false)
manager.createNotificationChannel(channel)
}
}
}
private fun buildNotification(): Notification {
val builder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Notification.Builder(this, CHANNEL_ID)
} else {
@Suppress("DEPRECATION")
Notification.Builder(this)
}
return builder
.setContentTitle("VoltLink 正在后台运行")
.setContentText("用于及时接收派单消息")
.setSmallIcon(R.mipmap.ic_launcher)
.setOngoing(true)
.build()
}
}
@@ -1,5 +1,37 @@
package com.voltlink.smart_grid_iot_app_flutter
import android.content.Intent
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
class MainActivity : FlutterActivity()
class MainActivity : FlutterActivity() {
private val channelName = "voltlink/keepalive"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channelName)
.setMethodCallHandler { call, result ->
when (call.method) {
"start" -> {
startKeepAlive()
result.success(null)
}
"stop" -> {
stopService(Intent(this, KeepAliveService::class.java))
result.success(null)
}
else -> result.notImplemented()
}
}
}
private fun startKeepAlive() {
val intent = Intent(this, KeepAliveService::class.java)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
}
}