안드로이드 서비스 공부중인데 질문있습니다.

조회수 2086회
public class MainActivity extends AppCompatActivity {

    Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onButton1Clicked(View v) {
        intent = new Intent(this, BaseService.class);
        startService(intent);
    }
    public void onButton2Clicked(View v) {
        intent = new Intent(this, BaseService.class);
        stopService(intent);
    }
}


///////////////////////////////////////////////////////////////////////////////////////


public class BaseService extends Service {

    Boolean running = true;
    int count = 1;
    public BaseService() {
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (running) {
                    try {
                        Log.d("BaseService", count + "번 서비스가 작동");
                        count++;
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        Log.e("BaseService", e.toString());
                    }
                }
            }
        });
        thread.start();
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        running = false;
        super.onDestroy();
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

위의 예제는 버튼을 누르면 버튼1을 누르면 서비스가 시작되며 카운트가 증가하고 버튼 2를 누르면 서비스가 종료되는 방식입니다. 실행하는데 있어 예제 자체는 아무문제가 없지만 궁금한게 있어 질문드립니다.

제가 버튼 1을 눌러 서비스를 실행시키고 어플을 종료하면 몇 초뒤 카운트가 초기화되어 0부터 다시 서비스가 시작됩니다. 혹시 카운트가 다시 시작되는 이유를 알수 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 서비스가 시스템에 의해 종료되었다가 다시 실행된 케이스로 보입니다. 서비스는 시스템에 의해 종료될 수 있고, onStartCommand() 함수 반환값에 의해 서비스를 재시작할지를 판단합니다.

    올려주신 코드에서 super.onStartCommand() 값을 반환했기 때문에 디폴트 값인 START_STICKY(or START_STICKY_COMPATIBILITY)로 동작하는데요. START_STICKY는 서비스가 강제종료 됐을 때, 다시 실행시켜 달라는 설정입니다. 따라서 서비스가 다시 시작되면서 카운트가 0부터 실행됐다가 볼 수 있습니다.

    관련 설명은 아래 링크를 참고하시기 바랍니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 서비스가 시스템에 종료되지 않게 하려면 어떻게 해야 하나요? 알 수 없는 사용자 2017.4.15 18:39
    • 포그라운드에서 서비스를 실행해서 서비스의 우선순위를 높일 수(종료될 가능성이 낮아짐) 있습니다. 예를 들면 안드로이드의 음악 앱 또는 운동 앱이 사용자가 앱을 떠나더라도 상태표시줄에 앱의 상태를 보여주면서 백그라운드에서 실행되는 방식을 떠올리면 됩니다. 자세한 코드 및 설명은 다음 링크를 확인하세요. https://developer.android.com/guide/components/services.html?hl=ko#Foreground 알 수 없는 사용자 2017.4.15 19:57

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)