前のセクションの動的登録と対比しながら、静的登録のブロードキャストレシーバーについて解説します。これにより、端末の起動完了時にシステムブロードキャストを受け取り、トースト通知を表示する仕組みを実装します。
1. 動的登録と静的登録の主な違い
- 動的登録:コード内で
registerReceiverを呼び出して登録し、通常は Activity のonCreate内に記述します。アプリを一度起動しておく必要があり、アプリを終了するとブロードキャストを受け取れなくなります。登録や破棄を手動で制御できるため、柔軟性に優れています。 - 静的登録:
AndroidManifest.xml内に<receiver>タグを記述して登録します。アプリを事前に起動していなくても、システムの起動完了後に自動的にレシーバーが起動し、システムブロードキャストを受け取ることができます。
2. 実装手順
① ブロードキャストレシーバークラス BootCompleteReceiver を作成
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "システムの起動が完了しました", Toast.LENGTH_LONG).show();
}
}
Code language: PHP (php)
- 作成手順:Android Studio で該当パッケージを右クリック → New → Other → Broadcast Receiver を選択。
- パラメータの説明:
Enabled:このレシーバーを有効にするかどうか(チェックを入れる)。Exported:アプリ外からのシステムブロードキャストを受け取るかどうか(チェックを入れる。システムの起動ブロードキャストを受け取るため、外部ブロードキャストの許可が必要です)。
教材によって manifest に
exported="false"と記載されている場合がありますが、これは誤りです。システムブロードキャストを受け取るにはexported="true"に設定する必要があります。
② AndroidManifest.xml に権限を追加
<!-- 起動完了ブロードキャストを受け取るための権限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Code language: HTML, XML (xml)
③ <application> 内でレシーバーと intent-filter を静的登録
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!-- 起動完了時のアクション -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
intent-filter:このレシーバーがどの種類のブロードキャストを待ち受けるかを宣言するフィルターです。ここではBOOT_COMPLETED(システム起動完了)ブロードキャストを監視しています。
3. 注意点
onReceive() 内に時間のかかる処理を書かないでください! ブロードキャストレシーバーの
onReceiveはメインスレッドで実行され、処理時間の制限が非常に短い(約10秒)ため、重い処理を行うと ANR(アプリケーション無応答)と判定され、アプリがクラッシュします。
推奨される実装方法:レシーバーでは軽量なトリガー処理のみを行い、以下のようにします。
- 通知を表示する
- バックグラウンドサービスを起動する
- Activity を起動し、複雑なビジネスロジックは Service に委譲する。
onReceive内に直接処理を書かないこと。
静的登録を使用した起動時の通知実装
Previous: Android ネットワーク接続/切断ブロードキャスト監視
Next: カスタムブロードキャストを送信