これは私を少し夢中にさせています。
私は次のアプリケーションを持っています:
アクティビティ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()に制御を送信すると思っていたので、これで完了です。