Android 从通知意图启动 activity 时重新创建了 ViewModel
Android ViewModel recreated when launching activity from notification intent
我正在尝试创建一个计时器应用程序。当用户按下计时器时,它会创建一个通知,提示计时器为 运行.
我正在使用视图模型来存储我的视图数据。我想要的是当计时器启动并创建通知时,当用户按下通知时,它会再次为计时器启动 activity 并将其带到堆栈的顶部。 activity 的视图应保留与以前相同的视图模型数据。
当前发生的情况是,单击通知会在我的返回堆栈中创建一个新的 activity。这会为此 activity 创建一个新的视图模型。当我按下后退按钮时,我可以 return 到旧的 activity 视图。
我只需要将这个旧的 activity 视图带回堆栈,而不是创建新的 activity。
我在视图模型中用于在计时器启动时发送通知的代码是这样的:
private fun sendNotification() {
val intent = Intent(context, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
var builder = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("Pomodoro Timer")
.setContentText("Pomodoro Timer is running")
.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
with(NotificationManagerCompat.from(context)) {
// notificationId is a unique int for each notification that you must define
notify(1, builder.build())
}
}
我的 activity onCreate 视图模型是这样创建的:
val dataBinding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val timerFactory = TimerFactory(this)
val timer = ViewModelProvider(this, timerFactory).get(Timer::class.java)
dataBinding.timer = timer
dataBinding.lifecycleOwner = this
我如何让通知保留并仅将旧的 activity 和视图模型放回堆栈顶部?
通知中的待定意图正在启动新任务,因此创建了 MainActivity 的新实例。
如果您想回到原来的 MainActivity,请在 Manifest 中将 MainActivity 声明为 android:launchMode="singleTask".
同时检查 docs 关于 Android 启动模式。
我正在尝试创建一个计时器应用程序。当用户按下计时器时,它会创建一个通知,提示计时器为 运行.
我正在使用视图模型来存储我的视图数据。我想要的是当计时器启动并创建通知时,当用户按下通知时,它会再次为计时器启动 activity 并将其带到堆栈的顶部。 activity 的视图应保留与以前相同的视图模型数据。
当前发生的情况是,单击通知会在我的返回堆栈中创建一个新的 activity。这会为此 activity 创建一个新的视图模型。当我按下后退按钮时,我可以 return 到旧的 activity 视图。
我只需要将这个旧的 activity 视图带回堆栈,而不是创建新的 activity。
我在视图模型中用于在计时器启动时发送通知的代码是这样的:
private fun sendNotification() {
val intent = Intent(context, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
var builder = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("Pomodoro Timer")
.setContentText("Pomodoro Timer is running")
.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
with(NotificationManagerCompat.from(context)) {
// notificationId is a unique int for each notification that you must define
notify(1, builder.build())
}
}
我的 activity onCreate 视图模型是这样创建的:
val dataBinding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val timerFactory = TimerFactory(this)
val timer = ViewModelProvider(this, timerFactory).get(Timer::class.java)
dataBinding.timer = timer
dataBinding.lifecycleOwner = this
我如何让通知保留并仅将旧的 activity 和视图模型放回堆栈顶部?
通知中的待定意图正在启动新任务,因此创建了 MainActivity 的新实例。
如果您想回到原来的 MainActivity,请在 Manifest 中将 MainActivity 声明为 android:launchMode="singleTask".
同时检查 docs 关于 Android 启动模式。