onActivityResult () được gọi sớm


92

Tôi bắt đầu Activity(hậu duệ của PreferenceActivity) từ hoạt động công nhân của mình như sau:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigurelớp KHÔNG có bất kỳ setResult()cuộc gọi nào . Trên thực tế, MyConfigurelớp không có bất kỳ mã nào ngoại trừ OnCreate()nơi nó tải các tùy chọn bằng cách sử dụng addPreferencesFromResource.

Bây giờ onActivityResultđược gọi với requestCodecủa 1458sớm, ngay sau khi MyConfigurehoạt động được chạy. Đã thử nghiệm trên trình giả lập 1.6 và 2.1 cũng như thiết bị 2.1. Có một cuộc gọi setResult()chôn cất ở đâu đó PreferenceActivity? Hoặc làm cách nào khác có thể giải thích cho cuộc gọi quá sớm này?


1
Một hoạt động không kết thúc trên setResults (), nó kết thúc trên finish (). Bạn có thể hiển thị phương pháp onCreate của hoạt động MyConfigure của bạn không?
Cheryl Simon

Đúng, nó không. Tuy nhiên, có điều gì đó gọi setResult () trước thời hạn và tôi đang tự hỏi, nó là gì. Mã của onCreate là tầm thường: public class MyConfigure mở rộng PreferenceActivity {@Override được bảo vệ void onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Eugene Mayevski 'Gọi lại

làm thế nào để bạn nghĩ để biết rằng setResult được gọi?
RoflcoptrException

Đó chính xác là những gì tôi đã tạo ra câu hỏi. Để tìm hiểu, tại sao onActivityResult được gọi sớm.
Eugene Mayevski 'Gọi lại

Đầu ra logcat nói gì trong khoảng thời gian này? Cụ thể là thẻ "ActivityManager", cho biết Ý định nào đang được gọi.
Christopher Orr

Câu trả lời:


254

Điều này được khắc phục bằng cách thay đổi chế độ khởi chạy thành singleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

Có một lỗi / tính năng (?) Trong Android, ngay lập tức báo cáo kết quả (chưa được thiết lập) Activity, được khai báo là singleTask(mặc dù thực tế là hoạt động vẫn tiếp tục chạy). Nếu chúng tôi thay đổi launchModehoạt động chính từ singleTaskthành singleTop, mọi thứ hoạt động như mong đợi - kết quả chỉ được báo cáo sau khi hoạt động kết thúc. Mặc dù hành vi này có một số lời giải thích nhất định (chỉ có một singleTaskhoạt động có thể tồn tại và có thể xảy ra nhiều người chờ cho nó), đây vẫn là một hạn chế không hợp lý đối với tôi.


2
Nó có vẻ là một lỗi! ^^ hành vi rất kỳ lạ!
Felipe

7
Nếu hoạt động có chế độ khởi chạy singleTask, nó không cần nhận kết quả từ các hoạt động phụ bằng onActivityResult. Các hoạt động phụ chỉ cần gọi finish () và sau đó bắt đầu hoạt động chính với mục đích dữ liệu. Trong hoạt động chính, bạn phải ghi đè phương thức onNewIntent và xử lý ý định đã nhận.
Nik

43
launchMode = "singleInstance" cũng gây ra hành vi này
ffleandro

1
Có vẻ như điều này không hiệu quả với tôi, tôi đã thử singleTop trên hoạt động của cha mẹ nhưng vô ích. Tôi cũng đặt cờ ý định vào FLAG_ACTIVITY_SINGLE_TOP, mặc dù yêu cầu hiện nay cho thấy giá trị đúng nhưng kết quả luôn luôn là 0.
Neon Warge

11
nó xảy ra trên Kitkat 4.4.4, không xảy ra trên Lolipop.
Somasundaram Mahesh

18

Tôi đã giải quyết vấn đề của mình sau khi gỡ bỏ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);trước khi gọi fragment.startActivityForResult(intent, 0);.


1
Cảm ơn bạn! Điều này đã giải quyết vấn đề của tôi. Có một lời giải thích cho điều này ở đâu đó?
Conner Harkness

Có một lời giải thích cho điều này trong tài liệu cho cờ những ngày này "Không thể sử dụng cờ này khi người gọi đang yêu cầu kết quả từ hoạt động đang được khởi chạy". Nó không phải là một lời giải thích nhưng ít nhất là một cảnh báo!
Code Novitiate

4

Tôi vừa xóa tất cả "android: launcMode" tùy chỉnh khỏi Hoạt động của mình và mọi thứ hoạt động như một sự quyến rũ. Thay đổi điều này không phải là một ý kiến ​​hay khi bạn không biết CHÍNH XÁC những gì Android đang hiểu ... Android hơi khó theo cách này.


1

Điều này xảy ra với tôi khi ý định đã được Intent.FLAG_RECEIVER_FOREGROUNDthiết lập.

(Vâng, lá cờ đó không liên quan đến hoạt động, nhưng tôi đã có nó trong tất cả ý định của mình như một phần của giải pháp súng ngắn cho một vấn đề khác .)


-1

Một lần nữa, như trong bình luận của Mayra, setResult()không liên quan gì đến vấn đề của bạn. vì lý do nào đó, MyConfigurelớp tự kết thúc và khi nó xảy ra PreferenceActivitychỉ giả định rằng có thể có kết quả từ MyConfiguređó vì đó là cách bạn viết mã.

điều này cũng xảy ra khi bạn buộc lại bất kỳ hoạt động nào bắt đầu với startActivityForResult() ...

Vì vậy, tôi nghĩ tốt hơn là nên tập trung vào lý do tại sao MyConfigurelớp học của bạn buộc phải hoàn thành.


Lớp MyConfigure KHÔNG kết thúc, bạn đoán sai, xin lỗi. Nếu đúng như vậy, sẽ không có câu hỏi nào
Eugene Mayevski 'Callback
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.