我找到这个主题的任何地方都说(恢复):“在您的活动上致电finish()
,如果您有任何服务正在运行,请致电stopService()
”。
所以我做了,而且看起来似乎有效,我不再担心了。今天,调试我的代码的一部分,我需要在非结束线程的方法中添加一个Log
行,我希望在应用程序的所有生命中执行它,基本上它是这样的:
final Thread buf_liberator = new Thread(
new Runnable() {
public void run() {
while (true) {
methodCall();
SystemClock.sleep(9000);
}
}
}
);
buf_liberator.setPriority(7);
buf_liberator.start();
在methodCall()
我放了Log
行,令我惊讶的是,在我关闭我的应用程序后按下退出按钮调用finish()
并停止我已启动的服务,我仍然会在LogCat中无限期地每隔9秒看到Log
消息。
所以问题是(是):这个线程不是服务,为什么它一直在运行?难道我做错了什么?这是预期的行为吗?是否有真正的方法来销毁应用程序在内存中的所有内容?
谢谢!
答案 0 :(得分:7)
所以问题是(是):这个线程不是服务,为什么它一直在运行?
因为您的流程仍在运行。即使你完成了一个Activity或者停止()一个服务,你的应用程序也可能继续运行。
我做错了吗?
除了创建一个永无止境的线程?否。
这是预期的行为吗?
是。 Android系统将处理作为缓存机制来加速恢复以前使用的应用程序。系统最终会在必要时终止您的进程(以及正在运行的线程)。 不要指望你的线程没有结束,因为它最终将
是否有一种真正的方法来摧毁应用程序在内存中的所有内容?
有一些方法,比如System.exit(),但通常建议您让系统按预期工作。
进一步阅读: http://developer.android.com/guide/components/processes-and-threads.html
答案 1 :(得分:2)
您无需担心这一点。在Android中没有“退出应用程序”这样的东西。当应用程序启动时,Android会产生一个应用程序“存在”的过程。当您的应用程序启动Android组件(如活动或服务)时,Android会知道您的应用程序处于活动状态,然后会尝试将其保留在内存中。如果关闭所有活动和所有服务,则应用程序的重要性会降低。从现在开始,如果Android需要更多内存,它将随时终止托管应用程序的进程。
在您的情况下,您关闭了所有组件,但保持一个线程运行。它继续在后台运行,因为Android不需要更多内存,你的应用程序保持“缓存”以备将来使用。如果你开始使用内存消耗游戏,那么你的应用程序就会被杀死。因此,您不能依赖在活动组件(如服务)之外运行的线程,因为它可以随时被杀死。
如果您确实要退出应用,可以尝试调用标准Java函数System.exit(0)
。这不是必需的,但如果您愿意,可以使用它。