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:configChanges在AndroidManifest.xml文件中设置属性来抵消这种情况,但在您的情况下,不建议使用此解决方案.
处理此问题的正确方法是将Application Context传递给AsyncTask而不是您的Activity(Activity继承自Context).您可以通过调用getApplicationContext()Activity的实例来执行此操作.您的应用程序上下文将持续显示屏幕旋转和生命等事件,直到系统终止应用程序.
至于为什么需要Context实例来执行基本任务:
有关应用程序环境的全局信息的接口.这是一个抽象类,其实现由Android系统提供.它允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动活动,广播和接收意图等.
这是官方文档定义的方式Context.也许有人可以更好地解释这个,但对我自己来说这个定义就足够