vòng đời onNewIntent () và người nghe đã đăng ký


150

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 thông qua onNewIntent().

Những gì tôi nhận thấy là onPause()được gọi trước onNewIntent(), và sau đó nó gọi onResume(). Trực quan:

  • hộp thoại tìm kiếm được bắt đầu
  • mục đích tìm kiếm bị sa thải vào hoạt động
  • onPause()
  • onNewIntent()
  • onResume()

Vấn đề là tôi có những người nghe đã đăng ký onResume()được gỡ bỏ onPause(), nhưng họ cần bên trong onNewIntent()cuộc gọi. Có một cách tiêu chuẩn để làm cho những người nghe có sẵn?

Câu trả lời:


294

onNewIntent()có nghĩa là điểm vào cho các hoạt động của 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 hoạt động, do đó cần phải 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 bên trong onNewIntent(). Ví dụ, hầu hết thời gian onNewIntent()các phương thức của tôi chỉ đơn giản là 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ả logic thiết lập xảy ra onResume()bằng cách sử dụng getIntent().


@Rodja bạn sẽ vui lòng nhận xét về stackoverflow.com/questions/19092631/ này cũng được
Nhà phát triển

3
Liên quan đến câu hỏi ban đầu: hãy lưu ý nếu bạn di chuyển mã để xử lý việc tìm kiếm Intentvào onResume(), hoạt động của bạn có thể sẽ cố gắng thực hiện một mỗi lần nó lại tiếp tục tìm kiếm, có lẽ không phải là hành vi mà bạn muốn.
Tony Chan

1
Rodja nói: Từ quan điểm vòng đời 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ó thông qua để tiếp tục (). Không CẦN cho android gọi onPause () sau đó gọi lại onResume (). Nếu ứng dụng được nối lại, os có thể chỉ cần gọi vào NewIntent () và ở trạng thái tiếp tục.
Sani Elfishawy

Rodja nói: Từ quan điểm vòng đời hoạt động, do đó, cần phải gọi onPause () trước khi onNewIntent () Android KHÔNG CẦN thiết kế như vậy. Hoạt động của bạn đã trải qua vòng đời để tiếp tục. Nếu hành động được nối lại, họ có thể chỉ cần gọi vào NewIntent () và ở lại tiếp tục. Vấn đề với trình tự của Android là nó khiến cho không thể phân biệt giữa onPause do hành động của người dùng so với onPause do mục đích nền. Nếu bạn muốn hành động onPause chỉ trong trường hợp hành động của người dùng, bạn sẽ bị lừa bởi vì bạn sẽ không biết cho đến tương lai tại sao bạn lại đi onPause ().
Sani Elfishawy

Điểm quan trọng cần lưu ý là getIntent () vẫn trả về Ý định ban đầu. Bạn có thể sử dụng setIntent (Intent) để cập nhật lên Intent mới.
linuxjava

15

Lưu ý: Gọi một phương pháp vòng đời từ một phương pháp khác không phải là một thực hành tốt. Trong ví dụ dưới đây, tôi đã cố gắng để đạt được rằng onNewIntent của bạn sẽ luôn được gọi là không phân biệt loại Hoạt động của bạn.

OnNewIntent () luôn được gọi cho các hoạt động SingleTop / Nhiệm vụ trừ lần đầu tiên khi hoạt động được tạo. Vào thời điểm đó, onCreate được gọi là cung cấp giải pháp cho một vài truy vấn được hỏi về chủ đề này.

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

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

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

59
Nói chung không phải là một ý tưởng tốt để được 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ố triển khai cơ sở của onNewIntent () giả định rằng onPause () đã được gọi? Có lẽ an toàn hơn để đóng gói mã ứng dụng theo phương thức có thể gọi được từ cả hai nơi.
BernalKC

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

3
Vâng .. tôi cũng đồng ý về việc tránh điều này ... điều này cũng dành cho những người muốn gọi onIntent từ onCreate.
Pawan Maheshwari
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.