检测到后退键但活动未结束

时间:2012-04-28 16:21:14

标签: android

这让我有点疯狂。

我有以下申请:

活动A - >活动B - >活动C

A在清单中定义为android:launchMode =“singleTask”

B按如下方式启动C:

        Intent startActivity = new Intent();
        startActivity.setClass(this,C.class);
        startActivity.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(startActivity);

C通过套接字与远程系统来回交谈。

当C正在通信时,后退键被禁用。这是C的onKeyDown():

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (sessionActive() && (keyCode == KeyEvent.KEYCODE_BACK)) {

        return false;
    }
    else if (!sessionActive() && (keyCode == KeyEvent.KEYCODE_BACK)){

            Log.d("C","done talking to socket, got Back key, exit Activity");
        /* delete data from an internal static object */
    }

    return super.onKeyDown(keyCode, event);
}
如果我们仍然在讨论套接字并且我们希望禁用Back键,那么

sessionActive()将返回true。

当sessionActive()为false时,我们完成了谈话,我们想要Back键退出活动C.

问题是,它不起作用。我已经通过日志消息和第一次sessionActivity()== false跟踪了这个消息我确实得到了“完成与套接字交谈”的消息,所以我知道我到了正确的地方。但是,我必须第二次按Back才能让活动C消失。

有什么想法吗?

更新更新:

我已经尝试了两个答案并且得到了同样令人困惑的结果。

这是我的一些logcat,显示了diffent生命周期方法的执行。我在logcat文本中散布了许多问题。

C.onCreate() 
C.onStart() 
C.onResume() 
C.onKeyDown() sessionActive()==false, keyCode = BACK              
                          this should get us out but doesn't

C.finish() sessionActive is FALSE                                
                          shouldn't this go to onStop()?

C.onPause() sessionActive is FALSE
C.onRestart() sessionActive is FALSE                              <-  ???????? onRestart?
C.onStart() sessionActive is FALSE                                <-  ???????? onStart?
C.onResume() sessionActive is FALSE
C.onStop() sessionActive is FALSE                                 <- this makes sense
C.onDestroy() sessionActive is FALSE                           <- so does this
C.onPause() sessionActive is FALSE                             <- ????????
C.onResume() sessionActive is FALSE

C.onKeyDown() sessionActive is FALSE, keyCode = BACK
                        this is 2nd back press that does exit
C.finish() sessionActive is FALSE
C.onPause() sessionActive is FALSE                there is no onRestart here!!!!!!!!!
C.onStop() sessionActive is FALSE
C.onDestroy() sessionActive is FALSE

我不明白控制的流程。我本以为finish()将控制权发送给onDestroy(),我们就完成了。

2 个答案:

答案 0 :(得分:0)

您可以尝试:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if ( keyCode == KeyEvent.KEYCODE_BACK )
    {
        if ( sessionActive() )
            return false;

        Log.d("C","done talking to socket, got Back key, exit Activity");
        /* delete data from an internal static object */
        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

答案 1 :(得分:0)

你可以

@Override
public void onBackPressed() {
    /* delete data from an internal static object */
    finish();
}

在您的活动中