Computer >> Máy Tính >  >> Hệ thống >> Android

Máy thu phát sóng cho người mới bắt đầu

Giả sử bạn có một ứng dụng phụ thuộc vào kết nối internet ổn định. Bạn muốn ứng dụng của mình nhận được thông báo khi kết nối internet thay đổi. Làm thế nào để bạn làm điều đó? Một giải pháp khả thi sẽ là một dịch vụ luôn kiểm tra kết nối internet. Việc triển khai này không tốt vì nhiều lý do, vì vậy chúng tôi thậm chí sẽ không xem xét nó. Giải pháp cho vấn đề này là Bộ thu phát sóng và nó sẽ lắng nghe những thay đổi mà bạn yêu cầu. Một bộ thu phát sóng sẽ luôn nhận được thông báo về một chương trình phát sóng, bất kể trạng thái của ứng dụng của bạn. Không quan trọng nếu ứng dụng của bạn hiện đang chạy, ở chế độ nền hay hoàn toàn không chạy.

​​Nền

Bộ thu phát sóng là các thành phần trong ứng dụng Android của bạn có chức năng nghe tin nhắn quảng bá (hoặc sự kiện) từ các cửa hàng khác nhau:

  • Từ các ứng dụng khác
  • Từ chính hệ thống
  • Từ ứng dụng của bạn

Có nghĩa là chúng được gọi khi một hành động nhất định xảy ra mà chúng đã được lập trình để lắng nghe (I.E., một chương trình phát sóng).

Một chương trình phát sóng chỉ đơn giản là một thông điệp được bao bọc bên trong một đối tượng Intent. Một chương trình phát sóng có thể là ẩn ý hoặc rõ ràng.

  • Một chương trình phát sóng ngầm là ứng dụng không nhắm mục tiêu cụ thể đến ứng dụng của bạn nên nó không dành riêng cho ứng dụng của bạn. Để đăng ký một tài khoản, bạn cần sử dụng IntentFilter và khai báo nó trong tệp kê khai của mình. Bạn cần thực hiện tất cả những điều này vì hệ điều hành Android sẽ xem xét tất cả các bộ lọc ý định đã khai báo trong tệp kê khai của bạn và xem liệu có khớp hay không. Do hành vi này, các chương trình truyền phát ngầm định không có thuộc tính đích. Ví dụ cho một chương trình phát sóng ngầm sẽ là một hành động của một tin nhắn SMS đến.
  • Một chương trình phát sóng rõ ràng là một trong đó được nhắm mục tiêu cụ thể cho ứng dụng của bạn trên một thành phần đã biết trước. Điều này xảy ra do thuộc tính đích chứa tên gói của ứng dụng hoặc tên lớp thành phần.

Có hai cách để khai báo người nhận:

  1. Bằng cách khai báo một trong tệp AndroidManifest.xml của bạn với thẻ (còn được gọi là tĩnh)
<receiver android:name=".YourBrodcastReceiverClass"  android:exported="true">
    <intent-filter>
        <!-- The actions you wish to listen to, below is an example -->
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
AndroidManifest.xml

Bạn sẽ nhận thấy rằng bộ thu phát sóng được khai báo ở trên có thuộc tính export =”true” . Thuộc tính này cho người nhận biết rằng nó có thể nhận các chương trình phát sóng từ bên ngoài phạm vi của ứng dụng.

2. Hoặc động bằng cách đăng ký một phiên bản với registerReceiver (được gọi là ngữ cảnh đã đăng ký)

public abstract Intent registerReceiver (BroadcastReceiver receiver, 
                IntentFilter filter);

Triển khai

Để tạo bộ thu phát sóng của riêng bạn, trước tiên bạn phải mở rộng lớp cha BroadcastReceiver và ghi đè phương thức bắt buộc, onReceive:

public void onReceive(Context context, Intent intent) {
    //Implement your logic here
 }

