0

有一个与操作系统相关的错误杀死/恢复活动(或应用程序?)。

经过一些调试发现 if setdon't keep activities和 set Background process limittono background process会导致不同的行为。

看到这篇文章,但它没有回答这里的问题。

这是观察到的:

在应用程序中,它将启动 dagger 组件并维护一些应用程序范围的单例对象,在活动 A(默认启动活动)中,它将通过用户的操作启动活动 B,在 B 中创建并托管一个片段。将有一些数据存储在应用程序范围的单例对象中以与片段一起使用。

如果只有don't keep activities设置,当最小化应用程序时调用 onDestroy() 活动,当重新打开应用程序时,它会恢复最后一个活动活动(比如用户打开活动 B,B 将被重新创建使用 savedInstanceState 恢复的片段)。在这种情况下,由 dagger 管理的应用程序范围单例对象仍然存在,因此状态完全恢复到最小化应用程序之前的状态。

但是,如果两者都don't keep activities设置Background process limitno background process,则在最小化应用程序时,不会调用 Activity 的 onDestroy()(仅调用 onStop())。

此时的行为变化是如果重新打开应用程序,它将从应用程序 onCreate() 开始,并重新创建匕首的组件。所以最小化应用程序之前的状态不会被重新存储。

但是操作系统似乎仍然记得最后一个活动是 B 和 B 的

onCreate(savedInstanceState: Bundle?) 

使用 savedInstanceState 调用,在最小化应用程序时保存数据,B 的片段也是如此。

而且它是一团糟,它有来自 savedInstanceState 的数据,但应用程序范围的单例对象是新的,没有数据与来自 savedInstanceState 的数据一起工作。

任何人都知道在这种情况下 saveInstance 保存在哪里,为什么虽然应用程序似乎被重新创建但最后一个活动(不是启动活动)仍然被重新存储?

4

1 回答 1

1

savedInstanceState捆绑包明确打算按照您的描述进行。无论是销毁后台活动以节省内存(例如,打开“不保留活动”)还是杀死整个应用程序进程以节省内存(例如,“后台进程限制”为零),框架都将提供您的应用程序能够将状态信息保存到savedInstanceState包中,并随后在将来调用onCreate().

唯一的情况savedInstanceStatenull您的活动第一次启动。你的应用程序的进程是否被杀死并不重要;如果您的活动恢复,您将收到一个非空savedInstanceState包。

于 2018-03-06T17:08:08.187 回答