我在这里搜索了大多数答案,并建议我们添加一个标志来杀死旧活动。问题是我的活动只接收来自其他应用程序的意图,并且无法控制它。
更具体地说,我的活动收到加载图片的意图,然后它使用Asynctask加载并对该图片进行一些复杂的后台处理,比方说,可能是2分钟。
如果此时用户退出(假设只调用onStop,尚未onDestroy)并与应用程序共享另一张图片,则会启动一个新活动,并且无法访问上一个活动,但其Asynctask保持不变提升线程,以便我的新活动冻结而不启动自己的Asynctask。
(我后来尝试了并行线程执行程序,但是这并没有阻止旧线程运行,从而消耗了计算资源)。
知道我应该做什么吗?
(我不想在onStop中停止任务,因为这很容易被调用。但我确实想要在共享新图片时停止任务,因为不再需要它。)
(Asynctask将吐出在主活动中声明的大量自定义对象,因此活动立即从后台进程更新结果,并在调用onPostExecute后立即更新UI。)< / p>
答案 0 :(得分:1)
修改强> 您的问题似乎是您正在尝试在您的活动启动的asynctasks中执行所有这些图像处理工作。您是否考虑过更改自己的应用架构,以便将所有后台处理功能都归结为service?
您可以使用该活动在您处理服务中的图像时显示一些UI信息,或者如果您不需要此UI只是简单地与服务通信(例如通过广播)来提供它图像,让服务通过通知显示流程的一些信息。
如果您在退出活动时不想让活动保持活跃,可以使用
清单中活动声明中的 android:noHistory="true"
更多信息here
答案 1 :(得分:0)
这是一种解决方法,目前似乎运作良好:
获取共享首选项prefs后,请在onCreate中执行此操作:
prefs.edit().putBoolean("ForceClose", true).commit();
在onPreExecute()
的{{1}}中,输入:
AsyncTask
在prefs.edit().putBoolean("ForceClose", false).commit();
的{{1}}中,不断检查
doInBackground()
并在AsyncTask
中致电if (prefs.getBoolean("ForceClose", false))
cancel(true);
以完成活动。