Kết hợp tất cả lại với nhau sẽ mang lại:

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        StringBuilder sb = new StringBuilder();
        sb.append("Action: " + intent.getAction() + "\n");
        sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
        String log = sb.toString();
        Toast.makeText(context, log, Toast.LENGTH_LONG).show();

    }
}
MyBroadcastReceiver.java
⚠️ Phương thức onReceive chạy trên luồng chính và do đó, quá trình thực thi của nó phải ngắn gọn.

Nếu một quá trình dài được thực thi, hệ thống có thể giết quá trình sau khi phương thức trả về. Để tránh điều này, hãy xem xét sử dụng goAsync hoặc lên lịch công việc. Bạn có thể đọc thêm về cách sắp xếp công việc ở cuối bài viết này.

Ví dụ về đăng ký động

Để đăng ký bộ thu có ngữ cảnh, trước tiên bạn cần khởi tạo một phiên bản của bộ thu phát sóng của mình:

BroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();

Sau đó, bạn có thể đăng ký nó tùy thuộc vào ngữ cảnh cụ thể mà bạn muốn:

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(myBroadcastReceiver, filter);
Tham số đầu tiên cho IntentFilter là một chuỗi đại diện cho một hành động

Đừng quên hủy đăng ký bộ thu phát sóng của bạn khi bạn không cần nó nữa

@Override
protected void onStop() {
  super.onStop();
  unregisterReceiver(myBroadcastReceiver);
}

Phát sự kiện

Điểm đằng sau việc phát thông báo từ ứng dụng của bạn là cho phép ứng dụng của bạn phản hồi các sự kiện khi chúng xảy ra bên trong ứng dụng. Hãy nghĩ về một tình huống trong đó trong một phần của mã, người dùng thực hiện một hành động nhất định và vì nó, bạn muốn thực thi một số logic khác mà bạn có ở một nơi khác.

Có ba cách để gửi chương trình phát sóng:

  1. sendOrderedBroadcast , đảm bảo chỉ gửi các chương trình phát sóng đến một người nhận tại một thời điểm. Đến lượt mình, mỗi chương trình phát sóng có thể truyền dữ liệu cho thiết bị theo sau nó hoặc để dừng việc truyền phát chương trình phát sóng tới các thiết bị thu theo sau
  2. sendBroadcast tương tự như phương pháp đã đề cập ở trên, với một điểm khác biệt. Tất cả các bộ thu phát sóng đều nhận được tin nhắn và không phụ thuộc vào nhau
  3. LocalBroadcastManager.sendBroadcast phương pháp chỉ gửi các chương trình phát sóng đến những người nhận được xác định bên trong ứng dụng của bạn và không vượt quá phạm vi ứng dụng của bạn. Ví dụ về việc gửi một chương trình phát sóng tùy chỉnh

https://giphy.com/gifs/23gUJhHyWkXEwl7UYV/html5

Máy thu phát sóng cho người mới bắt đầu
Ảnh của John Gibbons trên Unsplash

Gotchas và những điều cần chú ý

  • Không gửi dữ liệu nhạy cảm thông qua một chương trình phát sóng ngầm, vì bất kỳ ứng dụng nào lắng nghe nó, sẽ nhận được dữ liệu đó. Bạn có thể ngăn chặn điều này bằng cách chỉ định một gói hoặc đính kèm quyền cho chương trình phát sóng
  • Không bắt đầu các hoạt động từ một chương trình phát sóng đã nhận được vì thiếu trải nghiệm người dùng. Thay vào đó, hãy chọn hiển thị thông báo.

