Deperecated/Android_강의

안드로이드 - 서비스

누알라리 2020. 2. 19. 04:35
1. 서비스란?

- 안드로이드 4대 구성요소 중 하나로 백그라운드 처리를 위해 제공되는 요소이다.

- Activity는 화면을 가지고있어 화면이 보이는 동안 동작하지만 Service는 화면을 가지고있지 않아 보이지 않는 동안에도 동작하는 것을 의미한다.

 

2. 서비스 만들기 예제

1. app -> New -> Service로 Service클래스를 상속하는 클래스를 만들어준다.

 

- StartService()가 불리면 서비스클래스에서 자동으로 onStartCommand()가 호출된다.

- StopService()가 불리면 서비스클래스에서 자동으로 onDestroy()가 호출된다.

class ServiceClass1 : Service() {

    override fun onBind(intent: Intent): IBinder {
        TODO("Return the communication channel to the service.")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {


        // 5. 시작하면 불리는 메소드에 쓰레드 start()처리.
        var thread = ThreadClass()
        thread.start()

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


    // 6. 서비스가 종료되면 불리는 메서드.
    override fun onDestroy() {
        super.onDestroy()

        Log.d("test1", "서비스 실행 종료!")
    }

    // 4. 시작하면 쓰레드에서 작업처리를 하기 위해 스레드 하나 생성.
    inner class ThreadClass : Thread(){

        override fun run() {
            var idx = 0
            while(idx <10)
            {
                SystemClock.sleep(100)
                var time = System.currentTimeMillis()
                Log.d("test1", "Service Running : ${time}")

                idx++
            }
        }

    }
}

 

2. Main에서 Intent에 서비스클래스를 등록해준뒤, StartService(), StopService()로 가동/종료가 가능하다.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1. 서비스 가동
        button.setOnClickListener {  view ->
            survice_intent = Intent(this, ServiceClass1::class.java)
            startService(survice_intent)
        }

        // 2. 서비스 종료
        button2.setOnClickListener { view ->
            stopService(survice_intent)
        }
    }

 

3. Intent Service

- Intent Service는 Service 내부에서 Thread를 운영하고자 할 때 사용하는 서비스 이다.

 

* onHandleIntent()

- onStartCommand()가 호출되고 자동으로 호출되는 메서드

- 일반 Thread 처럼 동작하므로 우리가 Thread로 따로 처리하고싶은 코드를 다 여기다가 넣어주면 된다.

class ServiceClass2 : IntentService("ServiceClass2") {

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return super.onStartCommand(intent, flags, startId)
    }

    // 5.
    // onStartCommand()가 호출되고 자동으로 호출되는 메서드.
    // 일반 Thread 처럼 동작하므로 우리가 Thread로 따로 처리하고싶은 코드를 다 여기다가 넣어주면 된다.
    override fun onHandleIntent(intent: Intent?) {

        var idx = 0
        while(idx <10)
        {
            SystemClock.sleep(100)
            var time = System.currentTimeMillis()
            Log.d("test2", "Service Running : ${time}")

            idx++
        }
    }
}
        // 3. 인텐트 서비스 가동
        button3.setOnClickListener { view ->
            survice_intent = Intent(this, ServiceClass2::class.java)
            startService(survice_intent)
        }

 

4. Forground Service

- 서비스는 기본적으로 백그라운드에서 운영되는 실행 요소로써 메모리가 부족해지거나 하면 안드로이드OS에 의해 실행중지 -> 제거된다.

- 이를 방지하고자 할 때는 Forground Service로 만들어 사용하면 된다.

- 안드로이드 8.0부터는 이 서비스를 이용하는걸 권장하고있다.

- 안드로이드 8.0부터는 startForgroundservice()함수를 써야하고, 5초안에 Notification을 해주지않으면 서비스가 강제종료된다.

 

        // 4. 포그라운드 서비스 가동
        button4.setOnClickListener { view ->
            survice_intent = Intent(this, ServiceClass3::class.java)
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            {
                startForegroundService(survice_intent)
            }
            else {
                startService(survice_intent)
            }
        }
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

        // 6. 안드로이드 8.0 이상부터는 포그라운드 서비스 실행 후 5초 안에 노티피케이션을 띄워주지않으면 서비스가 강제 종료된다.
        var builder : NotificationCompat.Builder? = null


        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        {
            var manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            var channel = NotificationChannel("test1", "service", NotificationManager.IMPORTANCE_HIGH)
            channel.enableLights(true)
            channel.lightColor = Color.RED
            channel.enableVibration(true)
            manager.createNotificationChannel(channel)

            builder = NotificationCompat.Builder(this, "test1")
        }
        else {
            builder = NotificationCompat.Builder(this)
        }

        builder?.setSmallIcon(android.R.drawable.ic_menu_search)
        builder?.setContentTitle("서비스 가동")
        builder?.setContentText("서비스가 가동중입니다")

        var notification = builder?.build()

        startForeground(10, notification)


        // 5. 시작하면 불리는 메소드에 쓰레드 start()처리.
        var thread = ThreadClass()
        thread.start()

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

    inner class ThreadClass : Thread(){

        override fun run() {
            var idx = 0
            while(idx <10)
            {
                SystemClock.sleep(100)
                var time = System.currentTimeMillis()
                Log.d("test3", "Service Running : ${time}")

                idx++
            }
        }

    }
}

'Deperecated > Android_강의' 카테고리의 다른 글

안드로이드 - Fragment  (0) 2020.02.19
안드로이드 - Fragment - IPC  (0) 2020.02.19
안드로이드 - 시스템 메세지  (0) 2020.02.19
안드로이드 - BroadCastReceiver  (0) 2020.02.19
안드로이드 - Activity Action  (0) 2020.02.19