Bài 5: Broadcast Receiver trong android

Có bao giờ bạn tự hỏi trong Android đã sử dụng cơ chế gì để lắng nghe tất cả những sự thay đổi, những sự kiện của hệ thông không? Của hệ thống có nghĩa là của hệ điều hành mà không liên quan gì đến ứng dụng ấy nhé các bạn.

Bạn có biết tại sao khi các bạn vừa bật 3G hoặc Internet lên thì facebook nó bắt đầu gửi một đống thông báo xuống chỗ notifycation không? Chính xác là nó dùng Broadcast Receiver để làm đó các bạn.

Đó là lý do chúng ta sẽ đi học bài hôm nay trong series lập trình android nâng cao này, bài này khá là hay đó các bạn nên mọi người hãy nhớ là  thực hành nhé.

Chúng ta sẽ đi trả lời 4 câu hỏi : What? Why? When? How? nữa nhé.

Broadcast Recieiver là gì?

Là một trong 4 component lớn trong Android, với mục đích là lắng nghe các sự kiện, trang thái của hệ thông phát ra thông qua Intent nhờ đó mà các lập trình viên có thể xử lí được các sự kiện hệ thống ở bên trong ứng dụng của mình.

Broadcast Receiver có thể hoạt động được cả khi ứng dụng bị tắt đi, nghĩa là ở background chính vì vậy nó thường được sử dụng với service và chúng ta sẽ đi tìm hiểu ở bài sau nhé.

Tại sao lại sử dụng Broadcast Receiver

Nó có rất nhiều công dụng chính vì thể tuỳ thuộc và yêu cầu bài toán đưa ra là gì chúng ta sẽ sử dụng cho nó phù hợp nhưng điểm nỗi bật của Broadcast Receiver đó là có thể chạy ở background ngay khi ứng dụng đã tắt đi.

Khi nào thì sử dụng Broadcast Receiver

Đó là ứng dụng cần xử lí một công việc nào đó mà phải phuộc thuộc vào hệ thống, chỉ khi hệ thông phát ra một sự kiện, hành động nào đó thì công việc này mới được thực hiện.Những trường hợp được ứng dụng nhiều nhất khi sử dụng Broadcast Receiver đó là : lắng nghe sự kiện thay đổi mạng, lắng nghe sự kiện pin yếu, lăng nghe tin nhắn, cuộc gọi đến…

Một công dụng tuyệt vời nữa đó là dùng để start Service của ứng dụng trong Broadcast Receiver.

Cách sử dụng Broadcast Receiver

Để đăng ký một sự kiện lắng nghe với Broadcast Receiver thì chúng ta sẽ có 2 cách phổ biến nhất hiện nay, đó là:

  • Đăng ký trong AndroidManifest.xml (Tĩnh)
  • Đăng ký bằng Java code (Động)

Dù là cách nào thì việc xử lí chúng cũng tương tự nhau, tuy nhiên thông thường sẽ 1 cách được sử dụng nhiều hơn đó chính là cách đầu tiên, sử dụng trong AndroidMainifest, tại vì khi các bạn thiết lập trong đây thì ứng dụng không cần khởi chạy mà vẫn có thể lắng nghe được các sự kiện và khởi chạy.

Nói chung cũng tuỳ thuộc vào yêu cầu bài toán đưa ra chúng ta sẽ có cách dùng thích hợp tuy nhiên khi làm dự án thì mình thấy Broadcast ít khi được sử dụng và nếu sử dụng thì sẽ dùng bằng Jave code.

Cách 1: Đăng ký trong AndroidManifest.xml

Là cách chúng ta khai báo Broadcast Receiver trong Manifest và khi lần đầu khởi chạy ứng dụng thì nó sẽ đăng ký Broadcast và cứ thế nó start cho đến khi các bạn XOÁ ứng dụng đi.Nó vẫn lắng nghe khi các bạn đã tắt ứng dụng đi luôn nhé đây là ưu điểm của cách đăng ký này.

Chúng ta sẽ đi tạo 1 class và extends từ BroadcastReceiver để xử lý các sự kiện.Mình sẽ mô tả một quá trình như sau:

Bây giờ chúng ta sẽ ta sẽ lắng một sự kiện khi thay đổi mạng Internet đó là khi các bạn bật tắt dữ liệu (ở đây có thể là 3G, Wifi) thì nó sẽ thông báo lên một câu như ” Network is turned ON/OFF”.

