从asynctasks发送广播

Ore*_*ren 10 android android-asynctask

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

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

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

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

Pau*_*aul 17

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

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

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

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

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

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