You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中SMS_RECEIVED广播接收器运行一段时间后失效问题求助

问题分析与解决方案

一、WhatsApp/Telegram这类应用长期后台运行的核心逻辑

  • 系统与厂商豁免:这类头部应用通常会被Android系统(尤其是国内定制ROM)加入后台白名单,避开系统的电池优化、进程查杀机制。它们和厂商有合作,拿到了特殊的后台运行权限。
  • 高优先级后台组件:
    • 前台服务:通过挂一个持续的通知(哪怕是低存在感的),让系统判定应用在执行用户可见任务,不会轻易查杀。
    • 长连接推送:它们的自有推送服务(或依赖FCM)会和系统推送服务保持长连接,系统会给这类连接开绿灯,毕竟推送是用户刚需功能。
  • 动态注册广播:Android 8.0+对静态注册的隐式广播限制极严,进程被杀后静态接收器就废了。而动态注册的接收器如果绑定在存活的组件(比如前台服务)上,就能一直生效。

二、你的应用缺失的关键配置与优化点

  1. 适配Android 8.0+的广播限制
    Android 8.0(API 26)开始,SMS_RECEIVED这类隐式广播的静态注册被严格限制,进程被杀后根本触发不了。你得改成动态注册:

    • 在前台服务这类存活组件里注册接收器,示例代码:
      // 前台服务的onCreate方法中注册
      IntentFilter filter = new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
      filter.setPriority(900);
      registerReceiver(mSMSReceiver, filter);
      
    • 记得在组件销毁时(比如onDestroy)调用unregisterReceiver,防止内存泄漏。
  2. 添加前台服务保活
    创建前台服务,启动时挂个持续通知,让系统觉得应用在前台运行,避免被查杀:

    • 清单文件声明权限(Android 12+必填):
      <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
      <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SMS" /> <!-- SMS相关前台服务类型 -->
      
    • 服务中启动前台的代码示例:
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
          Notification notification = createNotification(); // 自定义简单通知内容
          startForeground(1, notification);
          return START_STICKY; // 进程被杀后,系统会尝试重启服务
      }
      
  3. 引导用户关闭电池优化
    让用户把你的应用加入电池优化白名单,避免低电量时被系统清理:

    • 代码跳转至电池优化设置页:
      Intent intent = new Intent();
      String packageName = getPackageName();
      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
      if (!pm.isIgnoringBatteryOptimizations(packageName)) {
          intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
          intent.setData(Uri.parse("package:" + packageName));
          startActivity(intent);
      }
      
    • 清单文件加权限:
      <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
      
  4. 完善开机自启逻辑
    你已经静态注册了BOOT_COMPLETED,但Android 10+要求应用至少被用户手动启动过一次才能收到这个广播。开机触发后要立刻启动前台服务、动态注册广播,确保功能恢复。

三、额外注意事项

  • 别在广播接收器里做耗时操作,把任务丢去IntentService或WorkManager处理,避免ANR导致进程被杀。
  • 适配国内厂商ROM:小米、华为、OPPO等都有自己的后台管理机制,得引导用户在系统设置里开启“允许后台运行”“自启动”权限,这些权限没法通过代码申请,只能手动开。

内容的提问来源于stack exchange,提问作者Venkat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:43:40