首页 > 解决方案 > 前台与后台应用程序状态

问题描述

由于 Android O 的限制,我们不能再从后台启动服务,也不能在清单中注册隐式广播接收器,所以我们必须在代码中这样做:

Context.registerReceiver()

尽管该主题不再是新主题,但我仍然不知道确定应用程序是在前台还是后台的可靠方法。我已经看到了一些解决方案,例如:

那么,有什么方法可以确定我们的应用程序现在处于什么状态?我问这个是因为最近我在某些设备上遇到了一个奇怪的错误,我无法启动服务,这是堆栈:

java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } in com.vc.receivers.RunTimeReceiver@299a843
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_54441(LoadedApk.java:1369)
at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.$m$7(Unknown Source:4)
at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.run(Unknown Source:39)
at android.os.Handler.handleCallback(Handler.java:795)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:6861)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:450)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.trueconf.videochat/com.vc.service.AppNotificationService }: app is in background uid UidRecord{621583 u0a323 CEM  idle change:cached procs:1 seq(0,0,0)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1525)
at android.app.ContextImpl.startService(ContextImpl.java:1481)
at android.content.ContextWrapper.startService(ContextWrapper.java:650)
at com.vc.data.NotificationsStorage.updateAppStateNotify(NotificationsStorage.java:285)
at com.vc.model.NetworkStateHandler.getNetworkTypeForUsage(NetworkStateHandler.java:292)
at com.vc.model.NetworkStateHandler.performRefreshConnectionInfo(NetworkStateHandler.java:137)
at com.vc.model.NetworkStateHandler.refreshConnectionInfo(NetworkStateHandler.java:104)
at com.vc.receivers.RunTimeReceiver.onReceive(RunTimeReceiver.java:54)
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_54441(LoadedApk.java:1356)
... 9 more

我在 Application 的 onCreate() 方法之后注册了 BroadcastReceiver,然后它会立即收到 CONNECTIVITY_CHANGE Intent 并启动一个服务。我认为应用程序的 onCreate() 被调用后应用程序状态是前景,但显然不是。

标签: android

解决方案


推荐阅读