如何在不使用Intent的情况下从子子活动跳转到主要活动?

时间:2014-09-07 07:53:00

标签: android android-intent asynchronous

我有以下活动。 1)主要活动2)活动1 3)活动2

这是活动连接在一起的方式

主要活动 - >活动1 - >活动2(创建背景异步任务)所以"活动1"是儿童活动和"活动2"是一个子项活动。并从"活动2"

创建后台异步任务

所以,让我们说我现在正在参加活动2"屏幕和Backround异步任务正在运行。现在在"背景异步任务"上发生了一些失败事件之后,我想回到"主要活动"。有什么好办法呢?

我想的几乎没有办法,1)完全重新启动应用程序2)从背景异步任务创建新的主要活动意图,就像我们创建"活动1& 2"

我不确定哪一个好用。还有其他办法吗?

我是android的新手。我正在使用BroadcastReceiver(在活动1和2上)在后台异步任务广播失败事件时完成当前活动但有时它跳转到"主要活动"有时跳到"活动1"。所以不能正常寻找。

请您建议一个好方法吗? [抱歉,我不得不再次提出这个问题。因为旧问题被删除了]

@Rohit,我尝试过你建议在进入Activity2之前完成活动1。这也有效,但它会产生另一个问题。

执行此操作后,当我按下后退按钮时,它会直接进入主要活动,而不是活动1,因为它不再存在。

是否有任何解决方案可以使这两件事都有效?我想在按下后退按钮时跳转到活动1。当从Activity 2创建的Background Async任务发现问题时,我想跳转到Main活动。

[编辑] 让我来描述更具体的案例。

主要活动列出打开基于Wifi接入点的硬件。

点击特定列出的访问点后,会打开登录活动并询问用户ID&硬件访问密码。登录活动onCreate函数还创建 TcpAsyncTask 后台任务,该任务将与硬件(具有WiFi接入点功能)进行通信,以进行身份​​验证和数据传递。

当用户输入登录详细信息并单击登录按钮时,它将创建瞬时后台任务 LoginDeviceAsyncTask 。此任务将通过先前创建的TcpAsyncTask与硬件进行通信,以验证身份验证。如果身份验证成功,则会使用startActivityForResult创建导航活动。

在导航活动中,它列出了打开特定窗口的选项,例如仪表板。历史。当用户从选项中选择仪表板时,它会使用startActivity创建仪表板活动。当用户从选项中选择历史记录时,它会使用startActivity创建历史记录活动。

因此,如果打开Dashboard活动,它会显示使用TcpAsyncTask(在Login活动中先前创建)从硬件定期收到的一些数据

同样,如果打开历史记录活动,它会显示使用TcpAsyncTask(在登录活动中先前创建)从硬件定期收到的一些数据

仪表板/历史记录活动可以选择直接转到历史记录/仪表板活动。为此,它使用startActivity创建所选活动并完成当前活动。

现在我的问题是, 让我们说我在Dashboard活动中,它正在显示使用TcpAsyncTask从硬件接收的数据。 现在某种程度上TcpAsyncTask无法与硬件通信,此时我想直接转到Main活动。

在TcpAsyncTask中,我没有像TcpAsyncTask之后创建的导航/仪表板/历史等活动的上下文。可能是我可以使用一些MainActivity变量在TcpAsyncTask中获取此上下文,这些变量按创建/完成更新。我是对的吗?

我当前正在广播以关闭TcpAsyncTask并使用BroadcastReceiver在Navigation / Dashboard / History活动中接收广播消息并完成接收广播关闭消息的特定活动。但有时它跳转到Main活动,有时当从TcpAsyncTask发送sendBroadcast时它会跳转到Navigation活动。

3 个答案:

答案 0 :(得分:1)

在AsyncTask中传递Context,通过它可以杀死你的Activity 1和Activity 2

((Activity)context).finish();

您可以通过传递两者的上下文来为这两个活动执行此操作。

答案 1 :(得分:0)

首先,请记住,当不在前台的代码在非活动状态下运行时,不能依赖它。所以你不应该依赖后台异步任务。相反,使用进行后台处理的服务;这正是服务所包含的内容(以及其他持久性处理)。虽然对于初学者来说学习起来相当多,但它会为您长期节省很多麻烦,因为它的生命周期比复杂的活动网络及其关系和生命周期更容易管理。

你应该阅读android" Back Stacks"。如果完成活动,将显示后堆栈上的上一个活动。这些就像历史浏览器所维护的那样,决定了浏览器后退按钮的运行方式。

所以你需要的是产生子活动的新实例的主要活动。然后,当用户导航后退按钮时,后台堆栈中的上一个活动(您的主要活动)将恢复。这不需要意图。

但是,对于由后台处理任务触发的活动,我强烈建议使用服务和意图来协调所有活动。

答案 2 :(得分:0)

一种可能的解决方案是使用startActivityForResult()启动活动2,然后在处理过程中,您可以调用setResult()来表示成功或失败。在活动1中,覆盖onActivityResult()并检测活动2的结果。如果活动2指示失败,只需在活动1上调用finish()即可返回主活动。