2011-10-05 33 views
7

Tôi cần đăng ký người nhận. Tôi đã sử dụng các mô hình sau:Mẫu đúng để đăng ký người nhận?

@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(myReceiver, new IntentFilter(...)); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(myReceiver); 
} 

private BroadcastReceiver myReceiver = new BroadcastReceiver() { 
    ... 
}); 

tôi nhận được báo cáo sự cố từ thị trường về unregisterReceiver của tôi() gọi:

java.lang.IllegalArgumentException: Receiver not registered 

Tôi nghĩ đây không phải có thể là có thể, nhưng có vẻ như đây là đúng mẫu thay thế:

private Intent mIntent; 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (mIntent == null) { 
     mIntent = registerReceiver(myReceiver, new IntentFilter(...)); 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if (mIntent != null) { 
     unregisterReceiver(myReceiver); 
     mIntent = null; 
    } 
} 

private BroadcastReceiver myReceiver = new BroadcastReceiver() { 
    ... 
}); 

Mẫu trên có đúng không? Tôi đoán nó có thể đăng ký thất bại, và chúng tôi phải giữ kết quả từ registerReceiver(), và kiểm tra nó trong onPause() trước khi thực hiện cuộc gọi để unregister()?

Cảm ơn


Tôi dựa sự thay đổi tắt của câu hỏi này: Problem with BroadcastReceiver (Receiver not registered error)

Tôi đã chỉ từng nhìn thấy mô hình đầu tiên ở trên, không bao giờ một trong những nơi bạn đánh dấu vào câu trả lời ý - bất kỳ làm rõ sẽ rất tuyệt.

Trả lời

5

Mẫu trên có đúng không?

Không, điều này không nhất thiết phải hoạt động. Từ các tài liệu cho registerReceiver(...) ...

Returns Mục đích dính đầu tiên phát hiện ra rằng khớp với bộ lọc, hoặc null nếu có ai sánh kịp.

Nói cách khác ngay cả khi cuộc gọi để đăng ký người nhận thành công, nó vẫn có thể trả về giá trị rỗng nếu không có chương trình phát sóng dính cho bộ lọc mục đích đó.

Tiếp cận của tôi sẽ chỉ cần sử dụng một boolean và một khối try/catch ...

private boolean isReceiverRegistered; 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (!isReceiverRegistered) { 
     registerReceiver(myReceiver, new IntentFilter(...)); 
     isReceiverRegistered = true; 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if (isReceiverRegistered) { 
     try { 
      unregisterReceiver(myReceiver); 
     } catch (IllegalArgumentException e) { 
      // Do nothing 
     } 
     isReceiverRegistered = false; 
    } 
} 
+0

nhờ Ok cho điều này, có ý nghĩa. – user291701

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