我有一个asynctask做某事,当它完成时,我希望它广播它已完成。
通常我会这样做:context.sendBroadcast(new Intent(MYINTENT));
但是asynctask没有上下文。我已经看到了这个问题的一些答案,建议向asynctask发送对应用程序活动的上下文的引用。但如果用户旋转屏幕,则该引用很糟糕。并且手动维护引用是一个糟糕的解决方案(从创建asynctask的活动中需要太多,我无法控制)。现在的问题是:
1)为什么android会这样设置?为什么在广播可以注册并由其他环境处理时,我甚至需要一个上下文来发送广播?
2)这个问题有一个很好的解决方案吗? (好=要求尽可能少地创建asynctask的活动,幸存轮换等等。)。
答案 0 :(得分:17)
您现在在AsyncTask中使用的上下文是您当前活动的上下文。默认情况下,屏幕旋转将销毁该Activity的当前实例并创建一个新实例。 这是(即使它最初看起来可能不那么)预期的行为。原因是您可能希望为不同的屏幕方向提供不同的资源(布局,绘图等)。为了应用这些可能不同的资源,Android将在每次轮换时重新创建活动。
您可以通过在android:configChanges
文件中设置AndroidManifest.xml
属性来抵消这种情况,但在您的情况下,不建议使用此解决方案。
处理此问题的正确方法是将应用程序上下文传递给AsyncTask
而不是您的活动(Activity
继承自Context
)。您可以通过调用Activity实例中的getApplicationContext()
来执行此操作。
您的应用程序上下文将持续显示屏幕旋转和生命等事件,直到系统终止应用程序。
至于为什么需要一个Context实例来执行基本任务:
有关应用程序环境的全局信息的接口。这个 是一个抽象类,其实现由Android提供 系统。它允许访问特定于应用程序的资源和 类,以及应用程序级操作的上调,如 发起活动,广播和接收意图等。
这是官方文档定义Context
的方式。
也许有人可以更好地解释这一点,但对我自己来说,这个定义已经足够了。