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)
解决方案
与您的情况更相关的文档位于 Android 8.0 发行说明中。
系统区分前台和后台应用程序。(出于服务限制目的的后台定义与内存管理使用的定义不同;一个应用程序可能在与内存管理相关的后台,但在前台与其启动服务的能力有关。)一个应用程序是如果以下任何一项为真,则视为处于前台:
- 它有一个可见的活动,无论活动是启动还是暂停。
- 它有一个前台服务。
- 另一个前台应用程序连接到该应用程序,或者通过绑定到它的一个服务,或者通过使用它的一个内容提供者。例如,如果另一个应用程序绑定到它的应用程序,则该应用程序处于前台:
- 我
- 壁纸服务
- 通知监听器
- 语音或文字服务
如果这些条件都不为真,则应用程序被认为在后台。
(重点补充)
因此,从启动后台服务的角度来看,aBroadcastReceiver
不在前台。
推荐阅读
- oracle-cloud-infrastructure - 对于 Oracle Cloud Compute VM 中的 REST API 监控,我们是否需要安装 Oracle Cloud Agent?
- django - Django rest framework RecursionError during dispatch
- android - Android FileNotFoundException with app first running with use Thread
- python - django rest 框架 - 外键字段是只读的
- visual-studio-code - .vscode 中的“.browse.c_cpp.db”用于什么
- sql-server - 自定义列的复制冲突检测
- ios - 您的凭据不允许访问此资源 Twitter API 错误
- r - 如何计算子矩阵之间的相关性?
- rest - “在这种情况下,资源将永远不可用”的状态代码
- javascript - 如何找到函数并将其添加到id?