10

我有一个做某事的异步任务,当它完成时,我希望它广播它已经完成。

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

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

2)这个问题有很好的解决方案吗?(好=尽可能少地从创建异步任务的活动中要求,在旋转中幸存下来,等等。)。

4

1 回答 1

17

您现在在 AsyncTask 中使用的上下文是您当前活动的上下文。默认情况下,屏幕旋转将破坏该 Activity 的当前实例并创建一个新实例。这是(即使一开始看起来不是这样)预期的行为。这样做的原因是您可能希望针对不同的屏幕方向使用不同的资源(布局、可绘制对象等)。为了应用这些可能不同的资源,Android 将在每次轮换时重新创建 Activity。

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

处理此问题的正确方法是将 Application Context 传递给AsyncTask而不是您的 Activity (Activity继承自Context)。您可以通过getApplicationContext()从 Activity 实例调用来做到这一点。您的应用程序上下文将持续存在诸如屏幕旋转和生命之类的事件,直到系统终止应用程序。

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

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

This is how the official documentation defines a Context. Maybe someone can explain this better but for myself this definition is sufficient.

于 2012-12-30T12:29:33.683 回答