web-dev-qa-db-ja.com

BroadcastReceiverの動的登録と静的登録

私たち全員が登録していることを知っていますBroadcastReceiver 2つのタイプで

1)Static Registration

2)Dynamic Registration

しかし、私の疑問は、いつStaticを使用する必要があるのか​​、いつDynamicを使用する必要があるのか​​ということです。

18
Krishna

ご存知のとおり、BroadcastReceiverを登録する方法は2つあります。 1つは静的で、もう1つは動的です。

静的:

  1. マニフェストファイルでタグを使用します。 (AndroidManifest.xml)
  2. すべてのイベントを静的に登録できるわけではありません。
  3. 一部のイベントには権限が必要です。

動的:

  1. Context.registerReceiver()を使用して、インスタンスを動的に登録します。
  2. 注:一時停止する場合は登録を解除してください。

動的登録(つまり実行時)を実行すると、アプリのライフサイクルに関連付けられます。それを行う場合静的登録(つまりコンパイル時)でアプリが実行されていない場合、ブロードキャストを処理するための新しいプロセスが作成されます。

16
Jitesh Upadhyay

1)静的登録

実装はマニフェストにあります、Androidシステムはプロセスを開始し、ボードキャストレシーバーを実行できます。システムなどから新しいインテントが入ったときにデータを更新したいなどの1つの例。ケアセキュリティの問題も。

2)動的登録

実装はJavaコードで、ボードキャストレシーバーは、アプリがその登録ラインまで実行されている場合にのみ実行されます。したがって、ボードキャストレシーバーを特定の状態で起動する場合にのみ、これを使用することがほとんどです。条件。

決定する最も簡単な方法は次のとおりです。

アプリが閉じていてもアプリにブロードキャストを聴かせたい場合は、静的ブロードキャスト受信機に進みます。

アプリが特定のインスタンスのみをリッスンするようにしたい場合(アプリが実行されている場合)、Dynamic BroadCast Receiverに進みます。

例:

バッテリー監視アプリは、アプリが実行されていない場合でも、(バッテリーに関連する)すべてのブロードキャストインテントをリッスンする必要があります。したがって、ここでは静的が必要です

OTPを使用するアプリは、アプリの実行中にのみSMSをリッスンする必要があります。ダイナミックに行きましょう。

4
Puneet Verma

コーディングを介して、静的放送受信機と動的放送受信機の違いを紹介します。

a)両方の種類の受信者のUIを定義します。

     <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    tools:context="com.broadcastreceiverdemo.MainActivity">

    <LinearLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:onClick="registerBroadcastReceiverDynamically"
            Android:text="Register Broadcast Receiver Dynamically" />

        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:onClick="sendUsingDynamicallyRegisteredBroadcastReceiver"
            Android:text="Send Broadcast Msg Dynamically" />
    </LinearLayout>


    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:onClick="sendUsingStaticallyRegisteredBroadcastReceiver"
        Android:text="Send Broadcast Statically"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</RelativeLayout>

b)DynamicBroadcastReceiver.Java

 public class DynamicBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Dynamic Broadcast", Toast.LENGTH_SHORT).show();
}

}

c)StaticBroadcastReceiver.Java

public class StaticBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Static Broadcast", Toast.LENGTH_SHORT).show();
}

}

d)MainActivity.Java

 public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
//////////////////=================Starts Dynamic Broadcast Receiver
DynamicBroadcastReceiver dynamicBroadcastReceiver = new DynamicBroadcastReceiver();

public void registerBroadcastReceiverDynamically(View view) {
    IntentFilter filter = new IntentFilter();
    filter.addAction("MY_BROADCAST");
    registerReceiver(dynamicBroadcastReceiver, filter);
}

public void sendUsingDynamicallyRegisteredBroadcastReceiver(View view) {
    Intent i = new Intent();
    i.setAction("MY_BROADCAST");
    sendBroadcast(i);
}

@Override
protected void onDestroy() {
    if (dynamicBroadcastReceiver != null) {
        unregisterReceiver(dynamicBroadcastReceiver);
    }
    super.onDestroy();
}

//////////////////=================Ends Dynamic Broadcast Receiver


//////////////////=================Starts Static Broadcast Receiver
public void sendUsingStaticallyRegisteredBroadcastReceiver(View view) {
    Intent i = new Intent();
    i.setAction("MY_BROADCAST_STATIC");
    sendBroadcast(i);
}

}

e)マニフェストファイル:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.broadcastreceiverdemo">

    <application
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:roundIcon="@mipmap/ic_launcher_round"
        Android:supportsRtl="true"
        Android:theme="@style/AppTheme">
        <activity Android:name=".MainActivity">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver Android:name=".DynamicBroadcastReceiver">

        </receiver>
        <receiver Android:name=".StaticBroadcastReceiver">
            <intent-filter>
                <action Android:name="MY_BROADCAST_STATIC" />

            </intent-filter>
        </receiver>
    </application>

</manifest>
1