首页 > 解决方案 > 在 BroadcastReceiver 中启动服务时出错

问题描述

当我在应用程序关闭或在后台运行时尝试从接收器启动服务时,我遇到了这个错误。

但文档明确指出:

BroadcastReceiver 的状态(无论它是否正在运行)会影响其包含进程的状态,这反过来又会影响其被系统杀死的可能性。例如,当一个进程执行一个接收器(即当前正在运行其 onReceive() 方法中的代码)时,它被认为是一个前台进程。系统保持进程运行,除非在内存压力很大的情况下。

换句话说,当应用程序处于前台时,理论上它可以启动服务。

那么这里有什么问题呢?

@Override
public void onReceive(Context context, Intent intent) {
    // assumes WordService is a registered service


    context.startService(new Intent(context, HelloService.class));

}

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.testapp, PID: 26026
    java.lang.RuntimeException: Unable to start receiver com.example.testapp.MyReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.testapp/.HelloService }: app is in background uid UidRecord{bee03a7 u0a82 RCVR bg:+1m19s133ms idle change:uncached procs:1 seq(0,0,0)}
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3194)
        at android.app.ActivityThread.-wrap17(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1672)
        at android.os.Handler.dispatchMessage(Handler.java:106)

标签: androidbroadcastreceiver

解决方案


与您的情况更相关的文档位于 Android 8.0 发行说明中

系统区分前台和后台应用程序。(出于服务限制目的的后台定义与内存管理使用的定义不同;一个应用程序可能在与内存管理相关的后台,但在前台与其启动服务的能力有关。)一个应用程序是如果以下任何一项为真,则视为处于前台:

  • 它有一个可见的活动,无论活动是启动还是暂停。
  • 它有一个前台服务。
  • 另一个前台应用程序连接到该应用程序,或者通过绑定到它的一个服务,或者通过使用它的一个内容提供者。例如,如果另一个应用程序绑定到它的应用程序,则该应用程序处于前台:
    • 壁纸服务
    • 通知监听器
    • 语音或文字服务

如果这些条件都不为真,则应用程序被认为在后台。

(重点补充)

因此,从启动后台服务的角度来看,aBroadcastReceiver不在前台。


推荐阅读