欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

調(diào)用startService會(huì)拋出IllegalStateException異常解決

 更新時(shí)間:2023年07月28日 11:22:17   作者:尹學(xué)姐  
這篇文章主要為大家介紹了調(diào)用startService會(huì)拋出IllegalStateException異常解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

調(diào)用startService會(huì)拋出IllegalStateException異常

startService可以很方便的啟動(dòng)一個(gè)service服務(wù),也可以運(yùn)行在單獨(dú)的進(jìn)程。

但是如果在后臺(tái)調(diào)用了startService,則很可能會(huì)拋出一個(gè)崩潰。

Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.test.broadservice/.MyService }: app is in background uid UidRecord{b67c471 u0a86 RCVR idle change:uncached procs:1 seq(0,0,0)}
        at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1577)
        at android.app.ContextImpl.startService(ContextImpl.java:1532)
        at android.content.ContextWrapper.startService(ContextWrapper.java:664)
        at android.content.ContextWrapper.startService(ContextWrapper.java:664)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

錯(cuò)誤原因

Android8.0之后,系統(tǒng)增加了對(duì)后臺(tái)Service的限制,如果應(yīng)用處于后臺(tái),調(diào)用startService會(huì)拋出IllegalStateException

意思是,在后臺(tái)的應(yīng)用,不允許調(diào)用startService啟動(dòng)一個(gè)后臺(tái)服務(wù),否則就會(huì)拋出異常。

解決方法

1. 使用startForegroundService

使用方法比較簡(jiǎn)單,這里就不列出代碼了。

有幾點(diǎn)需要注意:

  • 用此方法啟動(dòng)前臺(tái)服務(wù),會(huì)在用戶的通知欄上顯示
  • 必須在5s內(nèi)調(diào)用服務(wù)的startForeground方法,否則會(huì)發(fā)生ANR

2. 使用JobScheduler

使用JobScheduler可以實(shí)現(xiàn)在后臺(tái)運(yùn)行任務(wù)。

定義一個(gè)JobService:

public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        return false;
    }
    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}

onStartJob

  • 運(yùn)行在主進(jìn)程,需要避免執(zhí)行耗時(shí)的操作。
  • 返回true:表示任務(wù)還在繼續(xù)執(zhí)行
  • 返回false:表示任務(wù)已執(zhí)行完
  • 執(zhí)行完之后,可以調(diào)jobFinished方法來(lái)通知系統(tǒng)任務(wù)已完成。

onStopJob:

  • 當(dāng)條件不滿足的時(shí)候,會(huì)回調(diào)
  • 返回true:表示條件滿足時(shí),再次執(zhí)行任務(wù)
  • 返回false:表示任務(wù)完全結(jié)束

注冊(cè)JobService

        <service
            android:name=".MyJobService"
            android:permission="android.permission.BIND_JOB_SERVICE" />

定義一個(gè)JobInfo

JobInfo.Builder builder = new JobInfo.Builder(111, new ComponentName(this, MyJobService.class));
// todo 設(shè)置任務(wù)的參數(shù)

將任務(wù)發(fā)布給系統(tǒng):

JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());

3. 使用WorkManager

WorkManagerJobScheduler的升級(jí)版本,且支持多進(jìn)程,可以將任務(wù)運(yùn)行到單獨(dú)的進(jìn)程中。具體使用方法可以參考之前的文章:應(yīng)用退出后繼續(xù)運(yùn)行后臺(tái)任務(wù),來(lái)試試WorkManager吧!

總結(jié)

Android 8.0版本以上,在后臺(tái)調(diào)用startService會(huì)拋出IllegalStateException異常,需要改用其他的方式來(lái)使用。

常用的方法有如下三種:

  • startForegroundService: 這種方式會(huì)在用戶的通知欄顯示UI。
  • JobScheduler:可以實(shí)現(xiàn)后臺(tái)無(wú)感知運(yùn)行任務(wù)。
  • WorkManagerJetpack里的庫(kù),JobScheduler的升級(jí)版,支持多進(jìn)程。

以上就是調(diào)用startService會(huì)拋出IllegalStateException異常解決的詳細(xì)內(nèi)容,更多關(guān)于startService IllegalStateException的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論