在BroadcastReceiver

时间:2019-06-18 21:00:16

标签: android 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)

1 个答案:

答案 0 :(得分:1)

与您的情况最相关的文档是in the Android 8.0 release notes

  

系统区分前台和后台应用程序。 (出于服务限制的目的,背景的定义不同于内存管理所使用的定义;与内存管理有关的应用程序可能在后台,而与其启动服务的能力有关的应用程序则在前台。) 如果满足以下任一条件,则认为该应用位于前台:

     
      
  • 它具有可见的活动,无论该活动是开始还是暂停。
  •   
  • 它具有前台服务。
  •   
  • 另一个前台应用程序通过绑定到其服务之一或通过使用其内容提供商之一而连接到该应用程序。例如,如果另一个应用绑定到该应用,则该应用位于前台:      
        
    • IME
    •   
    • 墙纸服务
    •   
    • 通知侦听器
    •   
    • 语音或文字服务
    •   
  •   
     

如果所有这些条件都不成立,则认为该应用程序处于后台。

(添加了重点)

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