Các gạch đầu dòng sau đề cập đến những thay đổi trong bộ thu phát sóng phù hợp với từng phiên bản hệ điều hành Android (bắt đầu từ 7.0). Đối với mỗi phiên bản, một số hạn chế nhất định đã xảy ra và hành vi cũng thay đổi. Hãy ghi nhớ những hạn chế này khi nghĩ đến việc sử dụng bộ thu phát sóng.

  • 7.0 trở lên (API cấp 24) - Hai chương trình phát sóng của hệ thống đã bị vô hiệu hóa, Action_New_Picture và Action_New_Video (nhưng chúng đã được đưa trở lại trong Android O cho người nhận đã đăng ký)
  • 8.0 trở lên (API cấp 26) - Hầu hết các chương trình phát sóng ngầm cần được đăng ký động chứ không phải tĩnh (trong tệp kê khai của bạn). Bạn có thể tìm các chương trình phát sóng đã được đưa vào danh sách cho phép trong liên kết này.
  • 9.0 trở lên (API cấp 28) - Nhận được ít thông tin hơn về chương trình phát sóng hệ thống Wi-Fi và Network_State_Changed_Action.

Những thay đổi trong Android O là những thay đổi bạn cần lưu ý nhất. Lý do những thay đổi này được thực hiện là vì nó dẫn đến các vấn đề về hiệu suất, cạn kiệt pin và ảnh hưởng đến trải nghiệm của người dùng. Điều này xảy ra do nhiều ứng dụng (ngay cả những ứng dụng hiện không chạy) đang lắng nghe sự thay đổi trên toàn hệ thống và khi sự thay đổi đó xảy ra, sự hỗn loạn đã xảy ra sau đó. Hãy tưởng tượng rằng mọi ứng dụng đã đăng ký hành động, đi vào cuộc sống để kiểm tra xem ứng dụng đó có cần phải làm điều gì đó vì chương trình phát sóng hay không. Hãy tính đến điều gì đó như trạng thái Wi-Fi, trạng thái này thường xuyên thay đổi và bạn sẽ bắt đầu hiểu tại sao những thay đổi này lại diễn ra.

Các lựa chọn thay thế cho Bộ thu phát sóng

Để giúp dễ dàng điều hướng tất cả các hạn chế này, dưới đây là bảng phân tích các thành phần khác mà bạn có thể sử dụng trong trường hợp không có bộ thu phát sóng. Mỗi cái có một trách nhiệm và trường hợp sử dụng khác nhau, vì vậy hãy cố gắng vạch ra cái nào đáp ứng nhu cầu của bạn.

  • LocalBroadcastManager - Như tôi đã đề cập ở trên, điều này chỉ hợp lệ cho các chương trình phát sóng trong ứng dụng của bạn
  • Lên lịch Công việc - Một công việc có thể được chạy tùy thuộc vào một tín hiệu hoặc bộ kích hoạt nhận được, vì vậy bạn có thể thấy rằng chương trình phát sóng bạn đang nghe có thể được thay thế bằng một công việc. Hơn nữa, JobScheduler, sẽ đảm bảo công việc của bạn sẽ hoàn thành, nhưng nó sẽ tính đến các yếu tố hệ thống khác nhau (thời gian và điều kiện) để xác định khi nào nó sẽ chạy. Khi tạo công việc, bạn sẽ ghi đè phương thức có tên onStartJob . Phương thức này chạy trên luồng chính, vì vậy hãy đảm bảo rằng nó hoàn thành công việc của mình trong một khoảng thời gian giới hạn. Nếu bạn cần thực hiện logic phức tạp, hãy cân nhắc bắt đầu một tác vụ nền. Hơn nữa, giá trị trả về cho phương thức này là boolean, trong đó true biểu thị rằng một số hành động nhất định vẫn đang được thực hiện và false có nghĩa là công việc đã hoàn thành

Nếu bạn muốn tận mắt trải nghiệm niềm vui và sự ngạc nhiên của máy thu phát sóng, bạn có thể theo các liên kết sau đến kho lưu trữ mà tôi đã thiết lập:

  1. Truyền phát tùy chỉnh (với khai báo tệp kê khai)
  2. Đăng ký chương trình phát sóng (không cần khai báo trong tệp kê khai)
  3. LocalBroadcastManager

Truyền phát qua.