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 順序付きブロードキャスト
- 通常ブロードキャスト sendBroadcast() 非同期ブロードキャスト。すべてのレシーバーがほぼ同時に受信し、順序がなく中断できません。
- 順序付きブロードキャスト sendOrderedBroadcast() 優先度に従って順番に受信。先のレシーバーは
abortBroadcast()でブロードキャストを停止でき、後続のレシーバーは受信できなくなります。
画像内のエラー:Activity class ...MainActivity does not exist
エラーの意味:システムがMainActivityクラスを見つけられません
よくある原因
- AndroidManifest.xml のActivity
android:nameパス記述ミス(最も多い)- パッケージ名とクラス名の不一致、大文字小文字の誤り
- 記述ルール:
android:name=".MainActivity"、.は現在のapplicationパッケージ配下を意味 - 確認方法:IDE上でCtrlキーを押しながらクラス名をクリック。MainActivityへジャンプできればパスは正しい
- パッケージ名不整合:build.gradleのapplicationIdとマニフェストのpackage名が不一致
- クラスファイルの欠損:MainActivity.javaの削除 / ファイル名ミス(Javaクラス名はファイル名と完全一致、大文字小文字を区別)
- ビルドエラー:プロジェクトのコンパイル失敗でclassファイルが生成されない。プロジェクトをクリーンして再ビルド(Build -> Clean Project)
- 大文字小文字の問題:
MainactivityとMainActivityは別のクラス、Androidは大文字小文字を区別します
簡単なトラブルシューティング手順
- 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> - Ctrlキーを押しながら
.MainActivityをクリック、コードへジャンプできるか確認 - ジャンプ不可 →
android:nameを正しい完全修飾クラス名に修正 - ジャンプ可 →
Clean Projectを実行、再ビルドしapkを再インストール
補足:新しいAndroid(API26以上)に注意:暗黙的ブロードキャストの静的登録には多くの制限があります。多くのシステム暗黙ブロードキャストは静的登録不可ですが、自作actionの暗黙ブロードキャストは制限対象外で正常に動作します。このサンプルはそのまま実行可能です。
カスタムブロードキャストを送信
Previous: 静的登録を使用した起動時の通知実装
Next: Android でのアプリ間ブロードキャスト受信