2010-09-06 15 views
18

Tôi cố gắng để hiểu được những khác biệt chính giữa đăng ký một BroadcastReceiver trong Manifest và đăng ký nó lập trình ...khác biệt chính giữa Manifest và đăng ký theo chương trình của BroadcastReceiver

hiểu biết của tôi về cơ bản là như sau (sẽ đánh giá cao một người nào đó sửa chữa của tôi nếu tôi thiếu cái gì đó).

  • đăng ký tại Manifest:

    1. Hệ điều hành sẽ kỳ diệu tìm và nhanh chóng lớp học của bạn nếu cần thiết, gọi phương thức onReceive(), bất kể những gì các trạng thái hoạt động của ứng dụng của bạn là
    2. bạn nhận được sẽ chỉ được gọi một lần cho mỗi lần phát sóng (tức là bạn có thể xem xét việc đăng ký trong tệp kê khai giống như đăng ký 'lớp' của bạn để nhận chương trình phát sóng - và phát sóng ngay lập tức cho lớp của bạn nếu cần) (??)
  • đăng ký lập trình:

    1. đăng ký trong mã có nghĩa là bạn đang đăng ký thể hiện của lớp của bạn để nhận tin nhắn quảng bá (ví dụ: nếu mã của bạn hơi cẩu thả và bạn quản lý đăng ký nhiều lần, bạn sẽ kết thúc với nhiều phiên bản BroadcastReceiver tất cả đều có onReceive() được gọi cho một số phát sóng
    2. để hủy đăng ký, bạn cần hủy đăng ký phiên bản BroadcastReceiver cụ thể mà bạn trước đây đã đăng ký
    3. nếu ứng dụng của bạn bị phá hủy bởi hệ điều hành, phương pháp onReceive của bạn() sẽ không được gọi cho một phát sóng

nhờ

Trả lời

18

bạn có nó về cơ bản chính xác.

Lưu ý rằng đối tượng người nhận đã đăng ký kê khai chỉ được sử dụng một lần. Một phiên bản mới của BroadcastReceiver của bạn được tạo cho mỗi lần phát sóng. Việc sử dụng chính các bộ thu đã đăng ký được hiển thị là dành cho các chương trình phát sóng có thể tiếp tục khi mã của bạn không có trong bộ nhớ (ví dụ: BOOT_COMPLETED, báo thức được lập lịch của bạn qua AlarmManager).

+0

Và tôi đoán rằng nếu dịch vụ của bạn gặp sự cố khi người phát hiện quảng cáo của bạn được khai báo trong tệp kê khai, người nhận sẽ vẫn nhận được tin nhắn ... – Boy

+0

@Boy: Vâng, phải vậy. – CommonsWare

+0

xin vui lòng bạn có thể tra cứu nếu có liên quan đến vấn đề của tôi: http://stackoverflow.com/questions/29728000/wifi-changed-status-affecting-my-app –

0

Sự hiểu biết của bạn là chính xác theo tôi.

Sự khác biệt có liên quan (và tối nghĩa) là một số ý định hệ thống cụ thể sẽ chỉ kích hoạt người nhận của bạn nếu đó là được lập trình đã đăng ký. Người nhận chỉ được xác định trong biểu hiện sẽ không được gọi. Ví dụ như: ACTION_SCREEN_ON, ACTION_SCREEN_OFF, ACTION_BATTERY_CHANGED, ACTION_HEADSET_PLUG

tôi khuyên bạn nên text này đề cập đến chi tiết khác nhau về Intents và Thiết Bị Thu.

+0

Vâng tôi đã quản lý đăng ký người nhận cho ACTION_SCREEN_ON qua tệp kê khai và nó hoạt động – jonney

4

Khi sử dụng phương pháp nào để đăng ký

Những phương pháp để sử dụng cho việc đăng ký BroadcastReceiver của bạn phụ thuộc vào những gì ứng dụng của bạn không có các sự kiện hệ thống.Tôi nghĩ rằng về cơ bản có hai lý do tại sao ứng dụng của bạn muốn biết về các sự kiện toàn hệ thống:

  1. Ứng dụng của bạn cung cấp một số loại dịch vụ xung quanh những sự kiện

  2. ứng dụng của bạn muốn phản ứng ân cần để thay đổi trạng thái

Ví dụ cho loại đầu tiên là ứng dụng cần phải hoạt động ngay khi thiết bị khởi động hoặc phải bắt đầu một số loại công việc bất cứ khi nào ứng dụng được cài đặt. Battery Widget Pro hoặc App2SD là các ví dụ hay cho các loại ứng dụng này. Đối với loại này, bạn phải đăng ký BroadcastReceiver trong tệp kê khai.

Ví dụ cho danh mục thứ hai là các sự kiện báo hiệu sự thay đổi đối với các trường hợp mà ứng dụng của bạn có thể dựa vào. Giả sử ứng dụng của bạn phụ thuộc vào kết nối Bluetooth được thiết lập. Bạn phải phản ứng với thay đổi trạng thái - nhưng chỉ khi ứng dụng của bạn hoạt động. Trong trường hợp này, không cần phải có bộ thu phát sóng đã đăng ký tĩnh. Một đăng ký động sẽ hợp lý hơn.

Ngoài ra còn có một số sự kiện mà bạn thậm chí không được phép đăng ký tĩnh. Một ví dụ cho sự kiện này là sự kiện Intent.ACTION_TIME_TICK được phát mỗi phút. Đó là một quyết định khôn ngoan bởi vì một máy thu tĩnh sẽ không cần thiết tiêu hao pin.