2011-11-26 67 views
62

我想完成onCreate方法中的活動。當我撥打finish()時,onDestroy()未立即被調用,代碼不斷流過finish()。直到onCreate()右大括號後纔會調用onDestroy()onCreate流程在完成後繼續()

根據developer.android.com/reference中的onCreate()說明。

你可以從這個函數中調用finish(),在這種情況下 的onDestroy()會立即調用時沒有任何 活動週期(在onStart()的onResume()的onPause其餘的()等)執行。

我想問的原因是:我想從Bundle中檢查數據傳遞給onCreate()。當然,我可以控制傳遞給onCreate的內容,但我仍認爲應在交貨時檢查。

我的代碼包含類A,它啓動活動B。我相信最後兩個「if子句之外」標記不應該被調用,因爲if語句中的finish方法應該已經銷燬該活動。它與if子句無關,因爲第二個finish()調用之後的標記行仍然被讀取。

我的代碼:

A類

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // goToBButton: when pressed sends message to class B.  
    Button goToBButton = (Button)this.findViewById(R.id.go_to__b_btn); 
    goToBButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick (View v) {  
      Log.i(TAG,"A Class: goToBButton, onClick"); 
      Intent i = new Intent(A.this, B.class); 
      startActivityForResult(i,REQ_TO_B); 
     }  
    });     
} // end onCreate 

我的代碼ClassB的

public class B extends Activity{ 

private static final String TAG = "tag"; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layoutb); 

    // set as true, should always print Tag: one line before first finish" 
    if (true) { 

    Log.i(TAG,"B Class: one line before 1st finish"); 
    finish(); 
    } 

    // shouldn't get here after first finish 
    Log.i(TAG,"B Class: outside of if clause, before second finish"); 
    finish(); 
    // shouldn't get here after second finish 
    Log.i(TAG,"B Class: outside of if clause, after finish");     
    } // end onCreate 


@Override 
public void onStart() { 
    super.onStart(); 
    Log.i(TAG,"B Class: onStart"); 
} 

@Override 
public void onRestart() { 
    super.onRestart(); 
    Log.i(TAG,"B Class: onRestart"); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    Log.i(TAG,"B Class: onResume"); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    Log.i(TAG,"B Class: onPause"); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    Log.i(TAG,"B Class: onStop"); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.i(TAG,"B Class: onDestroy"); 
} 

} // end B Class 

這裏是我的標籤結果:

11-26 15:53 :40.456:INFO /標記(699):A類:goToBButton,onClick

11-26 15:53:40.636:INFO /標籤(699):A類:的onPause

11-26 15:53:40.865:INFO /標籤(699):B類:前一個線第一完成

11-26 15:53:40.896:INFO /標籤(699):B類:如果子句, 的外部之前第二完成

11-26 15:53:40.917:INFO /標籤(699):B類:if子句外, 完成後

11-26 15:53:41.035:INFO/tag(699):Class:onResume

11-26 15:53:41.165:INFO /標籤(699):B類:的onDestroy

+0

「立即」是一個非常窮字的選擇在文檔... – Karu

回答

103

我猜測,這是因爲完成()不會導致onCreate方法返回。你可以嘗試簡單地增加

finish(); 
return; 

或者使用的if else

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layoutb); 
    if(good data){ 
     //do stuff 
    }else{ 
     finish(); 
    } 
} 
+3

的「簡單地增加回報」的第一個建議的工作!在它返回之後,將調用resume上的ClassA,然後調用Class B onDestroy。 – flobacca

+1

只需添加返回;之後爲不可達代碼顯示錯誤。要繞過這個使用'if' – Onimusha

19

好像finish()不直到onCreate()返回控制系統工作。請參考這篇文章:about finish() in android。如果您不想在完成調用後執行任何代碼,則必須考慮此問題。

希望它有幫助。

+0

感謝確認的回報。 – flobacca