当某人关闭或杀死一个应用程序时,代码会发生什么?

3

我一直在研究为我的应用程序存储数据并尝试选择不同的方法(onSaveInstanceStateonPause/onResume)和不同的存储方法(onSaveInstanceState中的状态、SQLitePrefences)。

我想知道当用户执行某些操作时,每种存储方式会发生什么。具体而言,我想知道以下情况下调用了哪些方法和清除了哪些数据:

  • 用户点击任务切换按钮(右下角),然后在几秒钟内关闭覆盖层,这全部在应用程序内
  • 用户点击Home键但没有从任务切换器中滑出应用程序,然后重新打开应用程序
  • 用户点击Home键,从任务切换器中滑出应用程序,然后重新打开应用程序
  • 用户退出应用程序,重新启动手机,然后打开应用程序
  • 用户退出应用程序,并使用Clean Master(或任何其他存储管理器)清除所有应用程序的缓存或杀死所有后台任务,然后重新打开应用程序。
  • 用户更新应用程序

1
请说明您将制作的应用程序类型和要存储的数据类型。否则,告诉您“这些过程中调用的确切方法”将需要太多时间。您的具体用例将驱动您架构的选择,而您的架构将驱动您需要使用的回调选择。 - Stephan Branczyk
@StephanBranczyk 这是个好主意;我正在尝试存储高分。目前我只是使用了savedpreferences并将5-6个数字放入编辑器中,提交并继续。可能有更有效的方法,这就是我在上面详细阐述不同可能性的原因。 - John Targaryen
2个回答

1
我正在尝试存储高分。目前我只是使用SharedPreferences,在编辑器中输入5-6个数字,提交并继续。可能有更有效的方法,这就是为什么我在上面详细说明了不同的可能性。
我想你是指SharedPreferences。是的,你做得很对。你的高分将在应用程序执行之间保存。使用SQLite做同样的事情会过度杀伤。
用户可以通过单击“清除数据”或单击“卸载”您的应用程序来清除数据。
但是,无论更新应用程序本身还是单击“清除缓存”,都不会对SharedPreferences产生任何影响,用户必须按下“清除数据”按钮,如果他想要清除特定数据。
至于更有效的方法,那就取决于你的意思。你正在做的是几乎每个开发者都会做的事情。这是实际工作的工作的最简单的解决方案。例如,如果您选择在活动之间存储该数据包,则所有高分数据将在应用程序执行之间丢失。

话虽如此,如果您要在多个设备上玩同一款游戏,或者迁移到新设备,或者稍后卸载游戏并重新安装,则您的解决方案显然不足够。为此,您可能需要考虑使用Google Play服务为您存储本地和云端数据。


1
  1. 当用户打开任务切换器并关闭应用时,应用程序进程将被终止,任何在后台运行的服务也将停止。
  2. 当用户从任务切换器中单击主屏幕并重新打开应用程序时,应用程序将恢复。如果您搜索活动生命周期,可以获得更多详细信息。
  3. 当用户单击主屏幕并从任务切换器中滑出应用程序时,相当于杀死应用程序,进程将被终止,任何在后台运行的服务也将停止。
  4. 当用户退出应用程序并重新启动/重启手机时,进程将被终止,服务也将被终止。但是,在重新启动/重启设备后,用户可以编写逻辑来重新启动它,一旦设备重新启动或应用程序被杀死。
  5. 当用户退出应用程序并清除缓存时,我会假设数据已被清除。因此,这就像一个全新的应用程序。

根据我的理解,我给出了简要答案。希望这些信息能够提供一些见解。


2
#1,#3和#4不正确:从“最近使用的应用程序”(谷歌现在称之为屏幕)中删除应用程序不会停止任何服务。它只会将该应用程序从屏幕上移除,并可能释放活动使用的内存。这就是为什么即使在滑动GMaill之后,您仍然可以收到新的电子邮件通知。仅通过“退出”应用程序本身不会导致进程被终止。 - Kai
虽然这个答案肯定很有用,但我正在寻找更具体的东西:这些进程中调用了哪些方法。 - John Targaryen
1
我认为#5也可能是不正确的。许多人会清除缓存,比如Reddit - Clean Master Functions Thread,但似乎并没有清除他们的数据。 - John Targaryen
1
@JoeBob,忽略上面的答案。大部分都是不正确的。而且#6没有被提到,但是如果数据存储在SQLite中,即使应用程序本身更新(即使模式发生了更改,假设开发人员希望如此),数据仍然会保留。 - Stephan Branczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接