【问题标题】:Android Intent open new activities but did not close the old oneAndroid Intent 开启新的活动但没有关闭旧的活动
【发布时间】:2014-03-23 08:26:46
【问题描述】:

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

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

如果用户此时退出(假设只调用了onStop,还没有调用onDestroy)并分享另一张图片给app,这将启动一个新的activity,并且之前的activity无法访问,但它的Asynctask保持启动线程,以便我的新活动冻结而不启动它自己的 Asynctask。

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

知道我应该怎么做吗?

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

(Asynctask会吐出一大堆在主activity中声明的自定义对象,因此activity会立即从后台进程获取结果更新,调用onPostExecute后UI会立即更新。)

【问题讨论】:

  • 尝试使用 Loaders 而不是 asyncTask

标签: java android multithreading android-intent android-asynctask


【解决方案1】:

编辑: 您的问题似乎是您试图在您的活动启动的异步任务中完成所有这些图像处理工作。您是否考虑过更改您的应用架构以将所有这些后台处理都依赖于 service

当您在服务中处理图像时,您可以使用 Activity 显示一些 UI 信息,或者如果您不需要此 UI,只需与服务通信(例如通过广播)以向其提供图像和让服务通过通知显示一些进程信息。


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

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

更多信息here

【讨论】:

  • 如最后一行所述,如果用户离开,我确实希望保留我的活动,除非 1) 用户有意启动新活动,或 2) 系统将其终止。
  • 对不起,我第一次没看懂你的问题,我已经编辑了我的答案
  • 后台进程会吐出大量自定义对象...使用服务将这些数据传回应用程序是否有效?现在 Asynctask 使用主 Activity 的变量,因此 Activity 会立即从后台进程获取结果更新,并且在调用 onPostExecute 后 UI 会立即更新...
  • 但是活动被设计为在前台工作,显示一个 UI。您需要的是一个后台进程来完成繁重的工作并使用结果更新 UI,这就是 Services 所做的。有关如何在此处交流活动和服务的更多信息:stackoverflow.com/a/22443582/1668144
  • 现在将架构更改为服务似乎太难了。我在想我是否可以做一些技巧,例如,每当启动新活动时,广播一条私人消息,以便仍在后台运行的特定 Asynctask 在收到消息时自行终止?
【解决方案2】:

这是解决方法,目前看来效果很好:

获得共享首选项后,在 onCreate 中执行此操作:

prefs.edit().putBoolean("ForceClose", true).commit();

AsyncTaskonPreExecute() 中,输入:

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

AsyncTaskdoInBackground()中,不断检查

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

并在onCancelled() 中致电finish() 以完成活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2017-05-11
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多