Динамическая регистрация и статическая регистрация BroadcastReceiver

Мы все знаем, что мы регистрируем BroadcastReceiver в двух типах

1)Static Registration

2)Dynamic Registration

Но я сомневаюсь, когда нам нужно использовать Static, и когда нам нужно использовать Dynamic?

Ответ 1

Как известно, существует два способа зарегистрировать BroadcastReceiver; один статический, а другой динамический.

Static

  • Использовать тег в файле манифеста. (AndroidManifest.xml)
  • Не все события могут быть зарегистрированы статически.
  • Для некоторых событий требуются разрешения.

Динамический:

  • Используйте Context.registerReceiver() для динамической регистрации экземпляра.
  • Примечание. Отмените регистрацию при приостановке.

Когда мы делаем динамическую регистрацию (т.е. во время выполнения), она будет связана с жизненным циклом приложения. Если мы сделаем это статическая регистрация (т.е. Во время компиляции), и наше приложение не будет запущено, для обработки широковещательной передачи будет создан новый процесс.

Ответ 2

1) Статическая регистрация

Реализация в манифесте, система Android может инициировать процессы и запускать приемник приемника. Один пример, например, вы хотите обновить свои данные, когда новое намерение приходит из системы или т.д. Вам также необходимо решить проблему безопасности.

2) Динамическая регистрация

Реализация выполняется в Java-коде, приемщик приемника запускается только тогда, когда ваше приложение работает до этой регистрационной строки. Таким образом, вы, в основном, хотите использовать это, если хотите только принести приемник бортового вещания с определенными условиями.

Ответ 3

Я собираюсь показать вам разные статические и динамические широковещательные приемники с помощью кодирования:

a) Определите пользовательский интерфейс для обоих типов получателей:

     <?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>

Ответ 4

Самый простой способ решить:

Если вы хотите, чтобы ваше приложение прослушивало широковещательную передачу, даже если приложение закрыто, выберите Static Broadcast Reciever.

Если вы хотите, чтобы ваше приложение прослушивалось только для определенного экземпляра (когда приложение запущено), перейдите к Dynamic BroadCast Receiver.

Пример:

Любое приложение для мониторинга батареи Приложение должно прослушивать все трансляции (связанные с батареей), даже если приложение не работает. Итак, здесь нам нужен Static

Любое приложение, использующее OTP, должно слушать Sms только тогда, когда приложение запущено. Пойдите для динамического.