2012-03-13 34 views
7

Tôi có 3 hoạt động - Một, BC.Hoạt động bắt đầu với startActivityForResult() không trở về gọi Hoạt động

Tóm lại, Hoạt động A bắt đầu Hoạt động B, sau đó A cũng khởi động Hoạt động C và mong đợi kết quả từ C, nhưng không bao giờ nhận được kết quả đó.

Đây là công việc ứng dụng:

  1. Hoạt động A được đưa ra khi khởi động ứng dụng và bắt đầu Hoạt động B (không cho kết quả, chỉ cần startActivity()) trong onCreate.

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        startActivity(new Intent(getApplicationContext(), ActivityB.class)); 
    } 
    
  2. Hoạt động A sau đó cũng bắt đầu Hoạt động C sau trong mã, lần này cho kết quả sử dụng startActivityForResult(), và Hoạt động A cũng có onActivityResult.

    Intent intent = new Intent(getApplicationContext(), ActivityC.class); 
    startActivityForResult(intent, 0); 
    

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
        ... 
    } 
    
  3. Hoạt động C sử dụng setResult() và kết thúc() để trở về một số dữ liệu, mà nên trở về Hoạt động A, vì Hoạt động Một gọi startActivityForResult().

    Intent intent = new Intent(); 
    intent.putExtra("encryption", encryption); 
    setResult(56, intent); 
    finish(); 
    

NHƯNG workflow rơi im lặng ở bước 3 - Hoạt động của một onActivityResult không bao giờ được gọi là (không phải là B cho rằng vấn đề), mặc dù Hoạt động A là một bắt đầu từ C cho kết quả. Không chắc liệu Hoạt động B có cản trở giao tiếp của A và C hay vấn đề có thể xảy ra hay không. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

+2

của nó rất khó hiểu .... Hoạt động B sau đó sử dụng Hoạt động A để thực hiện cuộc gọi dịch vụ web và nếu Hoạt động A xác định thông tin đăng nhập là cần thiết, nó sẽ bắt đầu Hoạt động C –

+0

Câu hỏi đã chỉnh sửa để đơn giản hóa nó. Về cơ bản Hoạt động A bắt đầu Hoạt động B, sau đó A cũng bắt đầu Hoạt động C và muốn có kết quả từ C, nhưng không bao giờ nhận được nó. – Gady

+0

startActivityforresult đi vào hoạt động B hoạt động của nó từ hoạt động mà bạn bắt đầu và quay trở lại onactivityresult –

Trả lời

20

Tôi chưa bao giờ có thể làm việc này, vì vậy tôi đã sử dụng Trình xử lý thay thế để trả lại dữ liệu cho Hoạt động cần thiết.

CẬP NHẬT: Sau khi chạy lại lần nữa, tôi phát hiện ra lý do thực sự này không hoạt động là vì tôi có android:noHistory="true" cho hoạt động gọi/nhận A trong tệp kê khai. Loại bỏ android:noHistory="true" đã sửa nó, nhưng nếu bạn cần nó là đúng, thì Trình xử lý là giải pháp tốt.

+0

Cảm ơn bạn! Tôi không thể hiểu tại sao onActivityResult không được gọi và đây là lý do. Tôi đã đăng sự cố tài liệu Android https://code.google.com/p/android/issues/detail?id=68137. – Vicki

+0

@Vicki 13 tháng sau, vấn đề này vẫn là "Mới". Bằng cách nào đó Android hút trong quá nhiều lĩnh vực. Tài liệu chắc chắn là một trong số đó. – sstn

1

Tôi không nghĩ bạn nên sử dụng getApplicationContext() trong mục đích.

Từ trang web của nhà phát triển.

getApplicationContext() 
Return the context of the single, global Application object of the current process. 

Khi bạn đang startActivityForResult() nó cố gắng quay lại hoạt động được chỉ định trong mục đích mà bạn đang cung cấp làm ngữ cảnh ứng dụng toàn cầu.

Nếu bạn có một ActivityB thì bạn nên gọi nó là như

Intent intent = new Intent(ActivityB.this, ActivityC.class); 
startActivityForResult(intent, 0); 

Sau đó, nó sẽ cố gắng để trở lại ActivityB khi ActivityC được thực hiện.

+0

Tôi nghĩ rằng hoạt động kết quả được trả về là hoạt động được gọi là startActivityForResult(), không phải là Ngữ cảnh được chỉ định khi tạo Intent. Bất kể, thay đổi nó như bạn đã chỉ định vẫn không trả về kết quả là onActivityResult. – Gady

+0

Làm rõ, nếu 2 dòng mã cuối cùng được gọi từ ActivityB. ActivityC được bắt đầu sau đó quay trở lại ActivityB, nó không trả lời bạn câu hỏi ban đầu nhiều hơn để minh họa các thông số chính xác để sử dụng khi tạo ra một mục đích. Có lẽ thêm một ví dụ hoàn chỉnh hơn về mã của bạn nơi bạn bắt đầu Hoạt động có thể hữu ích. – triggs

+0

Trong kịch bản của tôi, 2 dòng mã cuối cùng của bạn được gọi từ Hoạt động A, là nơi tôi muốn kết quả được trả về. Nhưng điều đó không xảy ra, và điều duy nhất tôi có thể xác định là bởi vì Hoạt động A cũng bắt đầu Hoạt động B trước tiên. – Gady

-2

Bạn có thể cung cấp cho một thử này:

if (getParent() == null) { 
setResult(RESULT_OK, dataTobePassback); 
} else { 
getParent().setResult(RESULT_OK, dataTobePassback); 
} 

dataTobePassback là một Intent mang những thứ bạn có thể cần phải vượt qua trở lại hoạt động kêu gọi

+0

Sẽ rất thú vị khi biết tại sao/cách này hoạt động. – sstn

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