2011-12-23 6 views
113

Tôi đang sử dụng một Hoạt động đơn lẻ để nhận ý định từ hộp thoại tìm kiếm qua onNewIntent().onNewIntent() vòng đời và người nghe đã đăng ký

Điều tôi nhận thấy là onPause() được gọi trước onNewIntent() và sau đó gọi số onResume(). Nhìn bề ngoài:

  • hộp thoại tìm kiếm bắt đầu
  • tìm kiếm ý định sa thải để hoạt động
  • onPause()
  • onNewIntent()
  • onResume()

Vấn đề là tôi có nghe đăng ký tại onResume() mà có được loại bỏ trong số onPause(), nhưng chúng là n eeded bên trong của cuộc gọi onNewIntent(). Có cách nào tiêu chuẩn để làm cho những người nghe đó có sẵn không?

Trả lời

213

onNewIntent() có nghĩa là điểm nhập cho các hoạt động SingleTop đã chạy ở một nơi khác trong ngăn xếp và do đó không thể gọi onCreate(). Từ quan điểm vòng đời của hoạt động, do đó cần gọi onPause() trước onNewIntent(). Tôi đề nghị bạn viết lại hoạt động của mình để không sử dụng những người nghe này bên trong số onNewIntent(). Ví dụ hầu hết thời gian onNewIntent() phương pháp của tôi chỉ đơn giản là trông như thế này:

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    // getIntent() should always return the most recent 
    setIntent(intent); 
} 

Với tất cả các logic thiết lập xảy ra trong onResume() bằng cách sử dụng getIntent().

+0

@Rodja bạn sẽ vui lòng bình luận về vấn đề này http://stackoverflow.com/questions/19092631/logout-from-the-application- android/19092683? noredirect = 1 # 19092683 cũng – Developer

+0

Liên quan đến câu hỏi ban đầu: hãy nhớ nếu bạn di chuyển mã để xử lý tìm kiếm 'Intent' vào' onResume() ', Activity của bạn có thể sẽ cố gắng thực hiện tìm kiếm mỗi khi nó hồ sơ, có lẽ không phải là hành vi bạn muốn. –

+0

Rodja nói: Từ quan điểm vòng đời của hoạt động, do đó cần phải gọi onPause() trước khi onNewIntent() Android không CẦN thiết kế theo cách này. Hoạt động của bạn đã trải qua vòng đời của nó để tiếp tục(). KHÔNG CẦN cho android để gọi onPause() sau đó gọi onResume() một lần nữa. Nếu ứng dụng được tiếp tục, hệ điều hành có thể chỉ cần gọi onNewIntent() và ở trạng thái tiếp tục lại. –

13

OnNewIntent() luôn được gọi cho các hoạt động SingleTop/Task ngoại trừ lần đầu tiên khi hoạt động được tạo. Vào lúc đó, onCreate được gọi.

Bạn có thể gọi onNewIntent luôn bằng cách đặt nó vào phương pháp onCreate như

@Override 
public void onCreate(Bundle savedState) 
{ 
    super.onCreate(savedState); 
    onNewIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) 
{ 
    super.onNewIntent(intent); 
    //code 
} 
+43

Nói chung không phải là một ý tưởng tốt để gọi trực tiếp các phương pháp vòng đời, phải không? Có thể vô hại, hoặc có thể một số cơ sở thực hiện onNewIntent() giả định rằng onPause() đã được gọi? Có lẽ an toàn hơn để đóng gói mã ứng dụng trong một phương thức có thể gọi từ cả hai nơi. – BernalKC

+10

Đồng ý. Chúng tôi chạy vào một vài trường hợp cạnh bằng cách sử dụng phương pháp này. Tránh tốt nhất. –

+2

Vâng .. tôi cũng đồng ý tránh điều này ... điều này là dành cho những ai muốn gọi onNewIntent từ onCreate. –