2011-06-24 44 views
82

Ai đó có thể cho tôi biết cái nào được gọi trước, có phải là onActivityResult() hoặc là onResume()? Ví dụ:onActivityResult() & onResume()

Hoạt động A gọi startActivityForResult() để bắt đầu Hoạt động B. B thực hiện, hoàn thành và trả về kết quả là A, nhưng mà phương pháp của A được gọi là đầu tiên, onActivityResult() hoặc onResume()?

Tôi biết ai đó đã trả lời câu hỏi này bằng cách tham khảo Activity Docs, tuy nhiên tôi không thể tự tìm thấy trong đó.

Trả lời

106

Gọi điện thoại lần đầu onActivityResult() rồi onResume().

Trích dẫn từ tài liệu:

protected void onActivityResult (int requestCode, int resultCode, Ý định dữ liệu)

Từ: API Level 1 Được gọi khi một hoạt động bạn đưa ra lối thoát hiểm, cho bạn mã requestCode bạn đã bắt đầu nó với, resultCode nó trả lại và mọi dữ liệu bổ sung từ nó. Mã kết quả sẽ được RESULT_CANCELED nếu hoạt động trả lại một cách rõ ràng rằng, không trả về bất kỳ kết quả nào hoặc bị rơi trong khi hoạt động. Bạn sẽ nhận được cuộc gọi này ngay trước onResume() khi hoạt động của bạn là bắt đầu lại.

+1

Hiện tại, mã của tôi có vẻ đang gọi onActivityResult ngay lập tức trước * onRestart *: -/ –

+1

Các sơ đồ này có thể hữu ích để hiểu toàn bộ vòng đời của Hoạt động và Phân đoạn: https: // github.com/xxv/android-lifecycle – Sergii

10

onActivityResult() được gọi đầu tiên (chỉ cần xác nhận điều này với một vài báo cáo đăng nhập và thấy rằng onActivityResult() thực sự là gọi trước khi onResume())

+2

Các thử nghiệm của tôi cũng xác nhận. onResume() được gọi là SAU onActivityResult(). –

34

Như những người khác đã được đăng, onActivityResult() được gọi trước khi onResume() khi bạn hoạt động đang được khởi động lại. Diane Hackborn giải thích rằng onActivityResult() được gọi trước onResume() để cho phép bất cứ điều gì có thể ảnh hưởng đến giao diện người dùng được nhận và có sẵn trước khi cập nhật giao diện người dùng (có lẽ là để tránh cập nhật kép - một lần trong onResume () mà không có kết quả trả về, và sau đó trong onActivityResult(), thêm kết quả trả về).

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/3epIML7fjGw

Một hệ quả của việc này là bất kỳ khởi tạo bạn có thể đã quyết định thực hiện chỉ trong vòng onResume() (ví dụ, khởi tạo dữ liệu từ một nguồn bên ngoài mà bạn cần phải tươi) hơn là trong onCreate (), sẽ được uninitialized khi một cuộc gọi đến onActivityResult() xảy ra như là một phần của khởi động lại một ứng dụng đã được flushed ra khỏi bộ nhớ của hệ điều hành (vì onResume() sẽ không có được gọi là trước onActivityResult()).

Trong trường hợp này, onActivityResult() sẽ phải được chuẩn bị để thực hiện các khởi tạo như vậy cho bất kỳ biến nào như vậy là được sử dụng bởi onActivityResult().Tất nhiên, nếu các khởi tạo cần thiết bởi onActivityResult() có thể được thực hiện trong onCreate() thay vì onResume(), thì onCreate() sẽ được gọi khởi động lại trước cả onActivityResult() và onResume(), đó sẽ là cách dễ nhất để tìm những thứ bạn không cần phải làm mỗi khi ứng dụng được tiếp tục. Tuy nhiên, nếu dữ liệu bạn đang khởi tạo xuất phát từ nguồn bên ngoài và bạn cần nó mới, bạn có thể muốn khởi tạo dữ liệu đó trong cả onCreate() và onResume(), với onResume() kiểm tra cờ được đặt trong onCreate() để xem liệu dữ liệu vừa được khởi tạo trong onCreate) chưa, và sau đó cập nhật nó trong onResume() chỉ khi chúng chưa được. Bằng cách đó, một số cổ điển của nó sẽ luôn luôn có sẵn (ít nhất là lần trước khi ứng dụng được tiếp tục). Một cách khác để giải quyết vấn đề này là lưu trữ thông tin được trả về bởi onActivityResult() trong các biến sẽ được onResume() và xử lý ở đó (sau khi bất kỳ yêu cầu khởi tạo nào được thực hiện bởi onResume()), thay vì thực hiện xử lý bên trong phần thân của onActivityResult().

Đây là một tính năng được viết rất chặt chẽ, không có lời giải thích hoặc cảnh báo nào được cung cấp (trong tài liệu chính thức) về hậu quả của quá trình sắp xếp không mong muốn này. Nó cũng rất dễ bỏ lỡ vấn đề trong quá trình thử nghiệm, bởi vì trên một thiết bị có nhiều bộ nhớ không chạy nhiều ứng dụng, hoạt động gọi là startActivityForResult() (hoặc các biến thể của nó) có thể không bao giờ bị xóa khỏi bộ nhớ trong khi chờ đợi bắt đầu hoạt động để trả về kết quả thông qua onActivityResult(), và do đó tất cả các khởi tạo được thực hiện bởi onResume() sẽ sẵn sàng, và do đó vấn đề có thể không được phát hiện.

Có một khám phá thông tin về một số vấn đề xung quanh giải trình tự này (bao gồm cảnh báo liên quan đến nỗ lực sử dụng đối tượng ứng dụng của ứng dụng để bảo vệ biến từ các hiệu ứng của nó), hoàn thành với sơ đồ trình tự UML vẽ tay, tại đây:

http://steveliles.github.com/android_activity_lifecycle_gotcha.html

-1

một hệ quả của việc này là bất kỳ khởi tạo bạn có thể đã quyết định thực hiện chỉ trong vòng onResume() (ví dụ, khởi tạo dữ liệu từ một nguồn bên ngoài mà bạn cần phải tươi) hơn là trong onCreate(), sẽ được uninitialized khi một cuộc gọi đến onActivityResult() xảy ra như là một phần của khởi động lại một ứng dụng mà h do hệ điều hành đã xả hết bộ nhớ (vì onResume() sẽ không được gọi trước onActivityResult()).

Trong trường hợp này, onActivityResult() sẽ phải được chuẩn bị để thực hiện các khởi tạo như vậy cho bất kỳ biến nào được sử dụng bởi onActivityResult().

Tất nhiên, nếu khởi tạo cần thiết bởi onActivityResult() có thể được thực hiện trong onCreate() hơn là trong onResume(), sau đó kể từ onCreate() sẽ được kêu gọi khởi động lại trước khi cả hai onActivityResult()onResume(), đó sẽ là cách dễ nhất để đi cho những thứ mà bạn không cần phải làm mỗi khi ứng dụng được tiếp tục. Tuy nhiên, nếu dữ liệu bạn đang khởi tạo đến từ nguồn bên ngoài và bạn cần dữ liệu đó mới, bạn có thể muốn khởi tạo dữ liệu đó trong cả hai số onCreate()onResume(), với onResume() kiểm tra cờ được đặt trong onCreate() để xem dữ liệu có chỉ được khởi tạo trong onCreate(), và sau đó cập nhật nó trong onResume() chỉ khi chúng chưa được. Bằng cách đó, một số cổ điển của nó sẽ luôn luôn có sẵn (ít nhất là lần trước khi ứng dụng được tiếp tục).

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