我的登录屏幕出现问题。当它启动时,我检查网络连接,如果它被禁用,我想显示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。那是因为我为每个活动和一些额外的活动使用了很多启动动作。
提前感谢您的帮助。干杯!
答案 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在答案中有一些好处