2012-03-14 20 views
5

Tôi có 5 hoạt động (giả sử A,B,C,DE). Các hoạt động từ A đến D là để thiết lập một số dữ liệu, do đó, người dùng có thể chuyển đổi qua lại bất cứ điều gì. Hoạt động E, mặt khác, là tóm tắt, vì vậy người dùng không còn được phép quay lại.Android hoàn thành các hoạt động trước đây để điều hướng

Ý tưởng của tôi là để kết thúc mọi hoạt động trước khi người dùng được để E

Hiện nay hoạt động của tôi A-D không có lá cờ gắn liền với chúng.

Activty E được gọi là như thế này:

Intent I = new Intent(this, SomeClass.class);

I.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(I);

Tôi đã đọc ở khắp mọi nơi mà những lá cờ có nghĩa vụ phải đạt được những gì tôi đang cố gắng để làm, nhưng họ không, khi người dùng truy cập hoạt động E và nhấn nút Back, ứng dụng sẽ quay lại hoạt động D .

Bất kỳ ý tưởng nào? Tôi đang thiếu cái gì đó? Đây có phải là cách đúng để giải quyết vấn đề này không?

Nhờ sự giúp đỡ của bạn

Trả lời

7

Sử dụng phương pháp startActivityForResult trong mỗi hoạt động A, B, C, D thay vì startActivity. Và khi người dùng thoát khỏi Hoạt động E, hãy xử lý nút sau và đặt mã kết quả trong mục đích. bây giờ trong phương thức onActivityResult của mỗi lớp A, B, C và D xử lý nó, đóng hoạt động và chuyển kết quả cho hoạt động trước đó. D. Bạn cũng có thể làm điều đó ngay khi người dùng kết thúc Hoạt động D. Khi người dùng đi từ D đến E, bạn có thể sử dụng phương pháp trên để thực sự chuyển sang Hoạt động A và sau đó mở hoạt động E và kết thúc Hoạt động A

Cả hai trường hợp trên đều cho ra kết quả tương tự từ góc độ người dùng và không thấy hoạt động trung gian A, B, C, D trừ khi bạn đang thực hiện một số công việc dài trong phương pháp onStart của các hoạt động đó.

+0

Đó là một thay đổi dễ dàng để làm và nó đã làm việc, cảm ơn bạn rất nhiều! –

0

Bạn cần phải ghi đè lên các phương pháp onKeyDown() trong activit E và ngăn chặn các sự kiện nhấn phím cho KEYCODE_BACK (Back key), và chỉ đơn giản là return true để cho biết bạn xử lý các sự kiện Trở lại . Bây giờ người dùng sẽ không được phép điều hướng trở lại hoạt động trước đó.

+0

Điều đó không làm được. Đó là thực sự tạo ra một vấn đề mà người dùng không có một cơ hội để sử dụng nút quay lại nữa mà là chống lại các thực hành tốt nhất. Không bao giờ chặn nút quay lại trừ khi bạn có lý do chính đáng để làm như vậy. Và trong trường hợp này, người dùng được ngăn chặn ngay cả khi thoát ra ngoài khi họ nhấp vào nút quay lại. – achie

0

khi bạn bắt đầu hoạt động E, sử dụng mã này:

Intent I = new Intent(this, SomeClass.class); 
I.putExtra("finish_all", true); 
I.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(I); 
+0

Tôi đã thử nó nhưng dường như không làm gì cả. Đó là một số cờ tích hợp hay gì đó? Tôi có phải đối xử với nó theo một cách nào đó không? –

3

Tôi cho rằng your're cố gắng để viết một số loại một Wizard :)

Để sử dụng cờ FLAG_ACTIVITY_CLEAR_TOP bạn phải có hoạt động E đã có trong các hoạt động công việc hiện tại.

Ví dụ: E-> A-> B-> C-> D -> nếu D sẽ khởi động E bằng CLEAR_TOP, bạn sẽ chỉ có hoạt động E trong ngăn xếp.

FLAG_ACTIVITY_CLEAR_TOP Sử dụng cờ CLEAR_TOP để khởi động một hoạt động Nếu có được một thể hiện của các loại hoạt động gọi là hiện tại trong ngăn xếp, sau đó trường hợp này được đưa đến foreground thay vì tạo một thể hiện mới. Ngoài ra, tất cả các hoạt động trong ngăn xếp nằm trên đầu của cá thể đó sẽ bị xóa khỏi ngăn xếp. Ví dụ, giả định rằng ngăn xếp hoạt động hiện tại là ABCDE, khởi chạy một hoạt động của loại C sẽ xóa các hoạt động D và E khỏi nhiệm vụ và dẫn đến ngăn xếp ABC.

FLAG_ACTIVITY_SINGLE_TOP (không liên quan trong trường hợp của bạn) Nếu một thể hiện của hoạt động đích đã ở trên cùng của ngăn xếp, không có trường hợp mới được tạo.

+0

Giải thích của bạn đã giúp tôi rất nhiều để hiểu việc sử dụng thực sự của những lá cờ đó. Trong trường hợp của tôi gọi E trước khi A không khả thi ngay bây giờ, nhưng tôi sẽ ghi nhớ điều này cho các ứng dụng trong tương lai. Cảm ơn bạn rất nhiều! –

5

Chỉ trong trường hợp ai đó cần mã mà @achie gợi ý, ở đây là:

A, B, C, D nên bắt đầu các hoạt động sau đây như thế này:

Intent myIntent = new Intent(this, B.class); // Or C/D 
startActivityForResult(myIntent, 1); 

Ngoài ra, A , B, C, D nên ghi đè:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK && requestCode == 1) { 
     setResult(RESULT_OK); 
     finish(); 
    } 
} 

sau đó E hoạt động nên xử lý lại nút:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     setResult(RESULT_OK); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

Công việc này có phù hợp với bạn không? Tôi cần chính xác những gì bạn cần, đã thử mã ở trên, nhưng hoạt động cuối cùng của tôi tiếp tục quay trở lại hoạt động trước đó. –

+0

Vâng, điều này có hiệu quả đối với tôi. Điều hướng đến B, điều hướng đến C, điều hướng đến D, điều hướng đến E, sau đó bạn nhấn trở lại và bạn chuyển đến Màn hình chính vì tất cả các hoạt động đã hoàn tất. Tôi đã tải lên một mẫu dự án Android cho bạn: https://anonfiles.com/file/e9a7c889a7b2f358f29c868b7fa1d755 – fernandospr

+0

Cảm ơn bạn đã dành thời gian đăng bài, nhưng tôi đã cố gắng làm cho nó hoạt động. –

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