2012-04-28 43 views
1

這讓我有點瘋狂。檢測到後退鍵但活動沒有結束

我有以下用途:

活性A - >活動B - >活動Ç

A在清單中定義爲機器人: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()是假的,我們做了交談,我們要返回鍵退出活動C.

的問題是,它不工作。我已經通過日誌消息和第一次sessionActivity()== False跟蹤了這條消息,我得到了「完成對套接字的通話」消息,因此我知道我正在到達正確的位置。但是,爲了讓活動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 

我不明白控制的流程。我會認爲完成()發送控制到onDestroy(),我們會完成。

+0

請問您省略代碼'/ *從內部的靜態對象中刪除數據* /'有'回來'調用它? – Sam 2012-04-28 16:35:09

+0

就像一個建議:我不知道你的sessionActive方法有多複雜,但你確實應該在if語句中嵌套它,看看是否按下了後退鍵。目前每個按鍵都會觸發這種效率低下的方法,如果按下了後退按鈕,則可能會調用sessionActive方法兩次 – dymmeh 2012-04-28 17:03:34

+0

Sam - 不,它不會。你提到的地方沒有回報。 – user1126515 2012-04-28 18:58:35

回答

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

你可以有

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

在活動