Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidでカスタムインテントフィルターをブロードキャストレシーバーに登録する方法

インテントフィルターとは

例に入る前に、Androidにおける「インテントフィルター」について確認しておきましょう。インテントフィルターはIntentFilterクラスのインスタンスであり、暗黙的インテント(Implicit Intent)を扱う際に活躍します。Javaコード内で直接処理するものではなく、AndroidManifest.xmlに設定する必要があります。Androidシステムは起動しようとしているインテントの種類を把握しておく必要があるため、インテントフィルターがインテントやアクションに関する情報をシステムに伝える役割を担っています。

インテントを起動する前に、Androidは「アクションテスト」「カテゴリテスト」「データテスト」の3つの検証を実行します。この記事では、カスタムインテントフィルターを使ってブロードキャストレシーバーを登録する方法を解説します。

実装手順

ステップ1:新規プロジェクトの作成

Android Studioで新しいプロジェクトを作成します。「File」⇒「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成してください。

ステップ2:レイアウトファイルの準備

res/layout/activity_main.xmlに以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
   xmlns:app="https://schemas.android.com/apk/res-auto"
   xmlns:tools="https://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>

上記のコードでは2つのボタンを配置しています。1つはインテントフィルターを登録するためのもので、もう1つはブロードキャストへデータを送信するためのものです。

ステップ3:MainActivity.javaの実装

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.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
   @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) {
         // インテントに含まれるデータを取り出す
         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);

もう1つのボタンはブロードキャスト送信用です。クリックすると、登録済みのレシーバーに対してアクションとデータを送信します。

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

今回は動的にレシーバーを登録しているため、レシーバー専用の新しいクラスファイルを作成する必要はありません。同じアクティビティ内でブロードキャストレシーバーを宣言できます。

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      // インテントに含まれるデータを取り出す
      String message = intent.getAction();
      Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show();
   }
};

上記のコードでは、インテントからアクション名を取得し、その内容をToastで表示しています。

注意点

ターゲットAPI 34以降でアプリをビルドする場合、システムブロードキャスト以外を受信する動的レシーバーには、セキュリティ保護のためContext.RECEIVER_EXPORTEDまたはContext.RECEIVER_NOT_EXPORTEDフラグの指定が必要になる場合があります。最新の環境で開発する際はContextCompat.registerReceiver()の利用を検討してください。

アプリの実行と動作確認

それではアプリを実行してみましょう。実機のAndroidデバイスがパソコンに接続されているものとします。Android Studioでプロジェクトのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。デバイスを選択してアプリを起動すると、まず次のような初期画面が表示されます。

Androidでカスタムインテントフィルターをブロードキャストレシーバーに登録する方法

最初に「intent filter Register button」をタップしてレシーバーを登録し、続いて「send Data」ボタンをタップすると、以下のようにToastが表示されます。

Androidでカスタムインテントフィルターをブロードキャストレシーバーに登録する方法

  1. AndroidでSearchViewを使ってRecyclerViewをフィルタリングする方法を解説

    この記事では、AndroidアプリにおいてSearchViewを使用してRecyclerViewの表示内容をリアルタイムに絞り込む(フィルタリングする)方法を、実際のコード例とともに段階的に解説します。全体の流れ実装のポイントは以下の通りです。RecyclerViewに表示するデータリストを準備するアダプターにFilterableインターフェースを実装するメニューに配置したSearchViewの入力イベントを受け取り、フィルターを呼び出すステップ1:新規プロジェクトの作成まず、Android Studioで新しいプロジェクトを作成します。「File」→「New Project」を選択し、必要な

  2. Androidでカスタムジェスチャーを追加して操作を時短する方法

    Androidデバイスにカスタムジェスチャーを設定すれば、日々のスマホ操作をぐっと快適にできます。自分が一番使いやすい動きで、新しいタブを開くなどの特定のタスクを実行できるように、端末を自由にカスタマイズできるのが魅力です。 例えば、画面の上端からスワイプするだけで最近使ったアプリへアクセスできたら便利だと思いませんか?カスタムジェスチャーがない状態では、クイック設定パネル( Wi-Fiや歯車アイコンなど)にしかアクセスできません。この記事では、代表的なカスタムジェスチャーアプリを紹介しながら、設定方法をわかりやすく解説します。 All in One Gesturesでカスタムジェスチャーを追