1

これは私を少し夢中にさせています。

私は次のアプリケーションを持っています:

アクティビティ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);
}

sessionActive()は、まだソケットを介して通信していて、Backキーを無効にしたい場合にtrueを返します。

sessionActive()がfalseの場合、会話は終了し、BackキーでアクティビティCを終了します。

問題は、それが機能していないことです。私はログメッセージを介してこれを追跡し、最初のsessionActivity()== false「ソケットとの通信が完了しました」というメッセージが表示されるので、適切な場所に到達していることがわかります。ただし、アクティビティCを終了するには、[戻る]を2回押す必要があります。

何か案は?

更新更新:

私は両方の答えを試しましたが、同じ紛らわしい結果が得られました。

これは、さまざまなライフサイクルメソッドの実行を示す私の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()に制御を送信すると思っていたので、これで完了です。

4

2 に答える 2

0

あなたが持つことができます

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

あなたの活動で

于 2012-04-28T17:59:43.040 に答える
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);
}
于 2012-04-28T16:48:12.360 に答える