私たち全員が登録していることを知っていますBroadcastReceiver 2つのタイプで
1)Static Registration
2)Dynamic Registration
しかし、私の疑問は、いつStatic
を使用する必要があるのか、いつDynamic
を使用する必要があるのかということです。
ご存知のとおり、BroadcastReceiver
を登録する方法は2つあります。 1つは静的で、もう1つは動的です。
静的:
動的:
Context.registerReceiver()
を使用して、インスタンスを動的に登録します。動的登録(つまり実行時)を実行すると、アプリのライフサイクルに関連付けられます。それを行う場合静的登録(つまりコンパイル時)でアプリが実行されていない場合、ブロードキャストを処理するための新しいプロセスが作成されます。
1)静的登録
実装はマニフェストにあります、Androidシステムはプロセスを開始し、ボードキャストレシーバーを実行できます。システムなどから新しいインテントが入ったときにデータを更新したいなどの1つの例。ケアセキュリティの問題も。
2)動的登録
実装はJavaコードで、ボードキャストレシーバーは、アプリがその登録ラインまで実行されている場合にのみ実行されます。したがって、ボードキャストレシーバーを特定の状態で起動する場合にのみ、これを使用することがほとんどです。条件。
アプリが閉じていてもアプリにブロードキャストを聴かせたい場合は、静的ブロードキャスト受信機に進みます。
アプリが特定のインスタンスのみをリッスンするようにしたい場合(アプリが実行されている場合)、Dynamic BroadCast Receiverに進みます。
バッテリー監視アプリは、アプリが実行されていない場合でも、(バッテリーに関連する)すべてのブロードキャストインテントをリッスンする必要があります。したがって、ここでは静的が必要です
OTPを使用するアプリは、アプリの実行中にのみSMSをリッスンする必要があります。ダイナミックに行きましょう。
コーディングを介して、静的放送受信機と動的放送受信機の違いを紹介します。
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>