2013-08-14 22 views
8

Tôi có một ứng dụng mà có sự chuyển tiếp này:Android- Trở lại với Hoạt động trước với giá trị Ý định khác nhau

A -> B -> C -> D-> C 

Khi bước vào C, tôi phải kiểm tra một lá cờ. Sau đó, tôi phải chuyển nó như ý định (chúng ta hãy nói intentX = false) để D. Sau khi làm điều gì đó trong D, sau đó nó sẽ quay lại C sau khi nhấn nút. Những gì tôi đã làm là chỉ cần vượt qua một lần nữa các intentX với giá trị đúng, sau đó startActivity C một lần nữa. Vậy điều gì xảy ra là nó đã tạo một Hoạt động khác C.

Điều tôi muốn xảy ra là tôi sẽ không phải bắt đầu Hoạt động C mới, nhưng sử dụng C trước đó bằng cách gọi super.onBackPressed(). Nhưng tôi không thể vượt qua giá trị mới của intentX. Có cách nào khác, để đạt được những gì tôi muốn. Tôi có thể đã bỏ lỡ một số.

Trả lời

13

Điều bạn muốn là startActivityForResult(). Khi bạn đi từ C đến D, thay vì sử dụng startActivity(), hãy sử dụng thay vì startActivityForResult(). Sau đó, khi bạn muốn quay lại từ D đến C bạn sử dụng setResult(), có thể bao gồm đối tượng Intent với extras để quay lại C.

Tôi không khuyên bạn làm điều này trong onBackPressed() nếu bạn không vì điều này sẽ không phải là những gì người dùng mong đợi. Thay vào đó, bạn nên quay lại với dữ liệu này với một sự kiện như một cú nhấp chuột Button.

Vì vậy, trong C bạn sẽ làm điều gì đó như

Intent i = new Intent(new Intent(C.this, D.class); 
startActivityForResult(i, 0); 

sau đó trong D khi bạn đã sẵn sàng để trở lại

Intent i = new Intent(); 
i.putExtra(); // insert your extras here 
setResult(0, i); 

sau đó khi bạn quay lại C bạn sẽ bước vào phương pháp này (taken from the Docs)

protected void onActivityResult(int requestCode, int resultCode, 
     Intent data) { 
    if (requestCode == PICK_CONTACT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
      // A contact was picked. Here we will just display it 
      // to the user. 
      startActivity(new Intent(Intent.ACTION_VIEW, data)); 

      /* 
       can also get the extra sent back through data 
       using data.getStringExtra("someKey"); 
       assuming the extra was a String 
      */ 

     } 
+0

oh, tôi sẽ phải thử lại lần nữa. tôi phải sử dụng nó sai cách trước đây. – sftdev

+0

Điều đó có thể xảy ra, ban đầu nó dễ bị lẫn lộn cho đến khi bạn hiểu nó hoạt động như thế nào. Điều này là đủ để bạn bắt đầu nhưng cũng có một ví dụ tốt trong các tài liệu mà tôi liên kết đến và các hướng dẫn và ví dụ trên Google và SO – codeMagic

+0

Khi bạn "sẵn sàng trả lại" sau khi đặt kết quả - chức năng nào sẽ được gọi ? Tôi có nên gọi 'kết thúc() '? –

1

Có một số trường hợp startActivityForResult không thực sự cần thiết hoặc không thực tế để thay đổi tất cả các lời gọi startActivity cho startActivityForResult.

Nếu trường hợp đơn giản chỉ mới bắt đầu hoạt động trước đó 'một lần nữa' là cần thiết, đề xuất của tôi là: Sử dụng cờ FLAG_ACTIVITY_CLEAR_TOP.

Trích dẫn một ngắn gọn description:

Nếu thiết lập, và các 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 hoạt động khác trên đầu nó 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) như là một Ý định mới.

Ví dụ: hãy xem xét tác vụ bao gồm các hoạt động: A, B, C, D. Nếu D gọi startActivity() với Intent mà giải quyết với thành phần hoạt động B, sau đó C và D sẽ được hoàn thành và B nhận tiếp cận mục đích nhất định, kết quả trong ngăn xếp tại là: A, B.

Vì vậy, ví dụ này

// From ActivityD 
    Intent intent = new Intent(getApplicationContext(), ActivityB.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // The flag we wanted 
    intent.putExtra(ActivityB.SOME_EXTRA_THAT_I_NEED_CHANGED, SomeValue); // Example of changing the intent to get something new.. 
    startActivity(intent); 

đâu bạn sẽ nhận được rằng ý định mới được định nghĩa bởi đó chế độ khởi động và đó cờ nơi sử dụng để bắt đầu nó (trong trường hợp này ActivityB của chúng tôi).

hiện đang chạy trường hợp hoạt động B trong ví dụ trên sẽ hoặc nhận mục đích mới, bạn đang bắt đầu ở đây trong phương pháp onNewIntent() của nó, hoặc là tự kết thúc và khởi động lại với ý định mới. Nếu nó đã tuyên bố chế độ khởi chạy của nó là "nhiều" (mặc định là ) và bạn chưa đặt FLAG_ACTIVITY_SINGLE_TOP trong cùng một mục đích , thì nó sẽ được hoàn thành và được tạo lại; cho tất cả các chế độ khởi chạy khác hoặc nếu FLAG_ACTIVITY_SINGLE_TOP được đặt thì Intent này sẽ là được gửi đến onNewIntent() của cá thể hiện tại.

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