2011-10-13 18 views
22

Trong khi gặp sự cố tương tự như this question, tôi bắt đầu tự hỏi tại sao chúng tôi phải gọi setIntent khi ghi đè onNewIntent và lý do mã này không được thực hiện bởi super.onNewIntent.Có lý do gì để không gọi setIntent khi ghi đè lênNewIntent không?

@Override 
public void onNewIntent(Intent intent) 
{ 
    super.onNewIntent(intent); 

    // Why isn't this performed by the framework in the line above? 
    setIntent(intent); 
} 

Trả lời

31

Intent đối tượng được liên tục gắn liền với Activity, Service và các thành phần khác miễn là các thành phần đó đang chạy. Chúng không đơn giản biến mất vì bạn đã chuyển sang một ứng dụng khác. Lý do là vì Android có thể giết quá trình này bất cứ lúc nào, nhưng người dùng vẫn có thể muốn quay lại và tiếp tục những gì họ đang làm. Điều này làm cho Intents lý tưởng để lưu trữ hoặc truyền các bit thông tin nhỏ (và đôi khi lớn) thông qua phần Extras.

Phương pháp onNewIntent() là đặc biệt để xử lý các thành phần ứng dụng bền bỉ hơn và do đó có thể được gọi nhiều lần trong vòng đời của nó nhưng cần theo dõi lý do tại sao nó được gọi (và do đó dữ liệu được gọi) . Cho dù bạn gọi setIntent() hay không phụ thuộc vào những gì bạn cần làm.

Nếu bạn không quan tâm lý do tại sao nó được gọi sau đó, bạn có thể giữ nguyên bản gốc Intent bằng cách không gọi setIntent(). Điều này đặc biệt hữu ích khi Activity của bạn (hoặc một số thành phần khác) thực hiện điều tương tự bất kể ai đã gọi nó và dữ liệu nào nó cung cấp.

Nếu bạn có nhu cầu trả lời từng sự kiện riêng lẻ, thì bạn phải ít nhất lưu trữ thông tin mới của Intent. Điều này có nghĩa là bạn có thể tránh setIntent(), tuy nhiên, không có thành phần nào liên kết với nó sẽ có bất kỳ thông tin nào trong số Intent trừ khi bạn gửi trực tiếp cho họ. Đây có thể là hành vi mong muốn đối với một ứng dụng không thể đảm bảo được Intent gốc đã được xử lý hoàn toàn.

Nếu bạn cần trả lời từng mục đích riêng lẻ và Intent gốc không quan trọng, thì bạn sử dụng setIntent(). Điều này loại bỏ bản gốc Intent, vẫn còn trong đó ... và đặt Intent mới để nếu người dùng di chuyển đi (một lần nữa), họ sẽ quay lại cùng một vị trí.

Lý do tại sao super.onNewIntent() không xử lý điều này là do các lớp thành phần cốt lõi không thể xác định có hay không Intent mới quan trọng hơn cũ. Tất cả những gì bạn quan tâm là nó an Intent, không phải là gì. Đây là lý do tại sao chúng tôi ghi đè lên các phương pháp như vậy, để chúng tôi xác định những gì là quan trọng và những gì không. Cảm giác chung là các lớp cơ sở như Activity có thể sử dụng bất kỳ dữ liệu nào chúng ta có, theo bất cứ cách nào nó muốn (trừ khi chúng ta ghi đè và nói cách khác). Tuy nhiên, họ không nên (và thường không thể) loại bỏ dữ liệu của chúng tôi trừ khi chúng tôi nói cụ thể với họ. Đây là một đối số bạn thực sự không muốn có với một số lập trình viên. hehe

Hy vọng điều này sẽ hữu ích.

+0

Tôi thực sự đánh giá cao câu trả lời này. Mục đích là rất rõ ràng với tôi bây giờ. Chúc mừng! – w3bshark

2

Các tài liệu cho nhà nước onNewIntent: "Lưu ý rằng getIntent() vẫn trả về Ý định ban đầu Bạn có thể sử dụng setIntent (Ý định) để cập nhật nó để Ý định mới này.". Tôi đoán là onNewIntent tồn tại để hoạt động của bạn có thể được thông báo và siêu có thể không làm gì cả.

1

Tôi vừa xóa mã setIntent(intent) khỏi triển khai onNewIntent(Intent intent) của mình.

Lý do: My MainActivity là một đầu. Trong khi ứng dụng của tôi chạy nó khởi chạy các hoạt động khác như hoạt động của máy ảnh. Khi ứng dụng quay trở lại MainActivity, trong onResume() ý định (cuối cùng) được trả về bởi getIntent() sẽ được xử lý lại ngay cả khi nó đã được xử lý trước đó.

Triển khai mới của tôi (hoạt động cho đến thời điểm này): Lưu ý định từ onNewIntent(Intent intent) trong trường cá thể riêng. Trong onResume, hãy kiểm tra trường này để không rỗng và đặt lại nó ngay lập tức thành rỗng, xử lý ý định một lần và chỉ một lần.

Xem thêm https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY

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