Android 8.0 : java.lang.IllegalStateException : 서비스 의도를 시작할 수 없음


359

응용 프로그램을 시작하면 앱에서 일부 네트워크 작업을 수행해야하는 서비스를 시작합니다. API 레벨 26을 타겟팅 한 후 애플리케이션이 백그라운드에서 Android 8.0에서 서비스를 시작하지 못합니다.

원인 : java.lang.IllegalStateException : 서비스를 시작할 수 없음 {cmp = my.app.tt / com.my.service} : 앱이 백그라운드에 있습니다 uid UidRecord {90372b1 u0a136 CEM 유휴 procs : 1 seq (0,0 , 0)}

내가 이해 한대로 : 백그라운드 실행 제한

백그라운드 서비스 생성이 허용되지 않는 상황에서 Android 8.0을 대상으로하는 앱에서 해당 메소드를 사용하려고하면 startService () 메소드에서 IllegalStateException이 발생합니다.

" 허용되지 않는 상황에서 "-실제로 의미하는 것은 무엇입니까 ?? 그리고 그것을 고치는 방법. 서비스를 "전경"으로 설정하고 싶지 않습니다.


4
앱이 백그라운드에있을 때 서비스를 시작할 수 없음을 의미합니다
Tim

22
이것은 런타임 권한과 관련이 없습니다
Tim

10
startForegroundService()대신 사용하십시오 startService().
frogatto

2
targetSdkVersion 25를 사용하려고하지만 compileSdkVersion 26으로 컴파일 할 수 있습니다.이 방법으로 Android 8 및 최신 지원 라이브러리의 새 클래스를 사용할 수 있지만 앱은 백그라운드 실행 제한에 의해 제한되지 않습니다.
Kacper Dziubek

2
@KacperDziubek 2018 년 가을 SDK26을 대상으로해야하므로 작동하지만 임시 솔루션입니다.
RightHandedMonkey

답변:


194

허용되는 상황은 백그라운드 서비스가 Android O 이전과 동일하게 작동하는 임시 허용 목록입니다.

특정 상황에서 백그라운드 앱이 몇 분 동안 임시 허용 목록에 배치됩니다. 앱이 허용 목록에있는 동안 제한없이 서비스를 시작할 수 있으며 백그라운드 서비스를 실행할 수 있습니다. 다음과 같이 사용자에게 표시되는 작업을 처리 할 때 앱이 허용 목록에 배치됩니다.

  • 우선 순위가 높은 Firebase 클라우드 메시징 (FCM) 메시지 처리
  • SMS / MMS 메시지와 같은 브로드 캐스트 수신
  • 알림에서 PendingIntent 실행
  • VPN 앱이 시작되기 전에 VpnService를 시작하면 포 그라운드로 올라갑니다.

출처 : https://developer.android.com/about/versions/oreo/background.html

즉, 백그라운드 서비스가 화이트리스트 요구 사항을 충족하지 않으면 새 JobScheduler 를 사용해야합니다 . 기본적으로 백그라운드 서비스와 동일하지만 백그라운드에서 연속적으로 실행되는 대신 주기적으로 호출됩니다.

IntentService를 사용중인 경우 JobIntentService로 변경할 수 있습니다. 아래 @kosev의 답변을 참조하십시오 .


"높은"prio의 GCM 메시지를받은 직후 서비스를 시작하려고하면 충돌이 발생합니다. 'com.google.firebase : firebase-messaging : 11.4.2'가 아니라 GCM : 'com.google.android.gms : play-services-gcm : 11.4.2'를 계속 사용합니다. 그러나 그것이 중요하지 않다 ..
Alex Radzishevsky

"기본적으로 백그라운드 서비스와 동일하지만 백그라운드에서 연속적으로 실행되는 대신 주기적으로 호출됩니다." -Android 서비스가 지속적으로 실행되지 않았으므로이 의미가 무엇인지 확실하지 않습니다. 시작, 실행, 종료합니다.
Melllvar

2
FirebaseInstanceIdService 그와 onTokenRefresh방법은 우선 순위가 높은 FCM 메시지?
코드 렌

