Android
 Computer >> コンピューター >  >> システム >> Android

初心者向けブロードキャストレシーバー

安定したインターネット接続に依存するアプリケーションがあるとします。インターネット接続が変更されたときにアプリケーションに通知を受け取る必要があります。どうやってそれをしますか?可能な解決策は、インターネット接続を常にチェックするサービスです。この実装はさまざまな理由で悪いので、考慮しません。この問題の解決策は Broadcast Receiver であり、指示された変更をリッスンします。ブロードキャスト レシーバーは、アプリケーションのステータスに関係なく、常にブロードキャストの通知を受け取ります。アプリケーションが現在実行されているか、バックグラウンドで実行されているか、まったく実行されていないかは問題ではありません。

​​背景

ブロードキャスト レシーバーは、さまざまなアウトレットからのブロードキャスト メッセージ (またはイベント) をリッスンする Android アプリケーションのコンポーネントです。

  • 他のアプリケーションから
  • システム自体から
  • お申し込みから

つまり、聞くようにプログラムされた特定のアクションが発生したときに呼び出されます (つまり、ブロードキャスト)。

ブロードキャストは、単に Intent オブジェクト内にラップされたメッセージです。ブロードキャストは、暗黙的または明示的のいずれかです。

  • 暗黙のブロードキャスト アプリケーションを特に対象としないため、アプリケーション専用ではありません。登録するには、IntentFilter を使用してマニフェストで宣言する必要があります。 Android オペレーティング システムは、マニフェストで宣言されたすべてのインテント フィルターを調べて、一致するものがあるかどうかを確認するため、これらすべてを行う必要があります。この動作のため、暗黙のブロードキャストにはターゲット属性がありません。暗黙的なブロードキャストの例は、着信 SMS メッセージのアクションです。
  • 露骨なブロードキャスト 事前に知られているコンポーネント上のアプリケーションを特に対象とするものです。これは、アプリケーションのパッケージ名またはコンポーネント クラス名を含む target 属性が原因で発生します。

レシーバーを宣言する方法は 2 つあります:

