Luồng onCreate tiếp tục sau khi kết thúc ()


76

Tôi muốn kết thúc một hoạt động từ bên trong onCreatephương pháp. Khi tôi gọi finish(), onDestroy()không được gọi ngay lập tức, mã vẫn tiếp tục trôi qua finish(). onDestroy()không được gọi cho đến sau onCreate()dấu ngoặc nhọn đóng.

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

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

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 đ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ẻ cuối cùng "bên ngoài mệnh đề if", không nên được gọi vì finishphương thức trong ifcâu lệnh lẽ ra đã hủy hoạt động. Nó không liên quan gì đến mệnh đề if vì dòng thẻ sau lệnh finish()gọi thứ hai vẫn được đọc.

Mã của tôi:

Hạng 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

Mã của tôi 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): A Class: goToBButton, onClick

11-26 15: 53: 40.636: INFO / tag (699): A Class: onPause

11-26 15: 53: 40.865: INFO / tag (699): B Class: một dòng trước khi kết thúc đầu tiên

11-26 15: 53: 40.896: INFO / tag (699): Loại B: bên ngoài mệnh đề if, trước khi kết thúc thứ hai

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

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

11-26 15: 53: 41.165: INFO / tag (699): B Class: onDestroy


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

Câu trả lời:


122

Tôi đoán rằng đó là vì finish () không khiến phương thức onCreate trả về. Bạn có thể thử chỉ cần thêm

finish();
return;

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

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

4
Đề xuất đầu tiên về "chỉ cần thêm trả lại" đã hoạt động! Sau khi nó quay 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 lợi nhuận; hiển thị lỗi sau đó cho mã không thể truy cập. Để bỏ qua điều này sử dụng trở lại trongif
Onimusha

23

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 () trong 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 mình được thực thi sau khi gọi xong.

Hy vọng nó giúp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.