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 |