@phnmnn 아니오, GCMTaskService는 실제로 FCM을 따르지 않으므로 작동하지 않습니다.
Abhinav Upadhyay

4
JobScheduler 또는 다른 작업 대신 WorkManager (여기서는 developer.android.com/topic/libraries/architecture/workmanager )를 사용하지 않아야합니까? 나는이 의미 : youtu.be/IrKoBFLwTN0을
안드로이드 개발자

254

나는 해결책을 얻었다. 8.0 이전 디바이스의 경우을 사용해야 startService()하지만 7.0 이후 디바이스의 경우을 사용해야 startForgroundService()합니다. 다음은 서비스를 시작하는 코드 샘플입니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        context.startForegroundService(new Intent(context, ServedService.class));
    } else {
        context.startService(new Intent(context, ServedService.class));
    }

그리고 서비스 클래스에서 통지를 위해 아래 코드를 추가하십시오.

@Override
public void onCreate() {
    super.onCreate();
    startForeground(1,new Notification());
}

여기서 O는 Android 버전 26입니다.


9
포 그라운드 서비스는 사용자가 알고 있고 알림이 필요한 것입니다. 너무 오래 실행되면 ANR도됩니다. 따라서 앱이 백그라운드에서 이미 실행되고 있다면 실제로는 적절한 대답이 아닙니다.
SimonH

80
ContextCompat.startForegroundService(...)대신 사용할 수 있습니다 지원 lib 디렉토리.
jayeffkay

37
그것은 해결책이 아닙니다.
JacksOnF1re

17
또한 이것이 해결책이 아니라는 데 동의합니다. 해결 방법이며 도움이되지만 Oreo의 배경 제한이 이유로 소개되었습니다. 이러한 방식으로이 제한을 우회하는 것은 확실히 올바른 접근법이 아닙니다 (작동하더라도). 가장 좋은 방법은 JobScheduler를 사용하는 것입니다 (허용 된 답변 참조).
Vratislav Jindra

6
빈 전경 알림을 표시 해야하는 경우 좋은 사용자 경험이 될 것이라고 생각하지 않습니다. 당신이해야한다는 사실을 고려하십시오. -Android 8.0은 포 그라운드에서 새 서비스를 시작하기 위해 새로운 메소드 startForegroundService ()를 도입했습니다. 시스템이 서비스를 생성 한 후 앱은 서비스의 startForeground () 메소드를 호출하여 새 서비스의 사용자에게 보이는 알림을 표시하는 데 5 초가 걸립니다. 앱이 제한 시간 내에 startForeground ()를 호출하지 않으면 시스템은 서비스를 중지하고 앱을 ANR로 선언합니다.
heeleeaz

85

가장 좋은 방법은 Oreo 용 새 JobScheduler 또는 사용 불가능한 이전 서비스 를 사용하는 JobIntentService 를 사용하는 것입니다.

매니페스트를 선언하십시오.

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

그리고 서비스에서 onHandleIntent를 onHandleWork로 바꿔야합니다.

public class YourService extends JobIntentService {

    public static final int JOB_ID = 1;

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, YourService.class, JOB_ID, work);
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        // your code
    }

}

그런 다음 서비스를 시작하십시오.

YourService.enqueueWork(context, new Intent());


정적 메소드 내에서 비 ​​정적 메소드를 호출하는 방법은 무엇입니까? 설명해 주시겠습니까?
매디

@Maddy enqueueWork(...)도 정적 방법입니다.
hgoebl

2
YourService.enqueueWork (context, new Intent ()); ? 방송 수신기에서?
TheLearner

이것이 가장 쉬운 해결책이라고는 생각하지 않습니다. WorkManager에 대한 아래의 내 의견을 참조하십시오. 적절한 경우 JobIntentService를 사용하지만 보일러 플레이트가 훨씬 적습니다.
TALE

36

서비스를 확장하여 백그라운드 스레드에서 실행중인 경우 IntentService, 당신은 대체 할 수 IntentService와 함께 JobIntentService있는 것은 안드로이드 지원 라이브러리의 일부로 제공되는

