Androidプロセス間通信のBroadcast


前言


Androidシステムではアプリケーション間でメモリを共有できないためです.そのため、異なるアプリケーション間でデータをインタラクティブに(プロセス間通信)するのは少し面倒です.
プロセス間通信のための4つの方法がandroid SDKにおいて提供されている.この4つの方法はandroidシステムの4つのアプリケーションコンポーネント:Activity、Content Provider、Broadcast、Serviceに対応しています.
  • Activityは、プロセス間で他のアプリケーションのActivityを呼び出すことができる.
  • Content Providerは、プロセス間で他のアプリケーションのデータ(Cursorオブジェクトとして返される)にアクセスできます.もちろん、他のアプリケーションのデータを追加、削除、変更することもできます.
  • Broadcastはandroidシステム内のすべてのアプリケーションにブロードキャストを送信することができ、プロセス間通信を必要とするアプリケーションはこれらのブロードキャストを傍受することができる.
  • ServiceはContent Providerと同様に、他のアプリケーションのデータにもアクセスできますが、Content ProviderはCursorオブジェクト、
  • を返します.
  • Serviceは、プロセス間で通信可能なAIDLサービスというJavaオブジェクトを返します.

  • に質問


    私の同級生は2つのアプリケーションで通信する問題に遭遇しました.次はこの問題を解決するためにまとめます.
    このような彼らの会社には2つの異なるアプリケーションが通信を必要としています.ここでは放送方式で実現します.彼のブロードキャストはAndroidManifestに静的に登録されています.プログラムが実行されていないときに何かをする必要があるからです.また、アプリケーションが実行されているときにUIを動的に更新する必要がある場合は、問題です.

    解決する


    最初の質問は、BroadcastReceiverのonReceiveではUIをまったく取得できないオブジェクトで、普段はBroadcastReceiverを書くのはActivityで直接書いているので、パラメータを渡す必要があります.
    私のところはインタフェースの形式で実現しています.まず、ブロードキャスト受信機から送信されたコンテンツであるインタフェースを定義します.ここでは、テキストを設定します.
    /** * @category XXX  * * @author ylbf * @version 2016-02-17 17:15:52 */
    public interface BRInteraction {
        /** * * @param content *   */
        public void setText(String content);
    }

    ここではUSBを挿抜して充電状態の放送をトリガし、別のアプリケーションが送信する放送をシミュレートします.そしてデータをインタフェースを介して送信します.同時にToastがポップアップされ、アプリケーションがブロードキャスト受信機を終了してもまだ動作していることを証明する.
    public class PowerConnectionReceiver extends BroadcastReceiver {
        private BRInteraction brInteraction;
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
            boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
            boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
            Toast.makeText(context, "USB :" + usbCharge, Toast.LENGTH_SHORT).show();
            if (brInteraction != null) {
                brInteraction.setText("USB :" + usbCharge);
            }
        }
    
        public void setBRInteractionListener(BRInteraction brInteraction) {
            this.brInteraction = brInteraction;
        }
    }

    次はAndroidManifestファイルに静的に登録することを忘れないでください.
            <receiver android:name=".PowerConnectionReceiver" >
                <intent-filter>
                    <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
                intent-filter>
            receiver>

    この段階でこのブロードキャスト受信機は半分完了し、アプリケーションを起動すると、このブロードキャスト受信機がこのToastをポップアップして充電の状態を表示できるように動作できることがわかります.以下はActivityに登録されているリスナーのコードです.ここではUIのTextViewの内容を変更します.
        /** *   * * @param textView */
        private void regListener(final TextView textView) {
            PowerConnectionReceiver powerConnectionReceiver = new PowerConnectionReceiver();
            powerConnectionReceiver.setBRInteractionListener(new BRInteraction() {
    
                @Override
                public void setText(String content) {
                    if (content != null) {
                        textView.setText(content);
                    }
                }
            });
        }

    アプリケーションのUSB挿抜を起動した後、Toastが正常にポップアップされていることを確認したが、UIのTextViewは変わっていない.Activity呼び出しonReceiveメソッドではbrInteractionがNULLであることがデバッグで分かったため、UIの消去メソッドは実行されなかった.この方法はまだ足りないようだ.
    次に、UIインタフェースにブロードキャスト受信機を登録してみます.
    /** *   * * @param textView */
        private void regListenerAndReceiver(final TextView textView) {
            IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
            PowerConnectionReceiver powerConnectionReceiver = new PowerConnectionReceiver();
            registerReceiver(powerConnectionReceiver, intentFilter);
            powerConnectionReceiver.setBRInteractionListener(new BRInteraction() {
    
                @Override
                public void setText(String content) {
                    if (content != null) {
                        textView.setText(content);
                    }
                }
            });
        }

    Androidブロードキャストの動的および静的登録に関する小さな知識


    Androidのブロードキャストは静的登録と動的登録の2つの方式に分けられ,具体的な操作方式はネット上で非常に多くのケースがある.ここでは主に彼らの特殊な小さな知識を記録します.
    1.動的登録と静的登録は同時に行うことができ、簡単に言えば、1つのReceiverを使用してそれぞれAndroidManifastに登録し、プログラムに書き込みコードで登録する(Actionが同じかどうかにかかわらず)、2つの登録方式は影響を与えない.動的登録はプログラムが存在する場合にのみ実行され、静的登録は常に実行されます.全く同じReceiverでも.すなわち、プログラムが存在する場合、Receiverは2回実行される.
    2.動的登録同じReceiverオブジェクトを使用して、作成を開始してから登録を解除します.このブロードキャストが何回トリガーされても、同じReceiverが使用されます.静的登録ではトリガのたびに新しいReceiverオブジェクトが作成されます.
    3.android.intent.action.SCREEN_ONandroid.intent.action.SCREEN_OFFは静的登録は使用できません(効果がありません)、動的登録の方式を使用する必要があります.androidの内部管理メカニズムのためか、プログラムが実行されていない間も画面の監視を維持したくない.