【问题标题】:Passing current Intent as extra to another Activity将当前 Intent 作为额外内容传递给另一个 Activity
【发布时间】:2014-09-06 01:16:27
【问题描述】:

我的登录屏幕有问题。当它启动时,我检查网络连接,如果它被禁用,我想显示 NoNetworkActivity。其他屏幕也是如此:启动 Activity 时,我检查网络连接并导航到 NoNetworkActivity 是需要的。导航时,我想保存启动此先前活动的 Intent 并完成它以在 NoNetworkActivity 上禁用后退按钮重定向。因此,当连接恢复时,我想启动该意图并在出现此错误之前获取应用程序的实际状态:

登录活动

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    if (!App.getInstance().isNetworkConnected()) {
        Intent noNetwork = new Intent(this, NoNetworkActivity.class);
        noNetwork.putExtra(NoNetworkActivity.EXTRA_FAILED_INTENT, getIntent());
        startActivity(noNetwork);
        finish();
    }
    ...

NoNetworkActivity

private void checkNetworkConnection() {
    mCheckButton.setVisibility(View.INVISIBLE);
    mProgressBar.setVisibility(View.VISIBLE);
    if (App.getInstance().isNetworkConnected()) {
        Intent failedIntent = getIntent().getParcelableExtra(EXTRA_FAILED_INTENT);
        startActivity(failedIntent);
        finish();
    } else {
        mCheckButton.setVisibility(View.VISIBLE);
        mProgressBar.setVisibility(View.INVISIBLE);
        App.toast("Connection failed");
    }
}

而且越来越奇怪:startActivity(failedIntent) 什么都不做。我试图从下一行中删除 finish() ,而 NoNetworkActivity 只是保持在顶部而没有发生任何事情。

还有一件事。您可以建议传递 Activity 实际类名而不是意图,但我真的需要 Intent。那是因为我在每项活动中都使用了很多启动操作和一堆附加功能。

提前感谢您的帮助。干杯!

【问题讨论】:

  • 你想从NoNetworkActivity开始哪个Activity?
  • 什么是App?在您的代码中,您使用 App.getInstance() 之类的东西

标签: android android-intent android-activity


【解决方案1】:

非常糟糕的方法。不要使用它。

首先,您无需完成先前的活动即可禁用返回操作。您可以覆盖onBackPressed()

其次,您不需要再次启动父活动。只需使用startActivityForResult(); 调用一个新活动并覆盖onActivityResult() 回调。

第三,但也是最重要的。为什么要调用新活动只是为了显示“无网络”消息?如果网络不会重新建立怎么办?只需创建isNetworkEnabled() 方法并在用户尝试从 Internet 获取数据时调用它,然后再向服务器发送实际请求。如果没有网络 - 用警报或 toast 通知用户。

【讨论】:

  • 1) 覆盖onBackPressed():完成之前的活动比在NoNetworkActivity中清除整个任务要好
【解决方案2】:

我建议你首先使用片段而不是活动。 使用片段可以设置retainInstance(true);

禁用从活动返回到上一个活动:

1)对该活动调用finish()

2)

Intent i = new Intent();
i.setClass(this, MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);`

【讨论】:

    【解决方案3】:
    • 它适用于显式 Intent。

    在 LoginActivity 中替换:

    noNetwork.putExtra(NoNetworkActivity.EXTRA_FAILED_INTENT, getIntent());
    

    与:

    noNetwork.putExtra(NoNetworkActivity.EXTRA_FAILED_INTENT, new Intent(this, LoginActivity.class));
    

    顺便说一句,Alexander Zhak 在他的回答中有一些优点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-30
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2021-10-10
      相关资源
      最近更新 更多