【问题标题】:Empty activity when resuming after onBackPressed in Android在 Android 中的 onBackPressed 后恢复时的空活动
【发布时间】:2014-05-18 19:02:08
【问题描述】:

我的 Android 应用出现了一个奇怪的问题。

我的应用如何工作:当我启动我的应用时,它会启动 MainActivity。如果用户未登录,则启动 LoginActivity,然后在 MainActivity 中调用完成。

现在,当 LoginActivity 启动并且我按下后退按钮时,应用程序将关闭。当我再次打开应用程序时,它必须再次启动 LoginActivity,但有时这不起作用(例如 8 次中的 1 次)。当它不起作用时,应用程序只会向我显示一个空活动。

当应用程序无法正确启动(第二个打印屏幕)时,按钮/文本输入确实可以工作,但看起来它们只是被隐藏了或其他什么。因此,当我按下“Sign Up”文本的位置时,它确实将我带到了 RegisterActivity。

有人知道导致这种奇怪行为的原因吗?

这是应用程序正确启动的时间:

但有时会发生这种情况:

MainActivity onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    initializeDataSources();

    if(usersDataSource.getCurrentUser() == null)
    {
        Intent LoginActivity = new Intent(getApplicationContext(), LoginActivity.class);
        LoginActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(LoginActivity);
        finish();
        return;
    }

    if(localServiceBinder == null)
        localServiceBinder = new LocalServiceBinder();

    bindLocalService();

    setContentView(R.layout.activity_main);
}

LoginActivity onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(localServiceBinder == null)
        localServiceBinder = new LocalServiceBinder();

    bindLocalService();

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_login);

    mUsernameView = (EditText) findViewById(R.id.username);
    mPasswordView = (EditText) findViewById(R.id.password);
    mSignInButton = (Button) findViewById(R.id.sign_in_button);
    mSignUpButton = (TextView) findViewById(R.id.sign_up_button);
}

【问题讨论】:

  • 可以usersDataSource.getCurrentUser() != null这样吗?
  • 不,我只是用 if(true) 对其进行了测试,所以它总是启动 LoginActivity,但我仍然遇到同样的问题。
  • 您是否正在使用您的Service 与服务器通话?
  • 看起来很奇怪的是空白活动有标题
  • @Emmanuel 该服务确实包含与服务器通信的代码,但在您按下登录按钮之前不会使用此代码。

标签: java android


【解决方案1】:

将您的数据工作和登录活动调用移至 onStart/onResume。 当活动隐藏并再次显示时 onDestroy/onCreate 不调用时,您将获得“空”活动。 当这个:if(usersDataSource.getCurrentUser() == null) 是真的,这个:

if(localServiceBinder == null)
            localServiceBinder = new LocalServiceBinder();

bindLocalService();

setContentView(R.layout.activity_main);

成为 case 的死代码:onPause -> onStop -> onStart -> onResume 在您的活动的生命周期中。

【讨论】:

  • 这不起作用,我仍然遇到同样的问题。此外,如果 if(usersDataSource.getCurrentUser() == null) 为真,则 MainActivity 关闭并启动 LoginActivity。所以剩下的代码应该是死代码。
  • 它关闭但并不总是破坏
  • 如果您将登录活动调用放在 onStart 中而不检查用户数据 - 它有效吗?我认为必须。然后可能是用户数据(您还必须在 onStart 中初始化)取决于旧的 MainActivity 实例。没有那么多案例。当您的 MainActivity 实例被创建一次,显示 LoginActivity,并且当您第二次调用应用程序时,您确实遇到了一种情况 - 没有调用 onCreate,因为旧实例没有被销毁。
  • 不幸的是,这也不起作用。奇怪的想法是它确实启动了 LoginActivity。尽管我看不到它们,但我可以单击空白屏幕上的按钮。
猜你喜欢
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多