You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何确保Android平台的关键告警应用在后台持续运行?

如何确保Android平台的关键告警应用在后台持续运行?

我之前做过一个类似的工业告警Flutter应用,完全懂你这种关键通知断了会出大问题的焦虑!结合我踩过的坑和生产环境的实践,给你整理几个最有效的方案:

1. 先把FCM消息的发送配置拉满

FCM数据消息的优先级直接决定了系统会不会优先处理它:

  • 发送时必须设置 priority: high(对应Android的高优先级),这样即使应用被杀,系统也会唤醒进程来处理消息
  • 不要设置过长的ttl(生存时间),建议设为0,确保消息即时送达,不会被系统缓存延迟
  • 另外,Flutter的onBackgroundMessage回调是在独立的隔离线程中运行的,务必保证这里的代码无耗时操作、无UI交互,只做最核心的逻辑(比如解析消息、触发本地通知),并且一定要返回Future<void>,否则系统会认为处理失败,后续可能不再分发消息。

2. 必须用上前台服务(Foreground Service)

从Android 8.0(API 26)开始,系统对后台服务的限制极其严格,应用进入后台后不久后台服务就会被杀死。前台服务是唯一能让应用在后台持续运行的合法方式:

  • 前台服务必须显示一个持久通知(可以设置成低打扰模式,比如标题“告警服务运行中”,内容“持续接收关键通知”,图标用应用图标即可),这样系统会认为这是用户关注的服务,不会轻易回收
  • 在Flutter中可以用flutter_foreground_service这类插件快速实现,启动前台服务后,即使应用被用户手动杀死,服务依然会在后台运行,能正常接收FCM数据消息并触发本地通知

3. 申请电池优化豁免

Android的Doze模式和App Standby会在设备闲置时限制后台应用的网络和活动,直接影响FCM消息的接收:

  • 你可以在应用中检测当前是否已被豁免电池优化,代码示例:
    import 'package:android_intent_plus/android_intent.dart';
    import 'package:android_intent_plus/flag.dart';
    import 'package:flutter/services.dart';
    
    Future<bool> isIgnoringBatteryOptimizations() async {
      const methodChannel = MethodChannel('your_custom_channel');
      try {
        return await methodChannel.invokeMethod('isIgnoringBatteryOptimizations');
      } on PlatformException catch (_) {
        return false;
      }
    }
    
    Future<void> requestBatteryOptimizationExemption() async {
      final packageName = await const MethodChannel('android_package_info').invokeMethod('getPackageName');
      final intent = AndroidIntent(
        action: 'android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS',
        data: Uri.parse('package:$packageName'),
        flags: [Flag.FLAG_ACTIVITY_NEW_TASK],
      );
      await intent.launch();
    }
    
  • 当检测到未豁免时,引导用户跳转到系统设置手动开启,这一步非常关键,否则即使前台服务运行,也可能被Doze模式限制网络,收不到FCM消息。

4. 搞定厂商定制ROM的后台限制

国内小米、华为、OPPO、vivo这些厂商的ROM都有自己的后台管理机制,比原生Android严格得多,这是很多应用保活失败的重灾区:

  • 必须引导用户开启自启动权限:允许应用在开机后自动启动,否则重启设备后服务不会自动恢复
  • 开启后台活动权限:有些厂商叫“允许后台运行”,确保应用被杀死后,系统允许它重新启动来接收消息
  • 开启锁屏后保持运行:部分厂商有这个选项,防止设备锁屏后应用被强制杀死
  • 你可以在应用的“帮助”或“设置”页面加一份设备专属的引导说明,比如小米是“设置→应用设置→应用管理→你的应用→权限管理→自启动”,华为是“设置→应用和服务→应用启动管理→你的应用→手动管理→允许自启动、允许后台活动”

5. 几个能提高存活率的小细节

  • 不要在后台做任何耗时操作,比如网络请求、数据库批量写入,这些都会触发系统的后台限制
  • 确保应用的targetSdkVersion适配到最新的Android版本(至少API 33+),系统对遵循最新规范的应用会更宽容
  • 避免频繁启动和停止服务,尽量让前台服务保持持续运行,减少系统的回收概率

最后再提醒一句:即使做了所有这些优化,当系统内存严重不足时,还是有可能被杀死,但这些措施已经能把应用的存活概率提升到90%以上,完全能满足关键告警应用的需求。

内容来源于stack exchange

火山引擎 最新活动