startService 메소드를 호출할 때도 인텐트 객체를 파라미터로 전달해야 하며 이 인텐트 객체는 시스템으로 전달된 후 시스템에서 지정한 서비스를 만들고 실행하는 과정을 거치게 됩니다.
서비스로의 명령 전달
서비스가 자동으로 재시작되게 하는 것이 일반적이다 보니 앱이 실행된 후에 startService 메소드를 이용해 서비스를 시작시키기만 하면 더 이상 startService 메소드를 호출할 일이 없지 않을까요?
그렇지 않습니다.
이미 알고 있는 것처럼 인텐트를 이용해 서비스를 시작시키면 인텐트 객체가 서비스로도 전달됩니다.
그리고 그 안에 부가데이터를 넣어 전달할 수 있으므로 서비스로 데이터를 전달하고 싶은 경우에는 startService가 더 자주 호출될 수 있습니다.
그런데 이 때의 startService 메소드는 서비스를 시작시키기 위한 목적이 아니라 명령이나 데이터를 전달하기 위한 용도로 사용됩니다.
이렇게 startService 메소드를 호출하면서 인텐트 안에 넣어 전달한 명령이나 데이터를 잘 처리할 수 있도록 onStartCommand라는 메소드를 사용할 수 있습니다.
새로운 서비스 클래스를 정의할 때는 다음과 같이 onCreate, onStartCommand, onDestroy 메소드를 재정의하는 경우가 많습니다.
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() 호출됨.");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() 호출됨.");
return super.onStartCommand(intent, flags, startId);
}
}
onStartCommand 메소드가 호출되면 인텐트 객체를 파라미터로 전달받을 수 있습니다.
따라서 인텐트 안에 들어있는 명령이나 데이터를 확인하여 필요한 기능을 수행할 수 있습니다.
서비스에서 액티비티로 데이터 전달
서비스에는 화면이 없다 보니 사용자에게 무언가를 보여주고 싶다면 액티비티로 데이터를 전달한 후 액티비티에서 보여주어야 합니다.
서비스에서 액티비티로 데이터를 전달할 때는 인텐트를 사용하며 인텐트 안에 부가데이터를 넣어 보냅니다.
Intent showIntent = new Intent(getApplicationContext(), MainActivity.class);
showIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
showIntent.putExtra("command", "show");
showIntent.putExtra("name", "mike");
startActivity(showIntent);
화면이 없는 서비스에서 화면이 있는 액티비티를 띄울 때는 태스크(Task)를 새로 만들어서 연결해야 합니다.
이 때문에 FLAG_ACTIVITY_NEW_TASK 플래그를 추가해주게 되는데 일반적인 경우 세 개의 플래그를 같이 사용합니다.
액티비티가 화면에 보인 상태에서 위와 같이 startActivity를 호출하면 액티비티는 새로 만들어지지 않고 기존 액티비티를 그대로 사용하게 됩니다.
그리고 액티비티의 onNewIntent 메소드가 자동으로 호출됩니다.
@Override
protected void onNewIntent(Intent intent) {
processIntent(intent);
super.onNewIntent(intent);
}
최근댓글