2016-06-01 7 views
1

두 개의 버튼으로 시작하고 중지하는 백그라운드 서비스를 만들어야합니다. 내 서비스는 5 분마다 순환되며 온라인 데이터베이스에서 데이터를 가져옵니다. 나는 IntentService 클래스가 루프에 사용되지 않는 어딘가를 읽었다. onStartCommand를 재정 의하여 START_STICKY를 반환합니다. 내가이 수업에서 그렇게한다면 내 봉사가 시작되지 않는다. 어떻게해야합니까?Android 서비스에 루프가 있습니까?

public class MainActivity extends AppCompatActivity { 

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

    public void start(View view){ 
     startService(new Intent(this, ForegroundService.class)); 
    } 

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




public class ForegroundService extends IntentService{ 

    private boolean stato; 


    public ForegroundService(){ 
     super("ForegroundService"); 
    } 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    protected void onHandleIntent(Intent i){ 
     stato = true; 
     int n=0; 
     while(stato) 
     { 
      Log.i("PROVA SERVICE", "Evento n."+n++); 
      try { 
       Thread.sleep(1000); 
      } 
      catch (InterruptedException e) 
      { } 
     } 
    } 

    @Override 
    public void onDestroy() { 
     stato = false; 
     Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
     super.onDestroy(); 
    } 

} 

답변

0

Only have a service running when it is actively delivering value to the user. 앉아서 시계 틱을 보는 것은 적극적으로 사용자에게 가치를 전달하지 않습니다.

또한 5 분마다 순환하고 온라인 데이터베이스에서 데이터를 가져옵니다. 원하는 내용이 사용자가 원하는 것은 아니며 Google이 원하는 것이 아닐 수도 있습니다. 너무 많은 개발자가 이와 같은 작업을하고 있으며 결과적으로 배터리 수명이 길어지고 있습니다.

일반적으로 귀하의 최선의 해결책은 JobScheduler이며 minSdkVersion이 21 미만인 경우 AlarmManager으로 다시 떨어질 수 있습니다. 둘 다 정기적 인 작업을 예약 할 수 있습니다. 당신의 프로세스는 그 사이에 실행될 필요가 없습니다. JobScheduler 또는 AlarmManager에게 작업 실행 빈도를 가르치고 JobService 또는 IntentService으로 작업하십시오.

Android 6.0 이상에서는 사용자가 설정 앱을 통해 Android에만 앱을 남겨 두라고 말하지 않으면 앱이 결국 Doze mode or app standby mode을 입력하고 5 분마다 제어를받을 수 없습니다.

+0

내 마음을 열었습니다! 저는 다음 시간에 AlarmManager를 공부하고 있습니다. Android 6.0+ 정보 setAndAllowWhileIdle() 또는 setExactAndAllowWhileIdle()을 사용할 수 있습니다. 작동 할 때 여기에 새 코드를 대답으로 게시 할 것입니다. 감사합니다! –