从asynctasks发送广播

时间:2012-12-30 11:23:41

标签: android android-asynctask

我有一个asynctask做某事,当它完成时,我希望它广播它已完成。

通常我会这样做:context.sendBroadcast(new Intent(MYINTENT));但是asynctask没有上下文。我已经看到了这个问题的一些答案,建议向asynctask发送对应用程序活动的上下文的引用。但如果用户旋转屏幕,则该引用很糟糕。并且手动维护引用是一个糟糕的解决方案(从创建asynctask的活动中需要太多,我无法控制)。现在的问题是:

1)为什么android会这样设置?为什么在广播可以注册并由其他环境处理时,我甚至需要一个上下文来发送广播?

2)这个问题有一个很好的解决方案吗? (好=要求尽可能少地创建asynctask的活动,幸存轮换等等。)。

1 个答案:

答案 0 :(得分:17)

您现在在AsyncTask中使用的上下文是您当前活动的上下文。默认情况下,屏幕旋转将销毁该Activity的当前实例并创建一个新实例。 这是(即使它最初看起来可能不那么)预期的行为。原因是您可能希望为不同的屏幕方向提供不同的资源(布局,绘图等)。为了应用这些可能不同的资源,Android将在每次轮换时重新创建活动。

您可以通过在android:configChanges文件中设置AndroidManifest.xml属性来抵消这种情况,但在您的情况下,不建议使用此解决方案。

处理此问题的正确方法是将应用程序上下文传递给AsyncTask而不是您的活动(Activity继承自Context)。您可以通过调用Activity实例中的getApplicationContext()来执行此操作。 您的应用程序上下文将持续显示屏幕旋转和生命等事件,直到系统终止应用程序。

至于为什么需要一个Context实例来执行基本任务:

  

有关应用程序环境的全局信息的接口。这个   是一个抽象类,其实现由Android提供   系统。它允许访问特定于应用程序的资源和   类,以及应用程序级操作的上调,如   发起活动,广播和接收意图等。

这是官方文档定义Context的方式。 也许有人可以更好地解释这一点,但对我自己来说,这个定义已经足够了。