Closed tgyuuAn closed 2 weeks ago
core:designSystem
๋ชจ๋ ํ๋ฉด์์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๋คํธ์ํฌ ๊ฐ์ง๋ฅผ ๋ชจ๋ ํ๋ฉด์์ ํ ์ ์๋๋ก,
์๋์ ๊ฐ์ NetworkObserver๋ฅผ ๋ง๋ ๋ค,
class NetworkObserver @Inject constructor(context: Context) { private val _networkState = MutableStateFlow<NetworkState>(NetworkState.NONE) val networkState = _networkState.asStateFlow() private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager private val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { super.onAvailable(network) _networkState.value = NetworkState.CONNECTED } override fun onLost(network: Network) { super.onLost(network) _networkState.value = NetworkState.NOT_CONNECTED } } init { checkNetworkState() subscribeNetworkCallback() } fun checkNetworkState() { val caps = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) if (caps == null) { _networkState.value = NetworkState.NOT_CONNECTED return } _networkState.value = if (caps.hasTransport(TRANSPORT_WIFI) || caps.hasTransport(TRANSPORT_CELLULAR)) { NetworkState.CONNECTED } else { NetworkState.NOT_CONNECTED } } private fun subscribeNetworkCallback() { val networkRequest = NetworkRequest.Builder() .addTransportType(TRANSPORT_WIFI) .addTransportType(TRANSPORT_CELLULAR) .build() connectivityManager.registerNetworkCallback(networkRequest, networkCallback) } fun unsubscribeNetworkCallback() = connectivityManager.unregisterNetworkCallback(networkCallback) } enum class NetworkState { NONE, CONNECTED, NOT_CONNECTED }
์๋์ ๊ฐ์ด MainActivity์ ์ฌ์ด์ฃผ์์. ์ด ๋, ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ฒ ์ํด onDestroy()์์ ๋คํธ์ํฌ ๊ตฌ๋ ํด์ ์์ง ์๊ธฐ!
onDestroy()
@AndroidEntryPoint class MainActivity : ComponentActivity() { @Inject lateinit var networkObserver: NetworkObserver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... setContent { BaekyoungTheme { val networkState by networkObserver.networkState.collectAsStateWithLifecycle() if (networkState == NetworkState.NOT_CONNECTED) { BaekyoungDialog( title = "๋คํธ์ํฌ ์ํ๋ฅผ ํ์ธ ํด์ฃผ์ธ์.", description = "๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์คํจํ์์ต๋๋ค. ๋ค์ ์๋ํ์๊ฒ ์ด์?", leftButtonText = stringResource(R.string.cancel), rightButtonText = "์ค์ ", onLeftButtonClick = { finish() }, onRightButtonClick = { val intent = Intent(ACTION_WIFI_SETTINGS) startActivity(intent) }, ) } // ... } override fun onResume() { super.onResume() networkObserver.checkNetworkState() } override fun onDestroy() { super.onDestroy() networkObserver.unsubscribeNetworkCallback() } }
BaekyoungDialog( title = stringResource(id = string.network_dialog_title), description = stringResource(id = string.network_dialog_description), leftButtonText = stringResource(R.string.cancel), rightButtonText = stringResource(id = string.setting), onLeftButtonClick = { finish() }, // <-- MainAcitivty ์์ ์คํ๋๋ ์ฝ๋๋ผ ๋ฐ๋ก finish() ํธ์ถ ๊ฐ๋ฅ. onRightButtonClick = { val intent = Intent(ACTION_WIFI_SETTINGS) startActivity(intent) }, )
๊ทผ๋ฐ, finish() ๋ง๊ณ ๋ finishAffinity() ๋ ์๊ณ , finishAndRemoveTask() ๋ ์๋ค.
finish()
finishAffinity()
finishAndRemoveTask()
์์๊ฑฐ ๋ ๊ฐ์ ์ฐจ์ด๋ ์ ๋ชจ๋ฅด๊ฒ ๊ณ ,
2๋ฒ์งธ๋ ์ฑ ์ข ๋ฃ ํ์ ์ฑ ์๋(์ต๊ทผ ์คํ ์ฑ)์์ ์ฑ์ด ์ ์ง,
3 ๋ฒ์งธ๋ ์ฑ ์๋์์๋ ์ฑ์ด ์์ด์ง.
๋ ํผ๋ฐ์ค
1. ๐ ๊ด๋ จ๋ ์ด์ ๋ฐ ์๊ฐ
2. ๐ฅ๋ณ๊ฒฝ๋ ์
core:designSystem
์ผ๋ก ์ปดํฌ๋ํธ ๋ถ๋ฆฌ3. ๐ธ ์คํฌ๋ฆฐ์ท(์ ํ)
4. ๐ก์๊ฒ๋ ํน์ ๊ถ๊ธํ ์ฌํญ๋ค
๋ชจ๋ ํ๋ฉด์์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๋คํธ์ํฌ ๊ฐ์ง๋ฅผ ๋ชจ๋ ํ๋ฉด์์ ํ ์ ์๋๋ก,
์๋์ ๊ฐ์ NetworkObserver๋ฅผ ๋ง๋ ๋ค,
์๋์ ๊ฐ์ด MainActivity์ ์ฌ์ด์ฃผ์์. ์ด ๋, ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ฒ ์ํด
onDestroy()
์์ ๋คํธ์ํฌ ๊ตฌ๋ ํด์ ์์ง ์๊ธฐ!Compose์์ ์ฑ ์ข ๋ฃ ๋ฐฉ๋ฒ
๊ทผ๋ฐ,
finish()
๋ง๊ณ ๋finishAffinity()
๋ ์๊ณ ,finishAndRemoveTask()
๋ ์๋ค.์์๊ฑฐ ๋ ๊ฐ์ ์ฐจ์ด๋ ์ ๋ชจ๋ฅด๊ฒ ๊ณ ,
2๋ฒ์งธ๋ ์ฑ ์ข ๋ฃ ํ์ ์ฑ ์๋(์ต๊ทผ ์คํ ์ฑ)์์ ์ฑ์ด ์ ์ง,
3 ๋ฒ์งธ๋ ์ฑ ์๋์์๋ ์ฑ์ด ์์ด์ง.
๋ ํผ๋ฐ์ค