Android - Máy thu phát sóng

Broadcast Receivers chỉ cần trả lời các tin nhắn quảng bá từ các ứng dụng khác hoặc từ chính hệ thống. Những thông điệp này đôi khi được gọi là sự kiện hoặc ý định. Ví dụ: các ứng dụng cũng có thể bắt đầu phát sóng để cho các ứng dụng khác biết rằng một số dữ liệu đã được tải xuống thiết bị và có sẵn để họ sử dụng, vì vậy đây là bộ thu phát sóng sẽ chặn giao tiếp này và sẽ bắt đầu hành động thích hợp.

Có hai bước quan trọng sau đây để làm cho BroadcastReceiver hoạt động cho các ý định đã phát của hệ thống:

  • Tạo bộ thu phát sóng.

  • Đăng ký bộ thu phát sóng

Có một bước bổ sung trong trường hợp bạn định thực hiện các ý định tùy chỉnh của mình thì bạn sẽ phải tạo và phát các ý định đó.

Tạo bộ thu phát sóng

Một máy thu phát sóng được thực hiện như một lớp con của BroadcastReceiver lớp và ghi đè phương thức onReceive () nơi mỗi thông báo được nhận dưới dạng Intent tham số đối tượng.

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

Đăng ký bộ thu phát sóng

Một ứng dụng lắng nghe ý định phát sóng cụ thể bằng cách đăng ký bộ thu phát sóng trong tệp AndroidManifest.xml . Hãy xem xét chúng ta sẽ đăng ký MyReceiver cho sự kiện do hệ thống tạo ACTION_BOOT_COMPLETED được hệ thống kích hoạt sau khi hệ thống Android hoàn tất quá trình khởi động.

Phát sóng thu

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>
   
   </receiver>
</application>

Bây giờ bất cứ khi nào thiết bị Android của bạn được khởi động, nó sẽ bị BroadcastReceiver MyReceiver chặn và logic được triển khai bên trong onReceive () sẽ được thực thi.

Có một số sự kiện do hệ thống tạo ra được xác định là trường tĩnh cuối cùng trong Intentlớp học. Bảng sau liệt kê một vài sự kiện hệ thống quan trọng.

Sr.No Sự kiện Hằng số & Mô tả
1

android.intent.action.BATTERY_CHANGED

Quảng cáo cố định chứa trạng thái sạc, mức và thông tin khác về pin.

2

android.intent.action.BATTERY_LOW

Cho biết tình trạng pin yếu trên thiết bị.

3

android.intent.action.BATTERY_OKAY

Cho biết pin hiện đã ổn sau khi sắp hết.

4

android.intent.action.BOOT_COMPLETED

Điều này được phát một lần, sau khi hệ thống khởi động xong.

5

android.intent.action.BUG_REPORT

Hiển thị hoạt động để báo cáo lỗi.

6

android.intent.action.CALL

Thực hiện cuộc gọi đến người nào đó được chỉ định bởi dữ liệu

7

android.intent.action.CALL_BUTTON

Người dùng đã nhấn nút "gọi" để chuyển đến trình quay số hoặc giao diện người dùng thích hợp khác để thực hiện cuộc gọi.

số 8

android.intent.action.DATE_CHANGED

Ngày đã thay đổi.

9

android.intent.action.REBOOT

Khởi động lại thiết bị.

Phát các Ý định Tùy chỉnh

Nếu bạn muốn ứng dụng của mình tự tạo và gửi các ý định tùy chỉnh thì bạn sẽ phải tạo và gửi các ý định đó bằng cách sử dụng phương thức sendBroadcast () bên trong lớp hoạt động của mình. Nếu bạn sử dụng phương thức sendStickyBroadcast (Intent) , Intent làsticky, nghĩa là Ý định bạn đang gửi vẫn tồn tại sau khi quá trình phát hoàn tất.

public void broadcastIntent(View view) {
   Intent intent = new Intent();
   intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
   sendBroadcast(intent);
}

Mục đích com.tutorialspoint.CUSTOM_INTENT này cũng có thể được đăng ký theo cách tương tự như chúng tôi đã đăng ký ý định do hệ thống tạo ra.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="com.tutorialspoint.CUSTOM_INTENT">
         </action>
      </intent-filter>
   
   </receiver>
</application>

Thí dụ

