2011-11-26 35 views
62

Tôi muốn kết thúc hoạt động từ bên trong phương thức onCreate. Khi tôi gọi finish(), onDestroy() không được gọi ngay lập tức, mã sẽ tiếp tục chảy qua finish(). onDestroy() không được gọi cho đến sau cú đúp đóng onCreate().onTạo dòng chảy tiếp tục sau khi kết thúc()

Mỗi mô tả onCreate() tại developer.android.com/reference.

Bạn có thể gọi kết thúc() từ bên trong chức năng này, trong trường hợp onDestroy (mà) sẽ được ngay lập tức gọi mà không cần bất kỳ phần còn lại của vòng đời hoạt động (onStart(), onResume(), onPause() , vv) thực hiện.

Lý do tôi hỏi là: Tôi muốn kiểm tra dữ liệu từ Gói được chuyển đến onCreate(). Tất nhiên tôi có quyền kiểm soát những gì được chuyển đến onCreate, nhưng tôi vẫn nghĩ rằng nó nên được kiểm tra tại thời điểm giao hàng.

Mã của tôi chứa lớp A, bắt đầu hoạt động B. Tôi tin rằng hai thẻ "bên ngoài của điều khoản" cuối cùng, không nên được gọi vì phương pháp finish trong tuyên bố if nên đã phá hủy hoạt động. Nó không có gì để làm với mệnh đề if vì dòng thẻ sau khi cuộc gọi thứ hai finish() vẫn còn đọc.

Mã của tôi:

Class 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 

My Mã 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 

Đây là kết quả của các thẻ của tôi:

11-26 15:53 : 40.456: INFO/tag (699): Lớp: goToBButton, onClick

11-26 15: 53: 40,636: INFO/thẻ (699): Một Class: onPause

11-26 15: 53: 40,865: INFO/thẻ (699): B Class: một dòng trước 1 kết thúc

11-26 15: 53: 40,896: INFO/thẻ (699): B class: bên ngoài của mệnh đề if, trước thứ hai kết thúc

11-26 15: 53: 40,917: INFO/thẻ (699): Loại B: ngoài mệnh đề if, sau khi kết thúc

11-26 15: 53: 41.035: INFO/tag (699): Lớp: onResume

11-26 15: 53: 41,165: INFO/thẻ (699): B Class: onDestroy

+0

"ngay lập tức" là một lựa chọn từ rất nghèo trong tài liệu ... – Karu

Trả lời

103

Tôi đoán rằng đó là vì kết thúc() không gây phương pháp onCreate trở lại .Bạn có thể thử cách thêm

finish(); 
return; 

Hoặc sử dụng một nếu khác

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

Đề xuất đầu tiên về "chỉ cần thêm trả lại" đã hoạt động! Sau khi nó được trả lại, ClassA trên sơ yếu lý lịch được gọi, sau đó Class B onDestroy được gọi. – flobacca

+1

Chỉ cần thêm trả lại; hiển thị lỗi sau đó đối với mã không thể truy cập. Để bỏ qua điều này, hãy sử dụng trả lại trong 'if' – Onimusha

19

Nó có vẻ như finish() không hoạt động cho đến khi onCreate() kiểm soát trở lại hệ thống. Vui lòng tham khảo bài đăng này: about finish() in android. Bạn phải xem xét vấn đề này nếu bạn không muốn bất kỳ mã nào của bạn được thực hiện sau khi gọi xong.

Hy vọng điều đó sẽ hữu ích.

+0

để xác nhận. – flobacca

Các vấn đề liên quan