사용하는 이점은 JobIntentService그것이 같은 동작이다 IntentService그것은 작업으로 전달 높은 사전 O O 장치와과

JobScheduler주기적 / 주문형 작업에도 사용할 수 있습니다. 그러나 JobSchedulerAPI는 API 21에서만 사용할 수 있으므로 이전 버전과의 호환성을 처리해야합니다.


1
JobIntentService의 문제점은 Android가 임의로 작업을 예약 할 수 있으며 IntentService와 달리 약간의 땜질 없이는 암시 적으로 시작할 수 없다는 것입니다. 참조 stackoverflow.com/questions/52479262/...
kilokahn

15

에서 오레오 안드로이드는 정의 배경 서비스에 한계를 .

사용자 경험을 향상시키기 위해 Android 8.0 (API 레벨 26)은 백그라운드에서 실행하는 동안 앱이 수행 할 수있는 작업에 제한을 둡니다.

그래도 항상 서비스를 실행해야하는 경우 포 그라운드 서비스를 사용할 수 있습니다.

백그라운드 서비스 제한 : 앱이 유휴 상태 인 동안 백그라운드 서비스 사용에 제한이 있습니다. 이것은 사용자에게 더 눈에 띄는 포 그라운드 서비스에는 적용되지 않습니다.

따라서 포 그라운드 서비스를 만들 수 있습니다 . 서비스가 실행될 때 사용자 에게 알림 을 표시해야합니다 . 이 답변보기 (다른 많은 사람들이 있습니다)

해결 방법-

서비스 알림을 원하지 않습니까?

정기적 인 작업을 수행 할 수 있습니다. 1. 서비스를 시작합니다. 2. 서비스가 작업을 수행하고 3. 자체적으로 중지합니다. 이를 통해 앱은 배터리 소모로 간주되지 않습니다.

Alarm Manager , Job Scheduler , Evernote-Jobs 또는 Work Manager 와 함께 주기적 작업을 사용할 수 있습니다 .

Work-Manager로 영원히 실행되는 서비스를 테스트했습니다.


작업을 즉시 실행할 필요가 없다고 가정하면 WorkManager가 최선의 방법 인 것 같습니다. API 23 이상이있는 장치에서는 JobScheduler를 사용하고 API 14-22가있는 장치에서는 BroadcastReceiver + AlarmManager 조합을 사용하여 API 14와 역 호환 가능
James Allen

WorkManager에 대한 중요한 건입니다 WorkManager가, 연기, 즉, 바로 실행하는 데 필요하지 않습니다 있습니다 작업을위한 것입니다
touhid을 udoy

13

예, API 26에서 더 이상 백그라운드에서 서비스를 시작할 수 없기 때문입니다. 따라서 API 26 위에서 ForegroundService를 시작할 수 있습니다.

당신은 사용해야합니다

ContextCompat.startForegroundService(...)

누출을 처리하는 동안 알림을 게시하십시오.


1
OP는 구체적으로 전경을 원하지 않는다고 말했다. 이것은 의견이나 더 완전한 답변의 일부로 넣어야합니다.
Ricardo A.

7

@kosev가 그의 대답 에서 말했듯이 JobIntentService 를 사용할 수 있습니다. 그러나 대체 솔루션을 사용합니다. IllegalStateException을 포착하고 서비스를 포 그라운드로 시작합니다. 예를 들어,이 기능은 서비스를 시작합니다.

@JvmStatic
protected fun startService(intentAction: String, serviceType: Class<*>, intentExtraSetup: (Intent) -> Unit) {
    val context = App.context
    val intent = Intent(context, serviceType)
    intent.action = intentAction
    intentExtraSetup(intent)
    intent.putExtra(NEED_FOREGROUND_KEY, false)

    try {
        context.startService(intent)
    }
    catch (ex: IllegalStateException) {
        intent.putExtra(NEED_FOREGROUND_KEY, true)
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent)
        }
        else {
            context.startService(intent)
        }
    }
}

