2017-10-26 1 views
0

나는 service을 작성하여 새로운 작업을 수행하기 위해 thread을 시작합니다. 안드로이드 O에서, serviceforeground service이 아닌 경우 안드로이드 문서에 따르면 시스템에 의해 중지됩니다. 그러나 다음 코드를 테스트 한 결과 service은 파괴되었지만 thread은 여전히 ​​실행 중입니다.배터리 소모를 줄이기 위해 Android O가 백그라운드 서비스에 미치는 영향은 무엇입니까?

제 질문은 service이 중지 되더라도 스레드가 실행되도록 허용되면 시스템이 사용자의 배터리를 절약하는 방법입니다.

MainActivity

public class MainActivity extends AppCompatActivity { 

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

    public void startService(View view) { 
    Intent intent = new Intent(this, MyService.class); 
    startService(intent); 
    } 

    public void stopService(View view) { 
    stopService(new Intent(this, MyService.class)); 
    } 

} 

이면 MyService

public class MyService extends Service { 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
    return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
     while (true) { 
      try { 
      Thread.sleep(1000); 
      } catch (InterruptedException e) { 
      e.printStackTrace(); 
      } 
      System.out.println("run in service: "); 
     } 
     } 
    }).start(); 

    return START_NOT_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
    super.onDestroy(); 
    System.out.println("service onDestroy"); 
    } 

} 

답변

0

서비스는 지속적으로 주 스레드에서 안드로이드의 이전 버전의 백그라운드에서 실행됩니다. Android O에서 JobService은 특정 작업에 대한 작업을 예약하고 작업이 완료되면 다음 번에 JobService 인스턴스와 일정을 종료합니다. (JobService는 백그라운드에서 계속 실행되지 않음).

어떻게 배터리 드레인이 배경에서 감소하는지.

Please refer this for Demo

+0

그의 질문에 전혀 대답하지 않습니다 –

+0

그래서 서비스 + 스레드 방식을 사용하면 안드로이드 O 배경 제한이 저에게 영향을 미치지 않을 것입니다, 맞습니까? – akabc

+0

Android O에서 앱이 포 그라운드에서 실행되는 경우 JobService 만 실행됩니다. 앱이 포 그라운드가 아닌 경우 서비스와 스레드가 삭제됩니다. – Bhushan

0

당신은 더 이상 시간이 동작을 테스트 했습니까? 필자는 작업자 스레드를 내부에서 실행하는 서비스 (기본 스레드를 통해 시작됨)와 동일한 설정을 사용했습니다. 2 ~ 3 일과 같은 더 긴 기간 동안 설정을 테스트 할 때. 시스템이 전체 프로세스를 종료한다는 것을 알 수 있습니다. 따라서 작업자 스레드로 백그라운드 실행을 수행 할 수는 없습니다. 더 나은 방법은 주기적 또는 시간 초과 작업을 사용하는 것입니다.

관련 문제