flutter如何创建常驻通知栏实现保活

在Flutter中如何创建一个常驻通知栏来实现应用保活?我尝试了flutter_local_notifications插件,但发现通知过一段时间会自动消失。需要实现类似音乐播放器的持久化通知效果,确保应用在后台持续运行。请问具体应该如何实现?是否需要结合Android原生代码?能否提供完整的代码示例或实现思路?

2 回复

Flutter中可使用flutter_local_notifications插件创建常驻通知栏,结合前台服务(Android)实现保活。需配置通知权限,设置ongoing: true保持通知持续显示。注意遵循系统后台限制策略。

更多关于flutter如何创建常驻通知栏实现保活的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在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());
}

注意事项

  1. iOS限制:iOS不支持真正的常驻通知,只能创建临时通知
  2. 用户感知:必须让用户知道应用正在后台运行
  3. 电量优化:部分系统会限制后台活动,需合理使用

此方案通过前台服务+持续通知实现保活,但需注意遵循各平台的后台活动政策。

回到顶部