カスタムブロードキャストを送信

1. カスタムブロードキャストレシーバー MyBroadcastReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "自作のブロードキャストを受信しました", Toast.LENGTH_LONG).show();
    }
}
Code language: JavaScript (javascript)

2. AndroidManifest.xml レシーバー登録(マニフェストファイル)

<application> タグ内に追加:

<receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.foxdevelop.www.broadcastdemo.MY_BROADCAST" />
    </intent-filter>
</receiver>
Code language: HTML, XML (xml)

重要ポイント:action 名。後でブロードキャスト送信時に使うIntent文字列はここの記述と完全に一致させる必要があります

3. activity_main.xml レイアウト(ボタン)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ブロードキャスト送信"/>
</LinearLayout>
Code language: HTML, XML (xml)

4. MainActivity.java メインActivity(ボタンクリックでブロードキャスト送信)

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.btn_send);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // action文字列はマニフェストのactionと完全同一にする
                Intent intent = new Intent("cn.bamn.www.broadcastdemo.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }
}
Code language: JavaScript (javascript)

通常ブロードキャスト vs 順序付きブロードキャスト

  1. 通常ブロードキャスト sendBroadcast() 非同期ブロードキャスト。すべてのレシーバーがほぼ同時に受信し、順序がなく中断できません。
  2. 順序付きブロードキャスト sendOrderedBroadcast() 優先度に従って順番に受信。先のレシーバーは abortBroadcast() でブロードキャストを停止でき、後続のレシーバーは受信できなくなります。

画像内のエラー:Activity class ...MainActivity does not exist

エラーの意味:システムがMainActivityクラスを見つけられません

よくある原因

  1. AndroidManifest.xml のActivity android:name パス記述ミス(最も多い)
    • パッケージ名とクラス名の不一致、大文字小文字の誤り
    • 記述ルール:android:name=".MainActivity"、. は現在のapplicationパッケージ配下を意味
    • 確認方法:IDE上でCtrlキーを押しながらクラス名をクリック。MainActivityへジャンプできればパスは正しい
  2. パッケージ名不整合:build.gradleのapplicationIdとマニフェストのpackage名が不一致
  3. クラスファイルの欠損:MainActivity.javaの削除 / ファイル名ミス(Javaクラス名はファイル名と完全一致、大文字小文字を区別)
  4. ビルドエラー:プロジェクトのコンパイル失敗でclassファイルが生成されない。プロジェクトをクリーンして再ビルド(Build -> Clean Project)
  5. 大文字小文字の問題:Mainactivity と MainActivity は別のクラス、Androidは大文字小文字を区別します

簡単なトラブルシューティング手順

  1. AndroidManifest.xmlを開き、起動用Activityノードを探す<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
  2. Ctrlキーを押しながら .MainActivity をクリック、コードへジャンプできるか確認
  3. ジャンプ不可 → android:name を正しい完全修飾クラス名に修正
  4. ジャンプ可 → Clean Project を実行、再ビルドしapkを再インストール

補足:新しいAndroid(API26以上)に注意:暗黙的ブロードキャストの静的登録には多くの制限があります。多くのシステム暗黙ブロードキャストは静的登録不可ですが、自作actionの暗黙ブロードキャストは制限対象外で正常に動作します。このサンプルはそのまま実行可能です。

カスタムブロードキャストを送信

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です