Android 1小时后活动被破坏

Android 1小时后活动被破坏,android,android-activity,android-service,Android,Android Activity,Android Service,我是Android开发新手。I'v开发了一个android应用程序,即使在1小时后也需要存储连接/数据。目前,我在一个singleton类中拥有所有数据和连接(chromecast mediaplayer)。但是,当用户将应用程序放到后台大约一个小时时,活动被破坏,因此连接、数据等丢失,导致我的应用程序在重新启动时崩溃 我已经阅读了android服务,我可以使用这些服务来保存单例,这样即使活动被破坏,我也可以在重新启动时将数据绑定回视图吗 或者,当android决定进行清理时,有没有办法确保这些

我是Android开发新手。I'v开发了一个android应用程序,即使在1小时后也需要存储连接/数据。目前,我在一个singleton类中拥有所有数据和连接(chromecast mediaplayer)。但是,当用户将应用程序放到后台大约一个小时时,活动被破坏,因此连接、数据等丢失,导致我的应用程序在重新启动时崩溃

我已经阅读了android服务,我可以使用这些服务来保存单例,这样即使活动被破坏,我也可以在重新启动时将数据绑定回视图吗

或者,当android决定进行清理时,有没有办法确保这些活动不会被破坏? 请告知


谢谢。

Android O.S可以销毁任何活动,当资源不足时,它会销毁任何活动,以便为其他应用程序腾出更多空间。 但是你可以使用后台服务来保存你的单身汉


我想你可能误解了安卓应用程序是什么

您的应用程序是在单个Linux进程中运行的一组组件。组件在该过程中来来去去。您完全无法控制流程本身的生命周期

你部分问题的答案是“是”一项服务会在一项无形活动被破坏后继续存在

当一个活动变得不可见时,它就会被破坏。如果您的进程没有执行任何其他操作,那么该进程也可能被终止

如果您的进程也在运行服务,则它被终止的可能性较小。不过,可能性不大。这个过程最终会被扼杀。当它发生的时候,你的单身汉就会消失。你无法阻止这种情况。因此,你问题第二部分的答案是“不”。重新启动流程时,您不能依赖服务中的单例


您可以考虑使用应用程序对象。其生命周期与流程的生命周期大致相同。它不会永远存在,但只要应用程序的任何其他组件存在(ContentProviders除外),它就会存在

听起来,当应用程序处于后台时,您希望保持与chromecast设备的连接。显然,服务可能会有所帮助,但我有一些意见可能会派上用场:

  • 系统可以终止服务,但根据您设置服务的方式(例如onStartCommand()的返回值),系统可以重新启动服务。当这种情况发生时,您不能期望您的动态数据仍然存在(例如您的单例数据)。您需要包含重新创建所需内容的逻辑(例如,重新生成单例)

  • 手机可以在离开一段时间后进入睡眠状态(或者用户可以锁定手机),因此当手机进入睡眠状态时,wifi可能会在一段时间后下降,具体取决于手机的设置和手机的内置版本;有些人这样做更激进,有些人则不然(即使您持有锁,也可能发生这种情况)。关键是你必须假设它可能发生。即使你有一项服务,你的Cast连接也会因为wifi丢失而中断,因此正确的处理方法不是一直保持连接(因为你不能),而是在情况合适时有逻辑重新建立连接。为了做到这一点,您需要保存足够的信息,以便能够将事物恢复到原来的状态。你的逻辑也应该足够聪明,如果不应该的话,就不要重新连接


后台活动
随时可能被销毁。正如您已经了解到的,
服务
是解决方案。@XaverKapeller有一件事我不确定,如果我使用singleton保存数据,服务和活动中的数据是否相同?是的。在使用
服务时,您不应该遇到任何问题。启动一个服务会减少您的进程收获的可能性,从而为其他进程腾出空间。。。不过,这不会完全阻止它。在android中,原则上没有办法让进程永远运行。要添加有用的信息,您需要调用
Service.startForeground()
,以便在应用程序处于后台时保留您的服务。要保留这些值,请将它们存储在
SharedReferences
中,并在应用程序重新启动时重新加载。请扩展此答案,它只不过是一个链接。您应该提到从您的服务返回
START\u STICKY
,以及如何使用
service.startForeground()
,以获得一个非常好的答案。嘿@RichardLeMesurier!这就是本评论部分的目的!无论如何,添加这些描述@G.BlakeMeike:当应用程序在后台时,应用程序实例可以很容易地被杀死和重新创建,永远不要依赖应用程序实例来保存应用程序重新实例化时无法重新创建的东西;如果您希望依赖应用程序实例中的持久化内容,则需要确保所有重建该数据的逻辑都存在,以便应用程序从头开始重新创建数据。@AliNaddaf是的!正是我说的。您无法控制流程的生命周期。