본문 바로가기
#모바일 [Mobile]/Android

[Android] Service

by cy_mos 2019. 6. 25.
반응형

📣 Service

  • A Service is an application component that can perform long-running operations in the background, and it doesn't provide a user interface. Another application component can start a service, and it continues to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service can handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.
📄 Service Manifest Source Code
<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>

📚 Service Type

1️⃣ StartService

  • 서비스가 "시작된" 상태가 되려면 애플리케이션 구성 요소(예: 액티비티)가 startService()를 호출하여 시작하면 됩니다. 서비스는 한 번 시작되고 나면 백그라운드에서 무기한으로 실행될 수 있으며, 이는 해당 서비스를 시작한 구성 요소가 소멸되었더라도 무관합니다. 보통, 시작된 서비스는 한 작업을 수행하고 결과를 호출자에게 반환하지 않습니다. 예를 들어 네트워크에서 파일을 다운로드하거나 업로드할 수 있습니다. 작업을 완료하면, 해당 서비스는 알아서 중단되는 것이 정상입니다.
📄 StartService Type Service Source Code
public class TestService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        /*  TODO (Internal bindService)
            Service 객체와 (화면단 Activity 사이에서) 통신(데이터를 주고받을) 할 때 사용하는 메서드이다.
            데이터를 전달할 필요가 없으면 return null;
         */
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.e("SERVICE - onCreate()", "Service Create...");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("RECEIVE", intent.getStringExtra("TEST"));
        Log.e("SERVICE - onStart()", "Service onStartCommand()...");

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.e("SERVICE - onDestroy()", "Service onDestroy()...");
    }
}
📄 StartService Type Activity Source Code
final Intent intent = new Intent(
      this,
      TestService.class           // SERVICE CLASS NAME
);

intent.putExtra("TEST", "ACTIVITY TO SERVICE");

startService(intent);   // START SERIVCE
stopService(intent);    // STOP SERVICE

2️⃣ BindService

  • 애플리케이션 구성 요소가 bindService()를 호출하여 해당 서비스에 바인드되면 서비스가 "바인드"됩니다. 바인드된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성 요소가 서비스와 상호작용할 수 있도록 해주며, 결과를 가져올 수도 있고 심지어 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스 간 통신(IPC)으로 수행할 수도 있습니다. 바인드된 서비스는 또 다른 애플리케이션 구성 요소가 이에 바인드되어 있는 경우에만 실행됩니다. 여러 개의 구성 요소가 서비스에 한꺼번에 바인드될 수 있지만, 이 모든 것이 바인딩을 해제하면 해당 서비스는 소멸됩니다.
📄 BindService Type Service Source Code
public class TestService extends Service {

    IBinder mIBinder = new TestServiceBinder();

    class TestServiceBinder extends Binder {
        TestService getService() {
            return TestService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        /*  TODO (Internal bindService)
            Service 객체와 (화면단 Activity 사이에서) 통신(데이터를 주고받을) 할 때 사용하는 메서드이다.
            데이터를 전달할 필요가 없으면 return null;
         */
        Log.e("BIND SERVICE", "Service onBind()...");
        return this.mIBinder;
    }

    @Override
    public void unbindService(ServiceConnection conn) {
        super.unbindService(conn);
        Log.e("UNBIND SERVICE", "Service onBind()...");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("SERVICE - onCreate()", "Service Create...");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("SERVICE - onStart()", "Service onStartCommand()...");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("SERVICE - onDestroy()", "Service onDestroy()...");
    }
}
📄 BindService Type Activity Source Code
private TestService service;

ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            // MARK: - 서비스와 연결이 되었을 때 호출되는 메서드
            TestService.TestServiceBinder binder = (TestService.TestServiceBinder) iBinder;
            service = binder.getService();

            Log.e("START BIND SERVICE", "START BIND SERVICE...");
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            // MARK: - 서비스와 연결이 끊기거나 종료되었을 때 호출되는 메서드
            Log.e("END BIND SERVICE", "ERROR BIND SERVICE...");
        }
};

bindService(intent, this.connection, Context.BIND_AUTO_CREATE);

unbindService(this.connection);    

🔍 Choosing between a service and a thread

  • A service is simply a component that can run in the background, even when the user is not interacting with your application, so you should create a service only if that is what you need.

    If you must perform work outside of your main thread, but only while the user is interacting with your application, you should instead create a new thread. For example, if you want to play some music, but only while your activity is running, you might create a thread in onCreate(), start running it in onStart(), and stop it in onStop(). Also consider using AsyncTask or HandlerThread instead of the traditional Thread class. See the Processes and Threading document for more information about threads.

    Remember that if you do use a service, it still runs in your application's main thread by default, so you should still create a new thread within the service if it performs intensive or blocking operations.


📣 REFERENCE

반응형

댓글