2014-05-18 16 views
12

Như tiêu đề cho biết, Tại sao intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) hoặc intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) sẽ không hoạt động?Tại sao FLAG_ACTIVITY_CLEAR_TOP không hoạt động?

Tôi có 3 hoạt động chúng ta hãy nói A, B và C.

Khi tôi đang cố gắng để khởi động Hoạt động A từ C với mã:

Intent i = new Intent(this, A.class); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(i); 

Nó chỉ đơn giản bắt đầu Hoạt động A nhưng không rõ ràng hàng đầu.! -_-

Tôi cũng đã thử sử dụng setFlags().

Tôi đã đọc các câu hỏi khác nhau về SO về vấn đề này, nhưng tôi không thể tìm thấy câu trả lời đúng. > _ <

Ai đó hãy giúp bạn!

Sửa

Mã cho onBackPressed() trong hoạt động 'A' theo yêu cầu của @codeMagic.

@Override 
public void onBackPressed(){ 
    if(wvLogin.canGoBack()) 
     wvLogin.goBack(); 
    else 
     super.onBackPressed(); 
} 
+0

như thế nào không nói rõ đỉnh cao? – codeMagic

+1

Bạn có ý nghĩa gì? Khi A được lau, nhấn nút quay lại sau đó nên thoát khỏi ứng dụng nhưng intean trong trường hợp này, C đến để tập trung từ nền. – ashu

+1

Đó là chính xác những gì tôi có nghĩa là "làm thế nào". Tôi chỉ cần đảm bảo rằng định nghĩa của bạn giống như của tôi trước khi nhìn vào nó hơn nữa. – codeMagic

Trả lời

30

Từ tài liệu cho FLAG_ACTIVITY_CLEAR_TOP:

Nếu đặt, và hoạt động được triển khai vẫn đang chạy trong nhiệm vụ hiện tại, sau đó thay vì tung ra một ví dụ mới về điều đó hoạt động, tất cả các khác các hoạt động trên đầu trang sẽ bị đóng và Mục đích này sẽ được gửi đến hoạt động cũ (hiện tại trên đầu) là Mục đích mới.

Như bạn đã thêm trong nhận xét của mình, hoạt động A đã được hoàn tất trước khi gọi B, vì vậy tình trạng này không áp dụng. Thay vào đó, một hoạt động mới A sẽ được khởi chạy.

Như tôi đã nhìn thấy nó, bạn có hai lựa chọn ở đây:

1) Sử dụng các Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK cờ. Thao tác này sẽ bắt đầu hoạt động A làm thư mục gốc của ngăn xếp. Nó hoạt động, nhưng bất kỳ hoạt động nào khác trong ngăn xếp sẽ bị mất. Giả sử A là hoạt động đầu tiên (hoặc ít nhất, bạn không quan tâm đến bất kỳ hoạt động nào trước đó trong ngăn tác vụ) thì điều đó không quan trọng. Lưu ý: CLEAR_TASK yêu cầu cấp API 11.

2) Một giải pháp khả thi (trong trường hợp giả định trước là không đúng) sẽ không sử dụng cờ ý định ở tất cả:

  • B bắt đầu C với startActivityForResult().
  • Thay vì gọi A, C kết thúc, đã đặt kết quả cho B cho biết A phải được khởi chạy.
  • Trong B.afterActivityResult(), kết thúc B và khởi động A.
+0

Một tùy chọn khác là để lại hoạt động A trong ngăn xếp (không gọi kết thúc() khi khởi chạy các hoạt động khác). Điều này sẽ cho phép bạn sử dụng FLAG_ACTIVITY_CLEAR_TOP. Tuy nhiên, bạn sẽ cần phải đối phó với những người dùng có thể BACKING vào hoạt động A. –

+0

nếu tôi có thêm một số hoạt động trước A như trong [câu hỏi SO này] (http://stackoverflow.com/questions/36111261/flag-activity-clear -top-không-không-làm-như-mong đợi), và tôi đã phải giữ chúng trong ngăn xếp? NEW_TASK không thành công ở đó, phải không? –

3

Bạn sử dụng một ý VẬT LIỆU KHÁC NHAU: sử dụng một trong những bạn khởi tạo:

Intent i = new Intent(this, A.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\WRONG;; 
    startActivity(i); 

giải pháp:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\RIGHT;; 

Bạn có thể hoặc đặt một noHistory đúng với Hoạt động A trong manifest

android:noHistory=true 
+0

có vẻ như tôi đã mắc sai lầm khi nhập câu hỏi. Chỉnh sửa ... – ashu

+1

@ashu cập nhật sử dụng noHistory –

+0

Tại sao đặt noHistory thành hoạt động 'A' khi hoạt động tốt? Tôi có vấn đề với 'B' & 'C' vì họ không hoàn thành trong nền! – ashu

3

Bạn đang thiếu Intent.FLAG_ACTIVITY_SINGLE_TOP cờ

Hãy thử điều này:

Intent i = new Intent(this, A.class); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(i); 
Các vấn đề liên quan