在Android中如何為廣播接收器註冊自定義Intent過濾器?


在進入示例之前,我們應該瞭解Android中的Intent過濾器是什麼。Intent過濾器是IntentFilter類的例項。在使用隱式Intent時,Intent過濾器很有用,它不會在Java程式碼中處理,我們必須在AndroidManifest.xml中設定它。Android必須知道它正在啟動什麼樣的Intent,因此Intent過濾器向Android提供關於Intent和動作的資訊。

啟動Intent之前,Android將測試action測試、category測試和data測試。本示例演示如何在Android中將自定義Intent過濾器用於廣播接收器。

步驟1 - 在Android Studio中建立一個新專案,轉到檔案⇒新建專案,並填寫所有必需的詳細資訊以建立一個新專案。

步驟2 - 將以下程式碼新增到res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center"
   android:orientation="vertical"
   tools:context=".MainActivity">
   <Button
      android:id="@+id/buton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="intent filter Register button" />
   <Button
      android:id="@+id/buton1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="send Data" />
</LinearLayout>

在上面的程式碼中,我們有兩個按鈕,一個是註冊Intent,另一個是向廣播發送資料。

package com.example.andy.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
   RadioButton radioButton;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final Button button = findViewById(R.id.buton);
      final Button send = findViewById(R.id.buton1);
      send.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent intent=new Intent("com.example.andy.CUSTOM_INTENT");
            sendBroadcast(intent);
         }
      });
      button.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            registerReceiver(mMessageReceiver,new IntentFilter("com.example.andy.CUSTOM_INTENT"));
         }
      });
   }
   private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
         // Extract data included in the Intent
         String message = intent.getAction();
         Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show();
      }
   };
   @Override
   protected void onPause() {
      super.onPause();
      unregisterReceiver(mMessageReceiver);
   }
}

單擊按鈕時,它將使用如下所示的自定義廣播操作註冊接收器:

registerReceiver(mMessageReceiver,new IntentFilter("com.example.andy.CUSTOM_INTENT"));

這是一個動態廣播接收器,因此我們應該在onPause()中取消註冊,如下所示:

unregisterReceiver(mMessageReceiver);

還有一個按鈕用於傳送廣播。它將向註冊的接收器傳送操作和資料,如下所示:

Intent intent=new Intent("com.example.andy.CUSTOM_INTENT");
sendBroadcast(intent);

這是一個動態廣播註冊,因此我們不需要為廣播接收器建立一個新的接收器檔案,因此我們已在同一個Activity中宣告廣播接收器,如下所示:

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      // Extract data included in the Intent
      String message = intent.getAction();
      Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show();
   }
};

在上面的程式碼中,它將從Intent中獲取資料作為操作並在Toast上列印。讓我們嘗試執行您的應用程式。我假設您已將您的實際Android移動裝置連線到您的計算機。要從Android Studio執行應用程式,請開啟您的一個專案活動檔案,然後單擊工具欄中的執行圖示。選擇您的移動裝置作為選項,然後檢查您的移動裝置,它將顯示您的預設螢幕:

首先,我們透過單擊“Intent過濾器註冊按鈕”註冊接收器,然後單擊發送資料以顯示Toast,如下所示:

點選這裡下載專案程式碼

更新於:2019年7月30日

2K+瀏覽量

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告