<オール>
  • AndroidManifest.xml ファイルで タグ (静的とも呼ばれます) を使用して宣言することにより
  • <receiver android:name=".YourBrodcastReceiverClass"  android:exported="true">
        <intent-filter>
            <!-- The actions you wish to listen to, below is an example -->
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
    AndroidManifest.xml

    上記で宣言されたブロードキャスト レシーバには、exported="true" のプロパティがあることがわかります。 .この属性は、アプリケーションの範囲外からブロードキャストを受信できることをレシーバーに伝えます。

    2. または、registerReceiver を使用してインスタンスを動的に登録する (コンテキスト登録と呼ばれるもの)

    public abstract Intent registerReceiver (BroadcastReceiver receiver, 
                    IntentFilter filter);

    実装

    独自のブロードキャスト レシーバーを作成するには、まず BroadcastReceiver 親クラスを拡張し、必須メソッド onReceive:をオーバーライドする必要があります。

    public void onReceive(Context context, Intent intent) {
        //Implement your logic here
     }

    すべてをまとめると、次のようになります。

    public class MyBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            StringBuilder sb = new StringBuilder();
            sb.append("Action: " + intent.getAction() + "\n");
            sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
            String log = sb.toString();
            Toast.makeText(context, log, Toast.LENGTH_LONG).show();
    
        }
    }
    MyBroadcastReceiver.java
    ⚠️onReceive メソッドはメイン スレッドで実行されるため、その実行は短時間で済みます。

    長いプロセスが実行されると、メソッドが戻った後にシステムがプロセスを強制終了することがあります。これを回避するには、goAsync を使用するか、ジョブをスケジュールすることを検討してください。ジョブのスケジューリングについて詳しくは、この記事の最後をご覧ください。

    動的登録の例

    レシーバーをコンテキストに登録するには、まずブロードキャスト レシーバーのインスタンスをインスタンス化する必要があります。

    BroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();

    次に、必要な特定のコンテキストに応じて登録できます:

    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    this.registerReceiver(myBroadcastReceiver, filter);
    IntentFilter の最初のパラメーターはアクションを表す文字列です

    ブロードキャストレシーバーが不要になったら、忘れずに登録を解除してください

    @Override
    protected void onStop() {
      super.onStop();
      unregisterReceiver(myBroadcastReceiver);
    }

    イベントのブロードキャスト

    アプリケーションからメッセージをブロードキャストする背後にあるポイントは、アプリケーションが内部で発生したイベントに応答できるようにすることです。コードの一部でユーザーが特定のアクションを実行し、そのために別の場所で他のロジックを実行したいというシナリオを考えてみてください。

    ブロードキャストを送信するには 3 つの方法があります:

    <オール>
  • sendOrderedBroadcast メソッドでは、ブロードキャストを一度に 1 つのレシーバーにのみ送信するようにします。各ブロードキャストは順番に、後続のレシーバーにデータを渡したり、後続のレシーバーへのブロードキャストの伝搬を停止したりできます
  • sendBroadcast 上記の方法と似ていますが、1 つの違いがあります。すべてのブロードキャスト レシーバーはメッセージを受信し、相互に依存しません
  • LocalBroadcastManager.sendBroadcast メソッドは、アプリケーション内で定義されたレシーバーにのみブロードキャストを送信し、アプリケーションの範囲を超えません。カスタム ブロードキャストの送信例
  • https://giphy.com/gifs/23gUJhHyWkXEwl7UYV/html5

    初心者向けブロードキャストレシーバー
    Unsplash の John Gibbons による写真

    落とし穴と注意すべきこと

    • 機密データを暗黙的なブロードキャストで送信しないでください。機密データをリッスンしているアプリケーションが受信するためです。これは、パッケージを指定するか、ブロードキャストに権限を付与することで防ぐことができます
    • ユーザー エクスペリエンスが不足しているため、受信したブロードキャストからアクティビティを開始しないでください。代わりに通知を表示することを選択してください。

    次の箇条書きは、各 Android OS バージョン (7.0 以降) に関連するブロードキャスト レシーバーの変更を示しています。バージョンごとに、特定の制限が発生し、動作も変更されています。放送受信機の使用を検討するときは、これらの制限に留意してください。

    • 7.0 以降 (API レベル 24) - Action_New_Picture と Action_New_Video の 2 つのシステム ブロードキャストが無効になりました (ただし、登録済み受信機用に Android O に戻されました)
    • 8.0 以降 (API レベル 26) - ほとんどの暗黙的なブロードキャストは、(マニフェストで) 静的ではなく動的に登録する必要があります。このリンクで、ホワイトリストに登録されたブロードキャストを見つけることができます。
    • 9.0 以降 (API レベル 28) - Wi-Fi システム ブロードキャストと Network_State_Changed_Action で受信する情報が少なくなります。

    Android O の変更点は、最も注意する必要があるものです。これらの変更が行われた理由は、パフォーマンスの問題、バッテリーの消耗、およびユーザー エクスペリエンスの低下につながるためです。これは、多くのアプリケーション (現在実行されていないものも含む) がシステム全体の変更をリッスンし、その変更が発生したときに混乱が発生したために発生しました。アクションに登録されたすべてのアプリケーションが、ブロードキャストのために何かをする必要があるかどうかを確認するために起動したと想像してください。頻繁に変化する Wi-Fi 状態などを考慮に入れると、これらの変化が発生した理由を理解し始めることができます。

    ブロードキャスト レシーバーの代替

    これらすべての制限を簡単にナビゲートできるように、ブロードキャスト レシーバーがない場合に使用できるその他のコンポーネントの内訳を以下に示します。それぞれが異なる責任とユースケースを持っているので、どれがあなたのニーズに応えるかを考えてみてください.

    • LocalBroadcastManager - 上で述べたように、これはアプリケーション内のブロードキャストに対してのみ有効です
    • ジョブのスケジューリング - 受信した信号やトリガーに応じてジョブが実行されるため、聞いていたブロードキャストがジョブに置き換えられる場合があります。さらに、 JobScheduler は、ジョブが終了することを保証しますが、さまざまなシステム要因 (時間と条件) を考慮して、いつ実行するかを決定します。ジョブを作成するとき、onStartJob というメソッドをオーバーライドします .このメソッドはメイン スレッドで実行されるため、限られた時間内に作業を終了するようにしてください。複雑なロジックを実行する必要がある場合は、バックグラウンド タスクを開始することを検討してください。さらに、このメソッドの戻り値はブール値です。true は特定のアクションがまだ実行中であることを示し、false はジョブが完了したことを示します

    放送受信機の喜びと不思議を直接体験したい場合は、私がセットアップしたリポジトリへのリンクをたどることができます:

    <オール>
  • カスタム ブロードキャスト (マニフェスト宣言あり)
  • ブロードキャストの登録 (マニフェストで宣言なし)
  • LocalBroadcastManager
  • 放送終了。


    1. 初心者のためのMicrosoftPowerPointチュートリアル

      初心者向けのこのMicrosoftPowerPointチュートリアルは、開始方法と作成方法を学ぶのに役立ちます。この投稿では、プレゼンテーションを魅力的で見栄えのするものにするための詳細とヒントを段階的に説明します。ここでは、新しいスライド、ヘッダー、フッターの追加、テーマの選択、トランジションやアニメーションの使用方法など、PowerPointのすべての基本について説明します。それでは始めましょう。 初心者向けのPowerPointチュートリアル PowerPointはMicrosoftOfficeスイートのコンポーネントであり、効果的なプレゼンテーションやコンピューターのスライドショーを

    2. 初心者のための MacBook Pro の 10 のヒント

      Macbook Pro は非常に強力なラップトップです。生産性を何倍にも向上させることができます。ただし、特に Windows 環境での作業に慣れている場合は、少し複雑になることもあります。この記事では、この洗練された最先端のアルミニウム ブロックに慣れるのに役立つ 10 の役立つヒントをまとめました。 注: 現在、この記事では macOS High Sierra を実行している 2018 年モデルを使用しているため、古い MBP モデルまたは古いバージョンの macOS を使用している場合、一部の機能にアクセスできない場合があります。 また、YouTube チャンネルで、以下の主要な