Приложение, кажется, находится в фоновом режиме, когда вызывается активность onStart - PullRequest
1 голос
/ 24 марта 2019

Начиная с Android Oreo, вы не можете запустить службу, когда приложение не на переднем плане.В моем приложении я запускаю сервис в методе onStart.Это прекрасно работает в большинстве случаев.Однако время от времени возникает исключение IllegalStateException, в котором говорится, что приложение пытается запустить службу в фоновом режиме:

    java.lang.IllegalStateException: Not allowed to start service Intent { act=ui cmp=com.someapp/.services.ConnectionService }: app is in background uid UidRecord{8d70361 u0a255 TPSL bg:+3m12s948ms idle change:cached procs:1 proclist:20368, seq(0,0,0)}
    at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1666)
    at android.app.ContextImpl.startService(ContextImpl.java:1611)
    at android.content.ContextWrapper.startService(ContextWrapper.java:677)
    at com.someapp.ui.SomeActivity.connectToBackend(SomeActivity.java:62)
    at com.someapp.ui.SomeActivity.onStart(SomeActivity.java:55)
    at com.someapp.ui.MainActivity.onStart(MainActivity.kt:228)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
    at android.app.Activity.performStart(Activity.java:7348)
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3131)
    at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
    at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1947)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7032)
    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:964)

Я запускаю службу следующим образом:

@Override
protected void onStart() {
    if (BuildConfig.DEBUG_MODE) Log.d(TAG, "activity started");
    super.onStart();
    connectToBackend();
}

void connectToBackend() {
    Intent intent = new Intent(this, ConnectionService.class);
    intent.setAction("ui");
    startService(intent);
    getApplicationContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

Я заметил, что это происходит только тогда, когда я блокирую, а затем разблокирую телефон в приложении.Я не могу воспроизвести его последовательно.

У кого-то есть такая же проблема?

Я использую устройство Samsung Galaxy S10e.

1 Ответ

0 голосов
/ 24 марта 2019

Для устройств после Nougat используйте startForegroundService, а для устройств до Oreo - startService

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(intent);
} else {
    startService(intent);
}
...