그리고 Intent를 처리 할 때 다음과 같은 작업을 수행합니다.

override fun onHandleIntent(intent: Intent?) {
    val needToMoveToForeground = intent?.getBooleanExtra(NEED_FOREGROUND_KEY, false) ?: false
    if(needToMoveToForeground) {
        val notification = notificationService.createSyncServiceNotification()
        startForeground(notification.second, notification.first)

        isInForeground = true
    }

    intent?.let {
        getTask(it)?.process()
    }
}

나는 당신의 시도 캐치 솔루션을 좋아합니다. 때때로 때문에 나에게는 솔루션입니다 context.startService가끔하지 - - 백그라운드에서 작동하는 유일한 최선의 방법 등이 보이는 그렇지 않으면 당신은 당신의 메인 클래스에 더 많은 코드를 구현해야 extending Application하고 implementing ActivityLifecycleCallbacks앱이 전경 또는 배경에 있는지 여부를 추적하고 당신의 의도를 시작 따라서.
Pierre

이 예외를 잡을 수 있습니까?
thecr0w

5

로부터 중포 기지 릴리스 노트 , 그들은 (나는 최신 버전을 사용하는 것이 좋습니다 것입니다 있지만) 안드로이드 O에 대한 지원이 먼저 10.2.1 출시 된 상태.

안드로이드 O에 대한 새로운 firebase 메시지 의존성을 추가하십시오

compile 'com.google.firebase:firebase-messaging:11.6.2'

필요한 경우 Google Play 서비스 및 Google 리포지토리를 업그레이드하십시오.


이것은 질문에 대답하지 않으며 질문은 firebase와 관련이 없습니다. 주석으로 작성해야합니다.
Ricardo A.

5

앱이 백그라운드에있을 때 이전에 의도가 제대로 작동했다면 더 이상 Android 8 이상에서 발생하지 않습니다. 앱이 백그라운드에있을 때 처리 해야하는 의도 만 참조하십시오.

아래 단계를 따라야합니다.

  1. 위에서 언급 한 의도는 JobIntentService대신에 사용해야합니다 IntentService.
  2. 확장하는 클래스 JobIntentService는- onHandleWork(@NonNull Intent intent)메소드를 구현 해야하며 메소드를 호출해야하는 메소드 아래에 있어야합니다 onHandleWork.

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, xyz.class, 123, work);
    }
  3. enqueueWork(Context, intent)의도가 정의 된 수업에서 전화 하십시오.

    샘플 코드 :

    Public class A {
    ...
    ...
        Intent intent = new Intent(Context, B.class);
        //startService(intent); 
        B.enqueueWork(Context, intent);
    }

아래 클래스는 이전에 서비스 클래스를 확장했습니다.

Public Class B extends JobIntentService{
...

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, B.class, JobId, work);
    }

    protected void onHandleWork(@NonNull Intent intent) {
        ...
        ...
    }
}
  1. com.android.support:support-compat필요합니다 JobIntentService-사용 26.1.0 V합니다.

  2. 가장 중요한 것은 중포 기지 라이브러리 버전은 최소한에 확인하는 것입니다 10.2.1, 나는 문제가 있었다 10.2.0- 당신은 어떤이있는 경우!

  3. 매니페스트에 서비스 클래스에 대한 아래 권한이 있어야합니다.

    service android:name=".B"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"

도움이 되었기를 바랍니다.


4

ForegroundService를 사용하는 것이 좋습니다 응답이 많이 있습니다. ForegroundService를 사용하려면 이와 관련된 알림이 있어야합니다. 이 알림이 표시됩니다. 상황에 따라 앱에 문제가 생겨 제거 할 수 있습니다.

가장 쉬운 해결책은 WorkManager라는 새로운 아키텍처 구성 요소를 사용하는 것입니다. https://developer.android.com/topic/libraries/architecture/workmanager/ 에서 설명서를 확인할 수 있습니다.

작업자를 확장하는 작업자 클래스를 정의하기 만하면됩니다.

