2012-04-28 19 views
1

これは私を少し狂っています。バックキーが検出されましたが、アクティビティが終了していません

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()にコントロールを送ったと思っていたでしょう。

+0

あなたの活動に

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

を持つことができ、あなたの省略コードは '/ *内部の静的オブジェクトからデータを削除しない* /'持ってその中の 'return'コール? – Sam

+0

ちょうど提案として:私はあなたのsessionActiveメソッドがどれほど複雑かはわかりませんが、バックキーが押されたかどうかを確認した後、ifステートメントでそれを入れ子にしてください。現在のところ、すべてのキーを押すと非効率なメソッドがトリガーされ、バックを押すとsessionActiveメソッドを2回呼び出す可能性があります – dymmeh

+0

Sam - そうではありません。あなたが言及した時点では戻りはありません。 – user1126515

答えて

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); 
} 
0

あなたは

関連する問題