【问题标题】:How to jump to main activity from subchild activity without using Intent?如何在不使用 Intent 的情况下从子活动跳转到主要活动?
【发布时间】:2014-09-09 13:36:56
【问题描述】:

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

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

Main Activity -> Activity 1 -> Activity 2(创建后台异步任务)所以“Activity 1”是子活动,“Activity 2”是子活动。并从“Activity 2”创建后台异步任务

假设我目前在“活动 2”屏幕上,后台异步任务正在运行。现在在“后台异步任务”发生一些失败事件之后,我想回到“主要活动”。有什么好的方法可以做到这一点?

我的想法是,1)完全重启应用程序 2)从后台异步任务创建新的主要活动意图,就像我们创建“活动 1 和 2”一样。

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

我是安卓的新手。我目前正在使用 BroadcastReceiver(在活动 1 和 2 上)在后台异步任务广播失败事件时完成当前活动,但有时它会跳转到“主要活动”,有时会跳转到“活动 1”。所以没有像我想要的那样工作。

您能提出一个好的方法吗? [对不起,我不得不再次问这个问题。因为旧问题已被删除]

@Rohit,我尝试了你建议的在去 Activity2 之前完成 Activity 1 的方法。这也可行,但会产生另一个问题。

执行此操作后,当我按下返回按钮时,它直接转到主活动而不是活动 1,因为它不再存在。

有什么解决方案可以让这两个东西都工作吗?按下后退按钮时,我想跳转到活动 1。当从活动 2 创建的后台异步任务发现问题时,我想跳转到主活动。

[编辑] 让我描述更具体的情况。

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

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

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

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

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

类似地,如果 History 活动被打开,它会显示一些使用 TcpAsyncTask 定期从硬件接收的数据(在 Login 活动中创建)

仪表板/历史活动具有直接移动到历史/仪表板活动的选项。为此,它使用 startActivity 创建选定的活动并完成当前活动。

现在我的问题是, 假设我在仪表板活动中,它正在使用 TcpAsyncTask 显示从硬件接收到的数据。 现在不知何故 TcpAsyncTask 无法与硬件通信,此时我想直接移动到 Main 活动。

在 TcpAsyncTask 中,我没有像在 TcpAsyncTask 之后创建的 Navigation/Dashboard/History 这样的活动上下文。可能我可以使用一些 MainActivity 变量在 TcpAsyncTask 中获取此上下文,这些变量根据创建/完成进行更新。我说的对吗?

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

【问题讨论】:

  • 你能创建一个最小的例子来说明你想要做什么吗?为了简化代码,使用按钮来模拟事件,例如 TcpAsyncTask 失败。
  • 我很难制作一个适用于我的应用程序的完整示例。但是,如果从长描述中不清楚,我可以为您提供流程图以了解我试图解释的内容:(。

标签: android android-intent asynchronous


【解决方案1】:

在您的 AsyncTask 中传递上下文,通过它您可以杀死您的 Activity 1 以及 Activity 2

((Activity)context).finish();

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      您应该阅读 android“Back Stacks”。如果您完成了一个活动,则会显示返回堆栈上的上一个活动。这些就像浏览器维护的历史记录一样,决定了浏览器后退按钮的操作方式。

      因此,您需要的是生成子活动的新实例的主要活动。然后当用户导航返回按钮时,返回堆栈中的前一个活动(您的主要活动)将被恢复。这不需要意图。

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

      【讨论】:

      • 服务对 TcpAsyncTask 来说可能很好。但不知何故我们目前没有使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2014-04-04
      相关资源
      最近更新 更多