何时检测应用程序关闭?

5
我有一个应用程序,它可以在后台自动传输位置数据到服务器(是必要的),但需要在活动被销毁时执行此操作以节省内存(即 onDestroy() 不起作用),但当在运行应用程序视图中“滑动”应用程序时,我希望我的应用程序终止这些操作。
是否有必要这样做,或者线程会自动中断?
编辑:我自己学习了服务,但我将授予奖赏给提供最全面使用服务示例的人。(我自己不需要,但我认为当前的答案不值得一份奖赏。)

你需要创建自己的应用程序文件,并在清单文件中指定。这样,你就可以重写一些方法,我认为你需要使用onDestroy()方法来检测。祝好! - Max Pinto
@MaxPinto 是的,我已经有一个自定义应用程序了。那么你的意思是onDestroy()可以用于应用程序? - noɥʇʎԀʎzɐɹƆ
2
@MaxPinto 我在这里没有看到回调函数(http://developer.android.com/reference/android/app/Application.html),当我创建方法时,它也没有在我的编辑器中突出显示。 - noɥʇʎԀʎzɐɹƆ
对不起,我错了。但请看我的回答: - Max Pinto
这是必要的吗?还是线程会自动中断?不必要。只有当整个进程被系统终止以节省内存时,“Activity”才会被“销毁”。 - corsair992
4个回答

7

是的,这是必要的),但需要在销毁活动时执行以节省内存。

我感觉你做错了什么。为什么将位置发送到远程对等体与活动生命周期耦合?我不认为这样做有任何意义。如果您只想在前台发送位置,则可以利用ActivityLifecycleCallbacks,以便在进入前台或后台时通知您,并在进入后台时停止您的单独的发送工作程序,或在您的活动成为最前面的一个时恢复。

至于最近列表相关的问题,请让我引用Dianne Hackborn的评论:

当您滑动关闭一个最近的任务时,会发生什么特定的事情:(1)终止该应用程序的任何后台或空进程(请参见http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle以了解其含义),以及(2)使用新的http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API告知应用程序的任何服务有关已删除任务的信息,以便它可以执行其认为适当的操作。 您可以在此处找到此帖子:https://plus.google.com/105051985738280261832/posts/GfwRYCC42uX(我无法找到直接链接到Google Plus上的评论的方法)。

是的,考虑到需求,似乎后台“服务”是正确的解决方案。 - corsair992
好的,我已经学习了如何使用服务。但是如果您能够提供一个全面的示例,我可以授予您声誉。 - noɥʇʎԀʎzɐɹƆ

1
创建一个扩展了Service类的类。你需要在你的清单文件(manifest)中注册这个类(互联网上有很多工作示例)。然后,你需要决定你的ServiceActivity之间的通信如何工作。你可以使用以下方法之一:
  1. 使用一个Messenger( 示例)
  2. 通过注册BroadcastReceiver并使用Intent( 示例)
  3. 使用AIDL(由于其高复杂性,最好不要尝试此方法)

我认为你需要自己查找示例。Philipp Heckel创建了一些扩展原始Service类并实现服务到活动通信的类。 ServiceManager.java & AbstractService.java可用于创建所需的服务。此外,实现非常简单。(完整示例)


0

创建你自己的ActivityBaseActivity并扩展到Activity,覆盖onDestroy()方法,在该方法中编写你的代码。

然后你的其他活动将扩展你的基本Activity,并覆盖onDestroy()方法,并调用súper.onDestroy()来应用父级操作。

如果我是你,我会这样做。当然还有其他更好的方法,但这是一个解决方案。


这引出了我之前提出的同样的问题。在这里中,它说“或者因为系统为了节省空间而销毁它”。所以当活动不再显示时,无论应用程序是否关闭,它都将被销毁。一种方法是使用isFinishing(),但是当应用程序被滑动关闭时,finish()会被调用吗? - noɥʇʎԀʎzɐɹƆ
很好,补充一下你的回答(我不想替你说话):你可以通过使用ActivityAlias跳过所有的重写方法,并在onCreate中添加地理位置更新,同时不给它任何目标活动,这样你就可以检查isFinishing()并决定是否继续或退出,这比依赖onDestroy()更好,但你也应该将其放在onDestroy()中以防万一。 ActivityAlias是Activity的子集...希望对你有所帮助@JamesLu - Elltz
@JamesLu:再次强调,只有在整个进程被杀死时,系统才会单方面销毁“Activity”。 “finishing”状态仅意味着该“Activity”已手动完成(由用户按下返回键或开发人员以编程方式完成)。 - corsair992

0
为什么不使用IntentService传输位置数据呢?即使应用程序被关闭,它仍将继续工作(即传输数据)。
如果您只想在应用程序关闭时发送数据,则可以在onStop()方法中启动intentService(如其他答案所指出的一样,扩展Activity以避免逐个覆盖所有onStop)。

使用“服务”是一个好建议。其余的回答是不必要的,也没有意义。 - corsair992

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