Ví dụ này sẽ giải thích cho bạn cách tạo BroadcastReceiver để chặn mục đích tùy chỉnh. Khi bạn đã quen với ý định tùy chỉnh, thì bạn có thể lập trình ứng dụng của mình để chặn các ý định do hệ thống tạo ra. Vì vậy, hãy làm theo các bước sau để sửa đổi ứng dụng Android mà chúng tôi đã tạo trong chương Ví dụ Hello World -

Bươc Sự miêu tả
1 Bạn sẽ sử dụng Android studio để tạo ứng dụng Android và đặt tên nó là Ứng dụng của tôi theo gói com.example.tutorialspoint7.myapplication như được giải thích trong chương Ví dụ về Hello World .
2 Sửa đổi tệp hoạt động chính MainActivity.java để thêm phương thức broadcastIntent () .
3 Tạo một tệp java mới có tên MyReceiver.java trong gói com.example.tutorialspoint7.myapplication để xác định BroadcastReceiver.
4 Một ứng dụng có thể xử lý một hoặc nhiều ý định hệ thống và tùy chỉnh mà không có bất kỳ hạn chế nào. Mọi ý định bạn muốn chặn phải được đăng ký trong tệp AndroidManifest.xml của bạn bằng cách sử dụng thẻ <receiver ... />
5 Sửa đổi nội dung mặc định của tệp res / layout / activity_main.xml để bao gồm một nút cho mục đích quảng bá.
6 Không cần sửa đổi tệp chuỗi, Android studio xử lý tệp string.xml.
7 Chạy ứng dụng để khởi chạy trình giả lập Android và xác minh kết quả của các thay đổi được thực hiện trong ứng dụng.

Sau đây là nội dung của tệp hoạt động chính được sửa đổi MainActivity.java. Tệp này có thể bao gồm từng phương pháp cơ bản của vòng đời. Chúng tôi đã thêm phương thức broadcastIntent () để phát một ý định tùy chỉnh.

package com.example.tutorialspoint7.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

   /** Called when the activity is first created. */
   @Override
   
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }


   // broadcast a custom intent.
      
   public void broadcastIntent(View view){
      Intent intent = new Intent();
      intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent);
   }
}

Sau đây là nội dung của MyReceiver.java:

package com.example.tutorialspoint7.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * Created by TutorialsPoint7 on 8/23/2016.
 */
public class MyReceiver extends BroadcastReceiver{
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

Sau đây sẽ là nội dung sửa đổi của tệp AndroidManifest.xml . Ở đây chúng tôi đã thêm thẻ <receiver ... /> để bao gồm dịch vụ của chúng tôi:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
		
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   
      <receiver android:name="MyReceiver">
         <intent-filter>
            <action android:name="com.tutorialspoint.CUSTOM_INTENT">
            </action>
         </intent-filter>

      </receiver>
   </application>

</manifest>

Sau đây sẽ là nội dung của res/layout/activity_main.xml tệp để bao gồm một nút để phát ý định tùy chỉnh của chúng tôi -

<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" 
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example of Broadcast"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />
      
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/button2"
      android:text="Broadcast Intent"
      android:onClick="broadcastIntent"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />

</RelativeLayout>

Hãy thử chạy Hello World!ứng dụng chúng tôi vừa sửa đổi. Tôi cho rằng bạn đã tạo raAVDtrong khi thiết lập môi trường. Để chạy ứng dụng từ Android studio, hãy mở một trong các tệp hoạt động của dự án của bạn và nhấp vào

biểu tượng Chạy từ thanh công cụ. Android Studio cài đặt ứng dụng trên AVD của bạn và khởi động nó và nếu mọi thứ đều ổn với thiết lập và ứng dụng của bạn, nó sẽ hiển thị sau cửa sổ Trình mô phỏng -

Bây giờ để quảng bá ý định tùy chỉnh của chúng tôi, hãy nhấp vào Broadcast Intent, điều này sẽ phát đi mục đích tùy chỉnh của chúng tôi "com.tutorialspoint.CUSTOM_INTENT" sẽ bị chặn bởi BroadcastReceiver đã đăng ký của chúng tôi, tức là MyReceiver và theo logic được triển khai của chúng tôi, bánh mì nướng sẽ xuất hiện ở cuối trình mô phỏng như sau:

Bạn có thể thử triển khai BroadcastReceiver khác để chặn các ý định do hệ thống tạo ra như khởi động hệ thống, ngày thay đổi, pin yếu, v.v.