Java 安卓有意开启新活动,但没有关闭旧活动

Java 安卓有意开启新活动,但没有关闭旧活动,java,android,multithreading,android-intent,android-asynctask,Java,Android,Multithreading,Android Intent,Android Asynctask,我在这里搜索了大多数答案,所有的答案都建议我们添加一个标志来消除旧的活动。问题是我的活动只接收来自其他应用程序的意图,无法控制它 更具体地说,我的活动接收到加载图片的意图,然后使用Asynctask加载并对该图片进行一些复杂的背景处理,比如说,可能需要2分钟 如果用户此时退出(假设只调用了onStop,而不是onDestroy)并向应用程序共享另一张图片,这将启动一个新的活动,并且无法访问以前的活动,但其Asynctask会阻塞线程,因此我的新活动只是冻结,而不启动自己的Asynctask (我

我在这里搜索了大多数答案,所有的答案都建议我们添加一个标志来消除旧的活动。问题是我的活动只接收来自其他应用程序的意图,无法控制它

更具体地说,我的活动接收到加载图片的意图,然后使用Asynctask加载并对该图片进行一些复杂的背景处理,比如说,可能需要2分钟

如果用户此时退出(假设只调用了onStop,而不是onDestroy)并向应用程序共享另一张图片,这将启动一个新的活动,并且无法访问以前的活动,但其Asynctask会阻塞线程,因此我的新活动只是冻结,而不启动自己的Asynctask

(我后来尝试了并行线程执行器,但这并不能阻止旧线程运行,从而消耗计算资源)

你知道我该怎么做吗

(我不想在onStop中停止任务,因为这样很容易调用。但如果共享了新图片,我确实想停止任务,因为不再需要它。)

(Asynctask将抛出大量在主活动中声明的自定义对象,因此该活动将立即从后台进程中更新结果,并且在调用onPostExecute后,UI将立即更新。)

编辑: 您的问题似乎是您试图在活动启动的异步任务中完成所有这些图像处理工作。你有没有考虑过改变你的应用程序架构,让所有这些后台处理都依赖于一个新的应用程序

在处理服务中的映像时,您可以使用“活动”显示一些UI信息,或者如果不需要此UI,只需与服务通信(例如,通过广播)即可向其提供映像,并让服务通过通知显示流程的一些信息


如果您不想在退出活动时保持活动状态,可以使用

android:noHistory=“true”
在清单的活动声明中


更多信息

这是解决方案,目前似乎效果很好:

获取SharedReference首选项后,请在onCreate中执行此操作:

prefs.edit().putBoolean("ForceClose", true).commit();
AsyncTask
onPreExecute()
中,放入:

prefs.edit().putBoolean("ForceClose", false).commit();
AsyncTask
doInBackground()

if (prefs.getBoolean("ForceClose", false)) 
    cancel(true); 

然后在
onCancelled()
中调用
finish()
以完成活动。

如最后一行所述,如果用户导航离开,我确实希望保留我的活动,除非1)用户有意启动新活动,或2)系统将其终止。抱歉,我第一次不太理解您的问题,我已经编辑了我的回答后台进程将弹出大量自定义定义的对象。。。使用服务将这些数据传回应用程序是否有效?现在,Asynctask使用主活动的变量,因此该活动会立即从后台进程获得结果更新,并且在调用onPostExecute后,UI会立即更新……但是活动被设计为在前台工作,显示UI。您需要的是一个后台进程,它完成了艰苦的工作并用结果更新UI,这就是服务所做的。有关如何在此处通信活动和服务的更多信息:现在将体系结构更改为服务似乎太难了。我在想,我可以做一些技巧吗?比如,每当启动一个新活动时,广播一条私人消息,这样仍然在后台运行的特定Asynctask在收到消息时就会自动终止?请尝试加载程序,而不是Asynctask