2012-04-05 4 views
5

Tôi có 2 hoạt động AAA và BBB. Tôi gọi BBB từ AAA bằng cách sử dụng startActivityForResult (Intent, int). Sau khi tôi làm xong với BBB, tôi nhấn nút Back để quay trở lại AAA. Trong BBB, tôi ghi đè onPause() và đặt kết quả bằng cách sử dụng setResult (RESULT_OK).kết quả không được đặt trong onPause() sử dụng setResult() khi nhấn nút Quay lại

Trong AAA, tôi kiểm tra kết quả của mình trong onActivityResult (int requestCode, int resultCode, Intent data) và tôi tiếp tục nhận được RESULT_CANCELLED.

Sau khi chi tiêu đôi khi trên google/stackoverflow, tôi đã tìm ra rằng nếu tôi ghi đè onBackPressed() và đặt kết quả trong đó, thì nó hoạt động hoàn toàn tốt.

Điều tôi không hiểu là, tại sao kết quả không được đặt trong onPause(), khi trên thực tế onPause() được gọi sau onBackPressed(). Tôi đã trải qua các luồng hoạt động trong tài liệu Dev và tôi khá rõ ràng về những gì đã được đề cập ở đó.

Bất kỳ ai có bất kỳ ý tưởng nào về hành vi này hoặc có thể giải thích rõ hơn về hành vi này?

+1

Bản sao của http://stackoverflow.com/questions/2679250/setresult-does-not-work-when-back-button-pressed – pjv

Trả lời

0

Tôi nghĩ rằng vấn đề ở đây có thể là onPaused có thể được gọi sau khi bạn đã quay trở lại hoạt động trước đó. Tôi thấy hành vi tương tự trong các thử nghiệm khác. Hãy thử thêm một số bản in Log.d để xác nhận thứ tự của cuộc gọi onPause so với cuộc gọi onActivityResult.

+0

Tôi đã kiểm tra điều đó, cũng là luồng hoạt động được tổ chức, vì vậy không phải trường hợp http://developer.android.com/guide/topics/fundamentals/activities.html#CoordinatingActivities – Shubhayu

4

Bạn nên xem tham chiếu onActivityResult. http://developer.android.com/reference/android/app/Activity.html#onActivityResult%28int,%20int,%20android.content.Intent%29

Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation. 

You will receive this call immediately before onResume() when your activity is re-starting. 

Gọi setResult trong finish(). Bên cạnh onPause() có thể được gọi khi hoạt động mới bắt đầu từ BBB.

+0

Tôi đã có tùy chọn đặt kết quả bằng cách ghi đè kết thúc() hoặc onBackPressed(). Theo như 3 tùy chọn mà nó có thể được RESULT_CANCELLED, nó chắc chắn không phải là tùy chọn sụp đổ. Nó có thể là lựa chọn thứ hai. Không biết cách kiểm tra điều đó. Không chắc chắn nếu một số chức năng khác đặt mã kết quả sau khi tôi đặt nó một cách rõ ràng trong onPause(). Tôi cũng đã thử gọi kết thúc() trong onPause(). – Shubhayu

+0

Tại sao bạn gọi kết thúc() trong onPause(). onPause() được gọi khi nó chuyển sang nền. Nếu bạn nhấn nút home từ BBB thì onPause() sẽ được gọi. Và khi onBackpressed() gọi là finish() cũng được gọi.Đó là lý do tại sao setResult() trong công việc onBackpressed(). Tại sao bạn không đặt kết quả trong hai phương pháp? – Shaiful

+0

Tôi đã thử nhiều thứ khác nhau để tìm ra dòng chảy và điều gì đã gây ra hành vi. Tôi đồng ý rằng onPause() sẽ được gọi khi nút Home được nhấp, nhưng vẫn không trả lời được câu hỏi của tôi tại sao kết quả tôi đặt rõ ràng trong onPause() không được truyền sang AAA khi tôi nhấp vào nút quay lại. – Shubhayu

0

Rất có thể trường hợp phải là phương pháp vòng đời.

Khi bạn bấm phím trở lại trong BBB acctivty đầu tiên onPause() được gọi để bạn đặt thứ gì đó trong onPause() sau đó phương pháp này được theo sau bởi onStop() và tiếp tục theo sau bởi OnDestroy() vì hoạt động đang được hoàn tất. Vì vậy, bây giờ nếu bạn đặt một cái gì đó trong onPause() nó đang được thiết lập nhưng vì nó được theo sau bởi onDestroy() hệ điều hành có thể buộc phải hủy bỏ nhiệm vụ của bạn khi hoạt động này kết thúc.

Ngoài ra nếu bạn đặt thứ gì đó trong onPause() thì nếu ứng dụng của bạn mất tập trung hoặc được giảm thiểu cũng onPause() được gọi là mức độ ổn định của ứng dụng có thể bị mất. Vì vậy, đề nghị không sử dụng onPause(), tốt hơn để đi với một trong hai onKeyUp() hoặc onBackPressed().

+0

Thực ra điều đó không phải là vấn đề bởi vì theo Dev Documents, luồng được đặt là http://developer.android.com/guide/topics/fundamentals/activities.html#CoordinatingActivities – Shubhayu