不允许在后台启动Service Intent应用

时间:2019-03-09 04:51:18

标签: android

这是有史以来最烦人的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%的用户进入(是少数用户,但是这是一个非常令人讨厌的错误)

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);
}