본문 바로가기
Kotlin/Kotlin 팁

안드로이드 포어그라운드 사용

by MonoSoft 2020. 10. 15.
728x90
반응형

포어그라운 : 다중 프로그래밍에서, 한 프로세스가 다른 프로세스보다 우선권을 가지고 실행하는 일.

 

 

새로운 서비스를 추가하고 Foreground라고 명칭을 하고 저장한다.

 

안드로이드에다가 사용허가를 구한다. xml에 위와 같이 적는다.

 

 

 

 

 

새로 추가한 Foreground에 위와 같은 코딩을 해준다.

 

 

 

메인 엑티비에다가도 코딩해준다.

 

 

화면으로 돌아가 메인 액티비티에 적은 함수를 연결시켜준다.

 

 

결과 영상

 

 

 

-------------실제 코딩 

MainActivity.kt

package com.monosoft.foregroundservice

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat

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

//포어그라운드 foreground :다중 프로그래밍에서,
//한 프로세스가 다른 프로세스보다 우선권을 가지고 실행하는 일.
//foreground Serviece : 서비스와 노티피케이션(notify 제일상단알림) 과 함께 보여주는것
}

fun serviceStart(view:View) {
val intent = Intent(this,Foreground::class.java)
ContextCompat.startForegroundService(this,intent)
}

fun serviceStop(view:View) {
val intent = Intent(this,Foreground::class.java)
stopService(intent)
}


}

 

AndroidMainifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.monosoft.foregroundservice">

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ForegroundService">
<service
android:name=".Foreground"
android:enabled="true"
android:exported="true"></service>

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

 

foregroundservice

package com.monosoft.foregroundservice

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Intent
import android.os.Binder
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.core.app.NotificationCompat
import kotlin.concurrent.thread


class Foreground : Service() {

//노티피케이션 채널 아이디
val CHANNEL_ID = "FGS153"
val NOTI_ID = 153

//Notification 채널을 만드는 함수
fun createNotificationChannel() {
//버전 체크 (오레오 이상일때만)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//서비스 채널 생성 NotificationChannel 활용
val serviceChannel = NotificationChannel(CHANNEL_ID,
"FOREGROUND",
NotificationManager.IMPORTANCE_DEFAULT)

//채널을 사용하겠다고 알려줘야된다.
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(serviceChannel)
}
}



override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//채널을 알린다.
createNotificationChannel()
val notification = NotificationCompat.Builder(this,CHANNEL_ID)
.setContentTitle("모노소프트 서비스")
.setSmallIcon(R.mipmap.ic_launcher_round)
.build()

startForeground(NOTI_ID,notification)

runBackground()

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

//돌아가는거 확인하는 함수 카운트
fun runBackground() {
thread ( start=true ) {
for(i in 0..100) {
Thread.sleep(1000)
Log.d("서비스", "Count=${i}")
}
}
}


override fun onBind(intent: Intent): IBinder {
return Binder()
}
}








 

 

 

728x90
반응형

댓글