这让我有点疯狂。
我有以下应用程序:
活动 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 正在通信时,Back 键被禁用。这是 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() 为假时,我们说完了,我们希望返回键退出活动 C。
问题是,它不起作用。我已经通过日志消息和第一次 sessionActivity() == false 跟踪了这一点,我确实收到了“与套接字对话完成”的消息,所以我知道我来对地方了。但是,我必须第二次按下 Back 才能让活动 C 消失。
有任何想法吗?
更新更新:
我已经尝试了这两个答案,并得到了同样令人困惑的结果。
这是我的一些 logcat,显示了不同生命周期方法的执行。我有许多问题穿插在 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() ,我们就完成了。