将当前的Intent作为额外的Activity传递给另一个Activity

时间:2014-09-05 16:10:30

标签: android android-intent android-activity

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

LoginActivity

@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。那是因为我为每个活动和一些额外的活动使用了很多启动动作。

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

3 个答案:

答案 0 :(得分:1)

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

首先,您不需要完成以前的活动就可以禁用“后退”操作。您可以覆盖onBackPressed()

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

第三,但最重要的是。你为什么要打电话给新活动只是为了显示“没有网络”。信息?如果网络不能重新建立怎么办?只需创建isNetworkEnabled()方法,并在用户尝试从Internet获取数据之前调用它,然后再向服务器发送实际请求。如果没有网络 - 通过警报或烤面包通知用户。

答案 1 :(得分:1)

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

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

1)在该活动上调用finish()

2)

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

答案 2 :(得分:0)

  • 它适用于明确的意图。

在LoginActivity中替换:

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

使用:

noNetwork.putExtra(NoNetworkActivity.EXTRA_FAILED_INTENT, new Intent(this, LoginActivity.class));
Btw,Alexander Zhak在答案中有一些好处