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