これは私を少し狂っています。バックキーが検出されましたが、アクティビティが終了していません
I以下のアプリケーションがあります
アクティビティA - >アクティビティB -
Aは、Androidのようにマニフェストに定義されている>アクティビティC: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);
}
sessionActive()我々はまだソケット上で話をしている場合はtrueを返し、我々は戻るキー無効にします。 sessionActive()がfalseの場合
は、私たちは話して行われていると我々は戻るキーが動作していない活動C.
問題があるが、終了したいと思います。私はこれをログメッセージと最初のsessionActivity()== falseを使って追跡しました。私は正しい場所に到達していることを知っているので、 "ソケットと話し終わった"というメッセージを受け取ります。しかし、アクティビティCを消していくためには、2回目にBackを押す必要があります。
アイデア?
のUPDATE UPDATE:
私は両方の答えを試してみましたし、同じ混乱の結果を得ています。
ここでは、異種のライフサイクルメソッドの実行を示す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()にコントロールを送ったと思っていたでしょう。
あなたの活動に
を持つことができ、あなたの省略コードは '/ *内部の静的オブジェクトからデータを削除しない* /'持ってその中の 'return'コール? – Sam
ちょうど提案として:私はあなたのsessionActiveメソッドがどれほど複雑かはわかりませんが、バックキーが押されたかどうかを確認した後、ifステートメントでそれを入れ子にしてください。現在のところ、すべてのキーを押すと非効率なメソッドがトリガーされ、バックを押すとsessionActiveメソッドを2回呼び出す可能性があります – dymmeh
Sam - そうではありません。あなたが言及した時点では戻りはありません。 – user1126515