Динамическая регистрация против статической регистрации BroadcastReceiver

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

1)Static Registration

2)Dynamic Registration

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


person Krishna    schedule 23.04.2014    source источник
comment
возможный дубликат регистра широковещательного приемника в манифесте и активности   -  person nKn    schedule 23.04.2014
comment
vogella.com/tutorials/AndroidBroadcastReceiver/article.html перейдите по этой ссылке. Статический в основном используется, когда вы хотите постоянно слушать событие, а динамический может использоваться, когда один из экранов вашего приложения открыт и отменяет регистрацию этого приемника после закрытия приложения.   -  person Gautami    schedule 23.04.2014


Ответы (5)


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

Статический:

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

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

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

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

person Jitesh Upadhyay    schedule 23.04.2014

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

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

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

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

person phdfong - Kenneth Fong    schedule 22.06.2015
comment
Очень важная деталь. Кроме того, благодаря динамическому вещанию у вас будет возможность включать и выключать его в зависимости от жизненного цикла вашего компонента. - person stdout; 07.10.2016

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

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

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

пример:

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

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

person Puneet Verma    schedule 12.02.2018
comment
Вы не можете зарегистрировать приемники в манифесте для большинства неявных трансляций (например, намерений, связанных с батареей) на Android 8 и новее из-за [developer.android.com/about/versions/oreo/ ограничения выполнения). - person mike47; 29.04.2019

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

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

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

б) DynamicBroadcastReceiver.java

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

}

в) StaticBroadcastReceiver.java

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

}

г) 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);
}

}

д) Файл манифеста:

<?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>
person Vishambar Pandey    schedule 17.10.2017

Если ваше приложение нацелено на уровень API 26 или выше, вы не можете использовать манифест для объявления получателя для неявных широковещательных передач. За исключением этих трансляций. диспетчер пакетов системы Android регистрирует статические широковещательные приемники, когда приложение установлено и открыто в первый раз. приемники динамического вещания привязаны к жизненному циклу приложения. мы должны отменить их регистрацию в onDestroy, чтобы избежать утечек памяти.

person Ehsan souri    schedule 28.12.2020