반응형
Service
- 안드로이드 4대 구성요소 중 하나
- 백그라운드 프로세싱을 위해 제공되는 요소
- 화면을 가지고 있지 않아 보이지 않는 동안에도 동작하는 것을 의미 (<-> 액티비티는 화면을 갖기에 화면이 보이는 동안만 동작)
- 보통 서비스 안에서 스레드를 운영해 사용
* 안드로이드 스튜디오의 intentService 클래스는 내부적으로 스레드 구조로 만들어진 클래스인데 안드 11 버전 부터 더이상 사용 X 권장)
Foreground Service
- 백그라운드에서 운영되는 service가 메모리 부족/절전모드/보안이상의 이유로 장시간 서비스는 중지 등의 상황에서 안드 OS에 의해 제거 되는 경우를 방지하기 위해 -> Foreground Service 로 만들어 사용할 수 있음 (함부로 제거 X)
- Foreground Service 외의 서비스는 안드 OS에 의해 제거될 수 있음
- 현재 백그라운드 작업중이라는 것을 사용자에게 Notificatoin으로 고지하면서 동작하는 서비스
class TestService : Service() {
var isRunning = true
override fun onBind(intent: Intent): IBinder {
TODO("Return the communication channel to the service.")
}
// 서비스가 가동될 때 호출되는 메서드 // 해당 서비스클래스의 인스턴스 객체 생성
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("test","서비스 가동")
// 안드 8.0 이상부터
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channel = NotificationChannel("Sevice","service",NotificationManager.IMPORTANCE_HIGH)
channel.enableLights(true)
channel.lightColor =Color.RED
channel.enableVibration(true)
manager.createNotificationChannel(channel)
val builder = NotificationCompat.Builder(this, "Sevice")
builder.setSmallIcon(android.R.drawable.ic_menu_search)
builder.setContentTitle("서비스 가동")
builder.setContentText("서비스가 가동중입니다.")
val notification = builder.build()
// 알림 메시지를 foreground 서비스를 위해 표시한다.
// targetSdk 28 이상에서는 permission 등록 필요
startForeground(10, notification) // 서비스 가동시 알림 뜨고, 서비스 종료시 자동으로 사라짐 (종료 전엔 못 없앰)
}
// 스레드 운영 // 액티비티를 종료하더라도 서비스는 계속 가동 (별개로 동작)
isRunning = true
thread {
while (isRunning) {
SystemClock.sleep(500)
val now = System.currentTimeMillis()
Log.d("test", "Service : ${now}")
}
}
return super.onStartCommand(intent, flags, startId)
}
// 서비스가 중지되고 소멸될 때 호출 (액티비티와 다르게 소멸만 존재 -> 백그라운드 실행이라 일시중지의 개념 X, 시작/종료 2가지뿐!)
override fun onDestroy() {
super.onDestroy()
isRunning = false
Log.d("test","서비스 증지")
}
}
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
* targetSdkVersion 28 이상에서는 Manifest 에 foreground service 권한 등록 필요
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
val serviceIntent = Intent(this, TestService::class.java) // Intent 객체 만들어 실행 (필요시 데이터 전달 가능)
// 기본 리스트 다이얼로그 (다이얼로그에 리트스뷰를 넣어 커스텀 한다고 생각하면 됨)
binding.button.setOnClickListener {
// 서비스 가동 -> onStartCommand 호출
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(serviceIntent)
} else {
startService(serviceIntent)
}
}
binding.button2.setOnClickListener {
// 서비스 종료 -> onDestroy 호출
stopService(serviceIntent)
}
}
}
반응형
'Android' 카테고리의 다른 글
[안드로이드/Fragment] Fragment 란? (0) | 2023.04.21 |
---|---|
[안드로이드/Service] IPC 란? (0) | 2023.04.20 |
[안드로이드/Recevier] 시스템 메시지 (System Message) (0) | 2023.04.19 |
[안드로이드/Recevier] BroadCastReceiver 란? (0) | 2023.04.17 |
[안드로이드/Thread] RunOnUiThread (0) | 2023.04.17 |