Ok, dưới đây là toàn bộ quá trình khai báo và xử lý.

Khai báo trong AndroidManifest.xml


Ở trên bạn để ý ở 2 dòng code mình thêm vào đó là:


Vì bạn muốn ứng dụng lắng nghe xem có trạng thái thay đổi mạng nào xảy ra không nên bạn cần phải xin cấp quyền xem trạng thái mạng chứ không thì xảy ra lỗi ngay.Tuy nhiên vì chúng ta chỉ cần lắng nghe sự kiên thay đổi mạng thôi nên dòng permission trên các bạn không cần khai báo cũng được nhé, mình thêm vào nhưng trong ví dụ nào chúng ta chưa xử lí gì liên quan đến quyền đó cả.

Đăng ký một Broadcast để lắng nghe sự kiện thay đổi mạng : NetworkChangeReceiver


Ở đây bạn thấy trong inter-filter nó đang có 2 sự kiện lắng nghe đó là ” android.net.conn.CONNECTIVITY_CHANGE ” .Đây tưng ứng là sự kiện lắng nghe bật tắt dữ liệu mạng và Wifi.Nếu không có action này thì bạn không nhận được bât kì thông báo gì khi có thay đổi đâu nhé.

Còn NetworkChangeReceiver chính là tên của class bạn sẽ khởi tạo để nhận thông báo đã đăng ký action lắng nghe ở trên.Tí nữa bạn sẽ tạo một Class tên là NetworkChangeReceiver.java để nhận kết quả trả về khi có sự kiện thay đổi mạng.

Tiếp theo, tạo class NetworkChangeReceiver.java để nhận kết quả.

Đương nhiên khi bạn lắng nghe một sự thay đổi nào đó bằng Broadcast thì đương nhiên nó phải trả kết quả về đâu đó chứ đúng không nào? ở đây nó sẽ trả về class mà bạn đã khai báo trong AndroidManifest.xml, như sau:

Tạo class nhận kết quả lắng nghe của broadcast

NetworkChangeReceiver.java


Bạn khởi tạo một class với tên đã khai báo trong AndroidManifest.xml và sau đó extends class BroadcastReceiver, kết quả lắng nghe được sẽ được trả về phương thức onReceiver().

Có nghĩa là cứ có sự thay đổi mạng thì nó sẽ chui vào hàm onReceiver() này, vì vậy bạn sẽ xử lí ở đây nếu bạn cần.Ở đây mình thông báo lên bằng Toast thôi chứ không làm gì cả.

Vậy là xong cách khai báo BroadcastReceiver tĩnh nhé, bây giờ chúng ta sẽ qua cách 2.

Cách 2: Đăng ký bằng Java code

Đây là cách chúng ta sẽ làm nhiều nhất trong các dự án đó các bạn bởi vì sao? Sẽ có các trường hợp chúng ta sẽ đi lắng nghe các sự kiện cửa hệ thông trong phạm vi khi ứng dụng chúng ta chạy thôi và khi ứng dụng kết thúc thì ta cũng dừng quá trình đó luôn.

Giả dụ hành động lắng nghe mạng ở cách 1 mình đã ví dụ thi chẳng app nào lại đi lăng nghe như vậy trong AndroidManifest bởi vì chúng ta chỉ cần lắng nghe khi ứng dụng đang chạy chứ không phải cả khi ứng dụng đã bị tắt.Và cách này bạn sẽ chẳng cần phải khai báo Broadcast trong AndroidManifest nữa nhé.

Đây là một ví dụ kinh điển của ứng dụng về broadcast receiver nè các bạn:

Lắng nghe sự kiện mất mạng bằng Broadcast Receiver

Lắng nghe sự kiện mất mạng bằng Broadcast Receiver

Bây giờ mình sẽ đi vào lăng nghe sự kiện thay đổi Network của thiết bị bằng cách 2 này nhé.

Khởi tại class Broadcast lắng nghe


Class trên tương tự như cách 1  luôn không có gì khác cả nhé mọi người, nhưng ở các 1 chúng ta phải khai báo class này trong AndroidManifest thì ở các này thì không , chỉ cần khởi tạo nó ra vậy là xong.

Tiếp theo chúng ta sẽ đi đăng ký sự kiện lắng nghe Broadcast bằng java code thì vì bằng androidmanifest, để đăng kí thì chúng ta sẽ khai báo như sau.

Lắng nghe sự kiện thay đổi Network


