-
-
Notifications
You must be signed in to change notification settings - Fork 162
Open
Description
There is an issue with lifecycle when you manually restart activity.
For example, we have a screen that collects flow while visible. When you click on the Restart activity button flow collection resumes and stops forever. TimerManager just emits a value to the flow each second.
class BasicNavigationActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Navigator(screen = LifecycleIssueScreen())
}
}
}
internal class LifecycleIssueScreen : Screen {
@Composable
override fun Content() {
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(Unit) {
Log.d("Lifecycle_issue", "Screen started")
onDispose {
Log.d("Lifecycle_issue", "Screen disposed")
}
}
LaunchedEffect(Unit) {
TimerManager.currentTime
.flowWithLifecycle(lifecycleOwner.lifecycle)
.collect {
Log.d("Lifecycle_issue", "Received timer update $it")
}
}
val activity = LocalContext.current as Activity
Box(modifier = Modifier.fillMaxSize()) {
Button(
modifier = Modifier.align(Alignment.Center),
onClick = {
val intent = Intent(activity, BasicNavigationActivity::class.java)
activity.startActivity(intent)
activity.finish()
Log.d("Lifecycle_issue", "Activity restarted")
}
) {
Text("Restart activity")
}
}
}
}The root cause of this issue is that the same instance of AndroidScreenLifecycleOwner is used by different activities:
- App launched
- First
BasicNavigationActivityinstance is created AndroidScreenLifecycleOwneris created- Restart activity
- The second
BasicNavigationActivityinstance is created, it starts displaying content, and since theScreenLifecycleStoresingleton we already haveAndroidScreenLifecycleOwner→Navigatorstarts using the existingAndroidScreenLifecycleOwner - First instance of
BasicNavigationActivityis stopped →NavigatordisposesAndroidScreenLifecycleOwner
When you specify key like override val key: ScreenKey = uniqueScreenKey the issue is gone
Might be related to issues:
Metadata
Metadata
Assignees
Labels
No labels

