这是有史以来最烦人的android错误之一。
我的应用程序中有一项服务,该服务必须始终在该用户正在运行该应用程序的情况下运行。 由于android不允许我始终打开后台服务,而要打开前台服务则必须向用户发送烦人的通知。当用户进入后台或前台时,我会打开和关闭服务。
所以,我做一个“伪代码”:
app went background?
is the service working? yes! -> keep running it : no! -> turn off
app went foreground?
is the service on? yes! -> do nothing : no! -> turn service on
问题在于用户很快进入前台和后台。
在这种情况下,应用程序调用方法startService()
以启动服务,但是在该方法完成之前,用户进入后台,然后我得到了:
Caused by java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.tomatedigital.instagramgiveawaywinner/com.tomatedigital.giveawaymaster.service.MyService }: app is in background uid UidRecord{78dfb43 u0a139 TPSL bg:+2m52s319ms idle change:cached procs:1 seq(203,203,203)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1592)
at android.app.ContextImpl.startService(ContextImpl.java:1547)
at android.content.ContextWrapper.startService(ContextWrapper.java:664)
at com.tomatedigital.giveawaymaster.activity.AdsAppCompatActivity.onResume(SourceFile:310)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1434)
at android.app.Activity.performResume(Activity.java:7304)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3993)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4033)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1977)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6923)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)
最烦人的想法是我无法阻止用户进入后台,也无法捕获此异常,因为它是通过一些android服务唤醒例程而被意外抛出的
我该如何处理
在这种情况下,我会说有0.1%的用户进入(是少数用户,但是这是一个非常令人讨厌的错误)
答案 0 :(得分:0)
Android Version >= Oreo
的后台活动有限。
使用开始-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(your_new_intent_to_service);
}else {
startService(your_new_intent_to_service);
}