我有一个Android Activity并且用户启动了一些任务(例如通过点击按钮),这可能需要一些时间 - 比如介于1毫秒到1分钟之间。它可以是一些网络操作或计算或其他任何东西。我可以使用Thread或AsyncTask或其他一些工具。我想在任务完成时更改Activity上的内容,例如显示下载的图像或最佳的国际象棋移动等。我必须使用Handler或一些等效工具来运行主线程,但它仍然清晰而且非常简单。这是我的问题:
获取当前Activity对象的推荐方法是什么(调用其方法)?请注意,用户在任务期间可能不会做任何事情(我想获取原始的Activity对象),他也可以通过返回键关闭Activity(我希望在这种情况下得到null - 即使他重新打开了Activity的活动第二次),他可能会更改配置 - 例如从纵向模式切换到横向模式(我想获取新的 - 活动的当前实例)。
答案 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)活动Intent
向onStart/onStop
注册BroadcastReceiver
,服务发送广播以在任何时候通知或传递信息给活动。
如果您所做的只是下载/追逐图片以显示在您的活动用户界面上,请忘记所有这些线程和缓存的复杂性,并使用 Picasso library 制作一个代码行LocalBroadcastManager
和库自动处理您需要的所有内容。
您的活动还可以通过实施Picasso.with(context).load(url).into(imageView);
并调用Loaders
来连接LoaderCallbacks
,并且在轮播时,活动会再次重新连接到同一个加载程序。结果将被推送到当前运行的活动实例。
所以你可以看到,它确实取决于用例,看看哪个是最好的选择。
希望它有助于......快乐的编码。
答案 2 :(得分:0)
如果您的应用中只有一个活动,那么:
我想如果你使用任何片段,那么你可以使用“getActivity()”来检索你的活动对象。
如果您在活动中,那么您只需使用“此”对象访问您的活动对象。
希望这有帮助。
答案 3 :(得分:-1)
使用startActivityForResult,它将启动您的任务,并将结果返回到您原来的活动onActivityResult。
然后你可以检查ResultCode并意图确定发生了什么(包括用户cancelled操作的情况)。
有关how to get the result from an activity的更多信息,请参阅开发人员文档。