Android - 配置更改后获取原始Activity的最佳方法

时间:2014-10-02 08:27:29

标签: android multithreading android-activity landscape portrait

我有一个Android Activity并且用户启动了一些任务(例如通过点击按钮),这可能需要一些时间 - 比如介于1毫秒到1分钟之间。它可以是一些网络操作或计算或其他任何东西。我可以使用Thread或AsyncTask或其他一些工具。我想在任务完成时更改Activity上的内容,例如显示下载的图像或最佳的国际象棋移动等。我必须使用Handler或一些等效工具来运行主线程,但它仍然清晰而且非常简单。这是我的问题:

获取当前Activity对象的推荐方法是什么(调用其方法)?请注意,用户在任务期间可能不会做任何事情(我想获取原始的Activity对象),他也可以通过返回键关闭Activity(我希望在这种情况下得到null - 即使他重新打开了Activity的活动第二次),他可能会更改配置 - 例如从纵向模式切换到横向模式(我想获取新的 - 活动的当前实例)。

4 个答案:

答案 0 :(得分:2)

对于setRetainInstance(true)调用它的无形片段来说,这听起来像是一项工作。

基本上,您应该将所有任务逻辑移动到不创建任何视图层次结构的特殊片段(其onCreateView应返回null)。片段应尽早调用setRetainInstance(true),例如在构造函数中。当您需要运行任务时,只需添加新片段即可。此片段生成线程/异步任务并接收结果。然后,您可以使用片段中的getActivity来获取最新的活动实例。如果活动因用户使用后退密钥而被销毁,则会调用片段onDestroy,以便您可以区分活动是否被销毁或是否正在重新创建。

请注意不要在片段中的某处存储Activity实例以防止泄漏,也不要意外地将片段添加两次。

有关该方法的详细信息,请参阅the article on developer.android.com

答案 1 :(得分:2)

有很多不同的方法。

  • 根据@DarthBeleg的建议,您可以将片段与setRetainInstance(true);一起使用,所有处理逻辑都在此片段内,活动可以findFragmentByTag,片段可以通过{{1}找到活动}}

  • 服务。服务很棒,他们有自己的生命周期,可以在活动消失的同时继续运行。活动启动服务传递getActivity()上的任务要求,然后有两个选项

    1)活动绑定到服务并使用一些公共方法在任务完成时注册回调,结果可用

    2)活动IntentonStart/onStop注册BroadcastReceiver,服务发送广播以在任何时候通知或传递信息给活动。

    < / LI>
  • 如果您所做的只是下载/追逐图片以显示在您的活动用户界面上,请忘记所有这些线程和缓存的复杂性,并使用 Picasso library 制作一个代码行LocalBroadcastManager和库自动处理您需要的所有内容。

  • 您的活动还可以通过实施Picasso.with(context).load(url).into(imageView);并调用Loaders来连接LoaderCallbacks,并且在轮播时,活动会再次重新连接到同一个加载程序。结果将被推送到当前运行的活动实例。

所以你可以看到,它确实取决于用例,看看哪个是最好的选择。

希望它有助于......快乐的编码。

答案 2 :(得分:0)

如果您的应用中只有一个活动,那么:

  1. 我想如果你使用任何片段,那么你可以使用“getActivity()”来检索你的活动对象。

  2. 如果您在活动中,那么您只需使用“此”对象访问您的活动对象。

  3. 希望这有帮助。

答案 3 :(得分:-1)

使用startActivityForResult,它将启动您的任务,并将结果返回到您原来的活动onActivityResult

然后你可以检查ResultCode并意图确定发生了什么(包括用户cancelled操作的情况)。

有关how to get the result from an activity的更多信息,请参阅开发人员文档。

相关问题