public class CompressWorker extends Worker {

    public CompressWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Worker.Result doWork() {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress();

        // Indicate success or failure with your return value:
        return Result.SUCCESS;

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)
    }
}

그런 다음 실행할시기를 예약하십시오.

    OneTimeWorkRequest compressionWork = 
        new OneTimeWorkRequest.Builder(CompressWorker.class)
            .build();
    WorkManager.getInstance().enqueue(compressionWork);

쉬운! 작업자를 구성 할 수있는 많은 방법이 있습니다. 반복되는 작업을 지원하며 필요할 경우 체인과 같은 복잡한 작업을 수행 할 수도 있습니다. 도움이 되었기를 바랍니다.


3
현재 WorkManager는 여전히 알파입니다.
pzulw

3
2019 년 3 월 5 일-WorkManager 1.0.0 안정 릴리스.
phnmnn

대신 INTERSERVICE 또는 JobIntentService 사용하는 WorkManager를 사용한다
sivaBE35

1
WorkManager is intended for tasks that are deferrable—that is, not required to run immediately...하지만 가장 쉬운 방법이지만 내 앱에는 사용자 요청을 즉시 실행하는 백그라운드 서비스가 필요합니다!
누군가 어딘가에

작업을 즉시 완료해야하는 경우 포 그라운드 서비스를 사용해야합니다. 사용자에게 알림이 표시되고 작업 중임을 알 수 있습니다. 사용할 것을 결정하는 데 도움이 필요하면 문서를 확인하십시오. 백그라운드 처리에 대한 훌륭한 가이드가 있습니다. developer.android.com/guide/background
TALE

4

JobScheduler를 사용하는 다른 솔루션으로 정기적으로 백그라운드에서 서비스를 시작할 수 있습니다.

먼저 Util.java 라는 클래스를 작성하십시오.

import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;

public class Util {
// schedule the start of the service every 10 - 30 seconds
public static void schedulerJob(Context context) {
    ComponentName serviceComponent = new ComponentName(context,TestJobService.class);
    JobInfo.Builder builder = new JobInfo.Builder(0,serviceComponent);
    builder.setMinimumLatency(1*1000);    // wait at least
    builder.setOverrideDeadline(3*1000);  //delay time
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);  // require unmetered network
    builder.setRequiresCharging(false);  // we don't care if the device is charging or not
    builder.setRequiresDeviceIdle(true); // device should be idle
    System.out.println("(scheduler Job");

    JobScheduler jobScheduler = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        jobScheduler = context.getSystemService(JobScheduler.class);
    }
    jobScheduler.schedule(builder.build());
   }
  }

그런 다음 JobService 클래스를 TestJobService.java로 이름을 지정하십시오.

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.widget.Toast;

  /**
   * JobService to be scheduled by the JobScheduler.
   * start another service
   */ 
public class TestJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
    Util.schedulerJob(getApplicationContext()); // reschedule the job
    Toast.makeText(this, "Bg Service", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    return true;
  }
 }

그 이름이 ServiceReceiver.java 인 BroadCast Receiver 클래스 이후

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

 public class ServiceReceiver extends BroadcastReceiver {
 @Override
public void onReceive(Context context, Intent intent) {
    Util.schedulerJob(context);
 }
}

서비스 및 수신자 클래스 코드로 Manifest 파일 업데이트

<receiver android:name=".ServiceReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <service
        android:name=".TestJobService"
        android:label="Word service"
        android:permission="android.permission.BIND_JOB_SERVICE" >

    </service>

main_intent 런처를 기본적으로 작성된 mainActivity.java 파일로 남겨두고 MainActivity.java 파일의 변경 사항은 다음과 같습니다.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Util.schedulerJob(getApplicationContext());
  }
 }

우와 !! 포 그라운드 서비스없이 백그라운드 서비스 시작


2

8.0에서 코드를 실행하면 응용 프로그램이 중단됩니다. 포 그라운드에서 서비스를 시작하십시오. 8.0 미만인 경우 다음을 사용하십시오.

