在Flutter中创建常驻通知栏实现保活,可以使用flutter_local_notifications插件结合前台服务(Foreground Service)来实现。以下是具体步骤和代码示例:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
flutter_local_notifications: ^14.0.0
2. 配置通知渠道(Android)
在 android/app/src/main/AndroidManifest.xml 中添加权限和服务:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application>
<service
android:name=".MyForegroundService"
android:enabled="true"
android:exported="false" />
</application>
3. 实现前台服务(Android)
创建 android/app/src/main/kotlin/.../MyForegroundService.kt:
import android.app.Notification
import android.app.Service
import android.content.Intent
import android.os.IBinder
class MyForegroundService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = Notification.Builder(this, "keep_alive_channel")
.setContentTitle("App运行中")
.setContentText("正在后台保持活跃")
.setSmallIcon(android.R.drawable.ic_media_play)
.build()
startForeground(1, notification)
return START_STICKY
}
override fun onBind(intent: Intent?): IBinder? = null
}
4. Flutter代码集成
在Dart文件中初始化通知并启动服务:
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
final FlutterLocalNotificationsPlugin notificationsPlugin =
FlutterLocalNotificationsPlugin();
Future<void> initializeNotifications() async {
const AndroidInitializationSettings androidSettings =
AndroidInitializationSettings('@mipmap/ic_launcher');
const InitializationSettings settings = InitializationSettings(
android: androidSettings,
);
await notificationsPlugin.initialize(settings);
}
Future<void> startForegroundService() async {
const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
'keep_alive_channel',
'保活通道',
channelDescription: '用于保持应用后台运行',
importance: Importance.low,
priority: Priority.low,
ongoing: true, // 设置为持续通知
autoCancel: false,
);
const NotificationDetails details = NotificationDetails(
android: androidDetails,
);
await notificationsPlugin.show(
1,
'App运行中',
'正在后台保持活跃',
details,
);
// 启动Android前台服务(需要平台通道)
const platform = MethodChannel('your_channel_name');
try {
await platform.invokeMethod('startForegroundService');
} catch (e) {
print('启动服务失败: $e');
}
}
5. 平台通道调用(Android)
在 MainActivity.kt 中添加:
class MainActivity : FlutterActivity() {
private val CHANNEL = "your_channel_name"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
when (call.method) {
"startForegroundService" -> {
val intent = Intent(this, MyForegroundService::class.java)
startService(intent)
result.success(null)
}
else -> result.notImplemented()
}
}
}
}
使用方式
// 在main函数或初始化时调用
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await initializeNotifications();
await startForegroundService();
runApp(MyApp());
}
注意事项
- iOS限制:iOS不支持真正的常驻通知,只能创建临时通知
- 用户感知:必须让用户知道应用正在后台运行
- 电量优化:部分系统会限制后台活动,需合理使用
此方案通过前台服务+持续通知实现保活,但需注意遵循各平台的后台活动政策。