android - 前台与后台应用程序状态
问题描述
由于 Android O 的限制,我们不能再从后台启动服务,也不能在清单中注册隐式广播接收器,所以我们必须在代码中这样做:
Context.registerReceiver()
尽管该主题不再是新主题,但我仍然不知道确定应用程序是在前台还是后台的可靠方法。我已经看到了一些解决方案,例如:
- 做一个变量并在Activity的onStart(), onStop()中切换
- 我也看到 ActivityManager 用于此目的,但这是不推荐使用的解决方案
那么,有什么方法可以确定我们的应用程序现在处于什么状态?我问这个是因为最近我在某些设备上遇到了一个奇怪的错误,我无法启动服务,这是堆栈:
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() 被调用后应用程序状态是前景,但显然不是。
解决方案
推荐阅读
- c++ - 来自 c++ 特权守护进程的通知给所有用户
- google-apps-script - 如何使用 Appscript 从 Admin SDK >> Reports API 将已删除、存档、暂停的用户数据提取到 Google 工作表
- php - Laravel - ErrorException:未定义的变量:Laravel Passport 登录中的请求
- python - 没有名为“pynput”的模块
- laravel - Laravel - Eloquent 选择并计算一些相关数据
- python - 为什么画布不能滚动?
- node.js - bcrypt.compare 总是返回 false
- swift - Swift 的 FileHandle.read 或 macOS 上的数据缓冲区中的内存泄漏
- python - ROS2 python节点位置
- kubernetes - 如何在 kubectl 中将 READY、STATUS、RESTARTS、AGE 等作为自定义列?