Intent serviceIntent = new Intent(context, RingtonePlayingService.class);
context.startService(serviceIntent);

8.0 이상인 경우 다음을 사용하십시오.

Intent serviceIntent = new Intent(context, RingtonePlayingService.class);
ContextCompat.startForegroundService(context, serviceIntent );

사용자가 서비스가 실행되고 있음을 알고 있어야하는 경우 Foreground 서비스 만 사용하는 것이 좋습니다. 일반적인 예는 백그라운드에서 음악을 재생하는 것입니다. 다른 경우도있을 수 있지만 모든 서비스를 Foreground 서비스로 변환해서는 안됩니다. 백그라운드에서 일부 작업을 수행하고 실행되도록 보장해야하는 경우 서비스를 Google의 Architectural 구성 요소에서 WorkManager를 사용하도록 변환하십시오.
TALE

startForegroundService는 권한이 필요합니다 java.lang.SecurityException: Permission Denial: startForeground from pid=13708, uid=10087 requires android.permission.FOREGROUND_SERVICE. 그렇지 않으면 . stackoverflow.com/a/52382711/550471
누군가 어딘가에

1

Firebase 메시징 푸시 알림을 통합 한 경우,

백그라운드 실행 제한 으로 인해 Android O (Android 8.0)에 대한 새 / 업데이트 Firebase 메시징 종속성을 추가 합니다.

compile 'com.google.firebase:firebase-messaging:11.4.0'

필요한 경우 Google Play 서비스 및 Google 리포지토리를 업그레이드하십시오.

최신 정보:

 compile 'com.google.firebase:firebase-messaging:11.4.2'

0

서비스를 시작한 후 5 초 이내에 서비스 를 만드는 startForegroundService()대신 사용하십시오 .startService()startForeground(1,new Notification());


2
새로운 Notificaction ()은 Android 8.1에서 작동하지 않는 것 같습니다. 알림 채널을 만들어야합니다. stackoverflow.com/a/47533338/1048087
Prizoff

0

이 답변에 대한 논쟁의 여지가있는 투표 (이 편집 당시 + 4 / -4)로 인해 다른 답변을 먼저 찾아 마지막으로 사용하십시오 . 나는 루트로 실행되는 네트워킹 응용 프로그램에 대해 이것을 한 번만 사용 했으며 정상적인 환경에서는이 솔루션을 사용해서는 안된다는 일반적인 의견에 동의합니다.

아래의 원래 답변 :

다른 답변은 모두 정확하지만이 문제를 해결하는 또 다른 방법은 사용자에게 앱의 배터리 최적화를 비활성화하도록 요청하는 것입니다 (앱이 시스템 관련이 아닌 한 일반적으로 좋은 생각은 아닙니다). Google Play에서 앱을 금지하지 않고 배터리 최적화를 거부하도록 요청하는 방법 은 이 답변 을 참조하십시오 .

다음을 통해 충돌을 방지하기 위해 수신기에서 배터리 최적화가 꺼져 있는지 확인해야합니다.

if (Build.VERSION.SDK_INT < 26 || getSystemService<PowerManager>()
        ?.isIgnoringBatteryOptimizations(packageName) != false) {
    startService(Intent(context, MyService::class.java))
} // else calling startService will result in crash

1
가능한 많은 배터리를 사용하여 사용자에게 무료 패스를 요청하는 것은 좋은 해결책이 아닙니다. 코드를보다 배터리 친화적 인 솔루션으로 변환 해보십시오. 귀하의 사용자는 감사합니다.
TALE

5
@TALE 모든 백그라운드 서비스를 사용하여 배터리를 쉽게 사용할 수있는 것은 아닙니다 JobScheduler. 일부 앱은 일반적인 동기화 애플리케이션보다 낮은 수준에서 작동해야합니다. 이것이 작동하지 않을 때 대안 솔루션입니다.
Mygod

-17

onStartCommand에서 사용하지 마십시오 :

return START_NOT_STICKY

그냥 다음으로 변경하십시오.

return START_STICKY

그리고 작동합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.