静的登録を使用した起動時の通知実装

前のセクションの動的登録と対比しながら、静的登録のブロードキャストレシーバーについて解説します。これにより、端末の起動完了時にシステムブロードキャストを受け取り、トースト通知を表示する仕組みを実装します。

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(アプリケーション無応答)と判定され、アプリがクラッシュします。

推奨される実装方法:レシーバーでは軽量なトリガー処理のみを行い、以下のようにします。

  1. 通知を表示する
  2. バックグラウンドサービスを起動する
  3. Activity を起動し、複雑なビジネスロジックは Service に委譲する。onReceive 内に直接処理を書かないこと。

静的登録を使用した起動時の通知実装

コメントを残す

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