Nuke Olaf - Log Store

[Android] 안드로이드 - 앱 종료, 재시작 본문

Android

[Android] 안드로이드 - 앱 종료, 재시작

NukeOlaf 2020. 5. 8. 02:40

액티비티 백 스택을 전부 clear 하고, 새로운 액티비티를 시작하고 싶었다.

val intent = Intent(this, LoginActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
finish()

그러나, 위의 액티비티 플래그가 제대로 먹히지 않아서 finishAffinity() 를 사용했다.

affinity 는 액티비티가 속한 task 를 말한다. 기본적으로 한 앱의 모든 액티비티들은 모두 같은 task 에 속해있다.
그러나, 한 액티비티의  기본 affinity 를 다르게 수정할 수 있다. 다른 앱에 정의된 액티비티끼리 affinity 를 공유하거나, 동일한 앱의 액티비티끼리 다른 affinity 를 가지게 할 수 있다.

startActivity() 가 FLAG_ACTIVITY_NEW_TASK 플래그를 포함하는 경우, 새로 생성된 액티비티는 기존의 액티비티와 다른 affinity 를 가지게 된다.

안드로이드 공식문서 Handling affinities : https://developer.android.com/guide/components/activities/tasks-and-back-stack#Affinities

 

보통 액티비티를 종료할때 finish()를 많이 사용한다.

하지만 이렇게 종료하면 현재 액티비티만을 종료시킬 뿐 루트 액티비티는 그대로 남아있다

여기서 루트액티비티와 현액티비티를 모두 종료시켜 앱을끄고 싶다면 아래와 같은방법을 사용하자

// 해당 앱의 루트 액티비티를 종료
// (API  16미만은 ActivityCompat.finishAffinity())
Activity.finishAffinity()

// 현재 작업중인 쓰레드가 다 종료되면, 종료 시키라는 명령어
System.runFinalization()

// 현재 액티비티를 종료시킨다.
System.exit(0) 

 

앱을 재시작 하고싶다면

finishAffinity()
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
System.exit(0)

 

System.exit(0) 으로 앱을 종료시키는 경우 앱과 관련된 프로세스나 블루투스 기기들이 전부 해제된다.

이를 원하지 않을시에는 해당 코드를 제거하면 된다

 

출처 >>>

https://mparchive.tistory.com/81

https://rlg1133.tistory.com/20

Comments