从asynctasks发送广播

我有一个异想天开的事情,当它完成时,我希望它能够广播它的完成。

通常我会做: context.sendBroadcast(new Intent(MYINTENT)); 然而,asynctask没有上下文。 我已经看到这个问题的几个答案,build议发送一个应用程序的活动的上下文引用到asynctask。 但是如果用户旋转屏幕,则该引用是不好的。 并手动维护引用是一个不好的解决scheme(需要太多的活动创buildasynctask,我不能控制)。 现在的问题是:

1)为什么安卓就是这样设置的? 为什么我甚至需要一个上下文来发送广播,当广播可以注册并由其他上下文处理?

2)有没有很好的解决这个问题? (好=需要尽可能less的创造异能的活动,生存旋转等)。

Solutions Collecting From Web of "从asynctasks发送广播"

您现在在AsyncTask中使用的上下文是当前Activity的上下文。 默认情况下,屏幕旋转会破坏该Activity的当前实例并创build一个新的实例。 这是(即使起初看起来不那么有意)的行为。 原因是你可能想为不同的屏幕方向有不同的资源(布局,绘图等)。 为了应用这些潜在的不同资源,Android会在每次轮换时重新创buildActivity。

你可以通过在你的AndroidManifest.xml文件中设置android:configChanges属性来抵消,但是在你的情况下,这个解决scheme是不推荐的。

处理这个问题的正确方法是将应用程序上下文传递给AsyncTask而不是你的Activity( ActivityContextinheritance)。 您可以通过从Activity的实例调用getApplicationContext()来完成此操作。 您的应用程序上下文将持续诸如屏幕旋转之类的事件,直到系统终止应用程序。

至于为什么你需要一个Context实例来完成基本的任务:

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

正式文档如何定义一个Context 。 也许有人可以更好地解释这一点,但对我自己来说,这个定义就足够了