Всем нам известно, что мы регистрируем BroadcastReceiver в двух типах
1)Static Registration
2)Dynamic Registration
Но я сомневаюсь, когда нам нужно использовать Static
и когда нам нужно использовать Dynamic
?
Всем нам известно, что мы регистрируем BroadcastReceiver в двух типах
1)Static Registration
2)Dynamic Registration
Но я сомневаюсь, когда нам нужно использовать Static
и когда нам нужно использовать Dynamic
?
Как мы знаем, есть два способа зарегистрировать BroadcastReceiver
; один статический, а другой динамический.
Статический:
Динамический:
Context.registerReceiver()
для динамической регистрации экземпляра.Когда мы выполняем динамическую регистрацию (т. е. во время выполнения), она будет связана с жизненным циклом приложения. Если мы выполним статическую регистрацию (т. е. во время компиляции), а наше приложение не запущено, будет создан новый процесс для обработки трансляции.
1) Статическая регистрация
Реализация находится в манифесте, система Android может инициировать процессы и запускать ваш приемник бортовой трансляции. Например, вы хотите обновить свои данные, когда из системы поступает новое намерение или т. Д. Вам также необходимо позаботиться о проблеме безопасности.
2) Динамическая регистрация
Реализация находится в коде Java, приемник Boardcast запускается только тогда, когда ваше приложение работает до этой строки регистрации. Таким образом, вы в основном хотите использовать это, если хотите вызвать приемник бортового вещания только при определенных условиях.
Если вы хотите, чтобы ваше приложение прослушивало трансляцию, даже если приложение закрыто, используйте Static Broadcast Reciever.
Если вы хотите, чтобы ваше приложение прослушивало только определенный экземпляр (когда приложение работает), выберите Dynamic BroadCast Receiver.
Любое приложение для мониторинга батареи должно прослушивать все намерения трансляции (связанные с батареей), даже если приложение не запущено. Итак, здесь нам нужен статический
Любое приложение, использующее OTP, должно прослушивать SMS только во время работы приложения. Переходите на динамичный.
Я собираюсь показать вам разницу статических и динамических широковещательных приемников с помощью кодирования:
а) Определить пользовательский интерфейс для обоих типов приемников:
<?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>
Если ваше приложение нацелено на уровень API 26 или выше, вы не можете использовать манифест для объявления получателя для неявных широковещательных передач. За исключением этих трансляций. диспетчер пакетов системы Android регистрирует статические широковещательные приемники, когда приложение установлено и открыто в первый раз. приемники динамического вещания привязаны к жизненному циклу приложения. мы должны отменить их регистрацию в onDestroy, чтобы избежать утечек памяти.