Development record of developer who study hard everyday.

레이블이 안드로이드백그라운드확인인 게시물을 표시합니다. 모든 게시물 표시
레이블이 안드로이드백그라운드확인인 게시물을 표시합니다. 모든 게시물 표시
, ,

안드로이드 백그라운드 포그라운드 확인 방법 예제 코드(LifecycleEventObserver 추가)

 안드로이드 백그라운드와 포그라운드 확인 방법

안드로이드 블로그

회사에서 유지보수하는 프로젝트 중에 푸시 알림을 포그라운드와 백그라운드에서 다르게 처리하는 앱이 있었다.

포그라운드일 때는 푸시 알림을 받아서 스낵바를 띄워준다.

백그라운드에서는 푸시를 보내준다.

그래서 앱이 백그라운드인지 포그라운드인지를 확인하는 코드가 필요했다.

1. ForegroundDetector 클래스 만들기

앱의 포그라운드, 백그라운드 상태를 탐지해주는 로직을 담는 클래스를 만들자.

class ForegroundDetector : Application.ActivityLifecycleCallbacks {
    //현재 앱의 상태 enum으로 표시
enum class State {
None, Foreground, Background
}

val TAG = this::class.java.simpleName
protected var state = State.None
private lateinit var listener: Listener
private var isChangingConfigurations = false    //가로 세로 바뀌는건지
private var running = 0                         //앱 켜져있는지

companion object {//싱글톤
private var instance: ForegroundDetector? = null

private lateinit var mApplication: Application

fun getInstance(application: Application) : ForegroundDetector {
return instance ?: synchronized(this) {
instance ?: ForegroundDetector().also {
mApplication = application                     //생성자 만들면서 ActivityLifecycleCallback 등록하기
mApplication.registerActivityLifecycleCallbacks(it)
instance = it
}
}
}
}

interface Listener {
fun onBecameForeground()
fun onBecameBackground()
}

fun printMsg(msg: String) {
Log.d(TAG, "printMsg: $msg")
}

fun unregisterCallbacks() {
mApplication.unregisterActivityLifecycleCallbacks(this)
}

fun addListener(listener : Listener) {
state = State.None
this.listener = listener
}

fun removeListener() {
state = State.None
}
    //앱이 백그라운드인지 확인
fun isBackground() = state == State.Background
    //앱이 포그라운드인지 확인
fun isForeground() = state == State.Foreground

override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
    //Activity가 onStart()될 때 호출된다.
override fun onActivityStarted(activity: Activity) {
if(++running == 1 && !isChangingConfigurations) {         //앱이 켜진 상태여야하고 가로세로가 바뀌는 상황이 아니여야함.
state = State.Foreground
if(this::listener.isInitialized) listener.onBecameForeground()
}
}

override fun onActivityResumed(activity: Activity) {
}

override fun onActivityPaused(activity: Activity) {
}
    //Activity가 onStop()될 때 호출된다.
override fun onActivityStopped(activity: Activity) {
isChangingConfigurations = activity.isChangingConfigurations         //앱이 꺼진 상태여야하고 가로세로 변화는 상황이 아니여야함
if(--running == 0 && !isChangingConfigurations) {
state = State.Background
if(this::listener.isInitialized) listener.onBecameBackground()
}

}

override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}

override fun onActivityDestroyed(activity: Activity) {
}

}


2. Application 클래스에서 초기화

class BaseApplication : Application()  {

private val TAG = "BaseApplication"

override fun onCreate() {
super.onCreate()

//bjs
ForegroundDetector.getInstance(this).addListener(object : ForegroundDetector.Listener {
override fun onBecameForeground() {
Log.d(TAG, "onBecameForeground")
}

override fun onBecameBackground() {
Log.d(TAG, "onBecameBackground")
}
})
}

override fun onTerminate() {
super.onTerminate()
ForegroundDetector.getInstance(this).unregisterCallbacks()
}


}

Application 클래스에서 onCreate에서 ForegroundDetector 객체를 만들어주고 Listener를 등록해준다.

onTerminate에서 Application.ActivityLifecycleCallback을 해제해준다.


Share:
Read More