Ở trên mình khởi tạo một cái IntentFilter và truyền vào đó một cái action, action ở trên y chang cách 1 nhé các bạn.Đó là lắng nghe sự thay đổi Internet của thiết bị.

Và bên dưới mình gọi 1 ham là registerReceiver() và truyền vào cái Class Broadcast và action chúng ta đã khởi tạo trước đó, mục đich là để đăng ký với hệ thông là nó đăng lắng nghe sự kiện thay đổi mạng của thiết bị, nếu có sự thay đổi nào đó thì sẽ trả kết quả vể hàm onReceiver() của class NetworkChangeReceiver.

Thực nó cách này có khác gì đăng kí ở Manifest đâu mọi người, thay vì đăng ký tự động thì bây giờ chúng ta sẽ đăng ký bằng code thôi, cái này mình sẽ nói rõ ở trong video để các bạn hiểu sâu hơn nhé.

Một điểm lưu ý nữa là các bạn đã gọi hàm registerReceiver() để đăng ký thì sau khi thoát ứng dụng chúng ta nên huỷ nó đi bởi vì sao các bạn viết không.Chắc chắn bạn sẽ gặp một trường hợp là Activity các bạn đang đăng ký bị mất hay còn còn gọi là leak/loss thì sẽ dẫn đến một lỗi kinh điển như sau:


Nguyên nhân và demo sẽ được mình nói chi tiết video bên dưới các bạn hãy xem qua nhé.Để huỷ đăng ký Broadcast Receiver bạn gọi hàm sau unregisterReceiver() , hãy đặt nó trong onPause() hoặc onStop() nhé các bạn.Và theo ý kiến của mình là nên đặt vào onStop() hơn để cho an toàn nhé, cái này mình đã giải thích rõ trong video.

Full code của MainActivity như sau:

MainActivity.java


Kết quả khi chúng ta sẽ được như sau:

Đăng ký broadcast receiver lắng nghe thay đổi network

Đăng ký broadcast receiver lắng nghe thay đổi network

Custom Broadcast Receiver

Đây là phần mình nói thêm, mục địch của việc custom này là để mình mô phỏng lại cơ chế của Broadcast receiver luôn để các bạn có thể hiểu sau hơn về thằng này.Có nghĩa là bây giờ chúng tạ tự tạo ra các action và chủ động gửi đi, lúc này nếu bạn đang lắng nghe các action đó thì chắc chắn sẽ nhận được.

Ví dụ bây giờ mình muốn gửi đi 1 action tên là “thangcoder.com” và trong androidmainifest.xml chúng ta lắng nghe đúng action “thangcoder.com” thì coi có nhận được không nhé:

AndroidMainifest.xml

Lưu ý là bạn có thể đăng ký bằng java code cũng được nhé, trong video bên dưới mình đăng ký bằng code chứ không phải trong XML như thế này nên các bạn đừng bở ngỡ nhé.

Và đây là đoạn code để tạo 1 action và send đi bằng java code:


Đó, các bạn thấy tất cả broadcast đều được send thông qua intent cả nên ở hàm onReceive() chúng ta luôn nhận được 1 itent cả.Bạn có thể add nhiều action bằng các thông qua phương thức setAction() của intent.Sau đó bạn gọi phương thức sendBroadcast(intent) , lúc này hộ thống sẽ tự phát ra 1 intent với action là “thangcoder.com” và vì bạn đang lắng nghe action này trong androidmanifest nên sẽ nhận được.

Khi các bạn bật hay tắt mạng thì nó cũng hoạt động y chang như vậy đó nhé các bạn, việc custom này chúng ta cũng rất hay sử dụng để bắn dữ liệu qua lại với nhau giữa các màn hình, hay ứng dụng đó.

Chi tiết hơn các bạn sẽ xem video và tải source code bên dưới về để làm demo nhé.Mọi ý kiến thắc mắc đừng quên để lại comment bên dưới blog của mình nha.

Video hướng dẫn Broadcast Receiver

Download source code


Chúc các bạn học tập vui vẽ!

Bài 5: Broadcast Receiver trong android
4.3 (85.71%) 7 votes

8 Comments

  1. Hay May 9, 2017
  2. hamana June 14, 2017
  3. trịnh văn đức June 14, 2017
  4. trịnh văn đức June 14, 2017
  5. Admin June 22, 2017
  6. Kim Vàng July 10, 2017
  7. tài July 10, 2017
  8. Kunpark July 19, 2017

Add Comment

*