一、静态注册对广播接收器实例创建的影响
1、基本介绍
- 静态注册的广播接收器,每次发送广播,都会新建一个广播接收器实例
2、演示
(1)Receiver
- TestReceiver.java
publicclassTestReceiverextendsBroadcastReceiver{publicstaticfinalStringTAG=TestReceiver.class.getSimpleName();@OverridepublicvoidonReceive(Contextcontext,Intentintent){Log.i(TAG,"收到内容 - "+this);}}- AndroidManifest.xml
<receiverandroid:name=".mybroadcast.TestReceiver"android:exported="false"/>(2)Activity
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送广播"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>- MainActivity.java
publicclassMainActivityextendsAppCompatActivity{publicstaticfinalStringTAG=MainActivity.class.getSimpleName();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButtonbtnSend=findViewById(R.id.btn_send);btnSend.setOnClickListener(v->{Intentintent=newIntent();ComponentNamecomponent=newComponentName(this,TestReceiver.class);intent.setComponent(component);sendBroadcast(intent);});}}(3)Test
- 第 1 次点击按钮,发送广播,输出结果如下
收到内容 - com.my.broadcast.mybroadcast.TestReceiver@1a66a22- 第 2 次点击按钮,发送广播,输出结果如下
收到内容 - com.my.broadcast.mybroadcast.TestReceiver@58d710f二、动态注册对广播接收器实例创建的影响
1、基本介绍
- 动态注册的广播接收器,每次发送广播,只有一个广播接收器实例
2、演示
(1)Receiver
publicclassTestReceiverextendsBroadcastReceiver{publicstaticfinalStringTAG=TestReceiver.class.getSimpleName();publicstaticfinalStringACTION=TAG;@OverridepublicvoidonReceive(Contextcontext,Intentintent){Log.i(TAG,"收到内容 - "+this);}}(2)Activity
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送广播"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>- MainActivity.java
publicclassMainActivityextendsAppCompatActivity{publicstaticfinalStringTAG=MainActivity.class.getSimpleName();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TestReceiverreceiver=newTestReceiver();IntentFilterintentFilter=newIntentFilter(TestReceiver.ACTION);registerReceiver(receiver,intentFilter);ButtonbtnSend=findViewById(R.id.btn_send);btnSend.setOnClickListener(v->{Intentintent=newIntent();intent.setAction(TestReceiver.ACTION);sendBroadcast(intent);});}}(3)Test
- 第 1 次点击按钮,发送广播,输出结果如下
收到内容 - com.my.broadcast.mybroadcast.TestReceiver@6458b62- 第 2 次点击按钮,发送广播,输出结果如下
收到内容 - com.my.broadcast.mybroadcast.TestReceiver@6458b62三、在 Application 中动态注册
1、基本介绍
- 在 Application 的 onCreate 方法中采用动态注册来注册广播接收器,只会创建一个广播接收器实例
2、演示
(1)Receiver
publicclassTestReceiverextendsBroadcastReceiver{publicstaticfinalStringTAG=TestReceiver.class.getSimpleName();publicstaticfinalStringACTION=TAG;@OverridepublicvoidonReceive(Contextcontext,Intentintent){Log.i(TAG,"收到内容 - "+this);}}(2)Application
- MyApplication.java
publicclassMyApplicationextendsApplication{privateTestReceivertestReceiver;@OverridepublicvoidonCreate(){super.onCreate();testReceiver=newTestReceiver();IntentFilterfilter=newIntentFilter(TestReceiver.ACTION);registerReceiver(testReceiver,filter);}}(3)Activity
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送广播"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>- MainActivity.java
publicclassMainActivityextendsAppCompatActivity{publicstaticfinalStringTAG=MainActivity.class.getSimpleName();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButtonbtnSend=findViewById(R.id.btn_send);btnSend.setOnClickListener(v->{Intentintent=newIntent();intent.setAction(TestReceiver.ACTION);sendBroadcast(intent);});}}(4)Test
- 第 1 次点击按钮,发送广播,输出结果如下
收到内容 - com.my.broadcast.mybroadcast.TestReceiver@332c7bc- 第 2 次点击按钮,发送广播,输出结果如下
收到内容 - com.my.broadcast.mybroadcast.TestReceiver@332c7bc四、在 Activity 中动态注册
1、基本介绍
如果在 Activity 中采用动态注册来注册广播接收器,需要在合适的时机注销广播接收器,否则会创建多个广播接收器实例
如果存在多个广播接收器实例,它们会同时接收广播
2、多个广播接收器实例
(1)Receiver
publicclassTestReceiverextendsBroadcastReceiver{publicstaticfinalStringTAG=TestReceiver.class.getSimpleName();publicstaticfinalStringACTION=TAG;@OverridepublicvoidonReceive(Contextcontext,Intentintent){Log.i(TAG,"收到内容 - "+this);}}(2)Activity
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送广播"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>- MainActivity.java
publicclassMainActivityextendsAppCompatActivity{publicstaticfinalStringTAG=MainActivity.class.getSimpleName();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);registerReceiver(newTestReceiver(),newIntentFilter(TestReceiver.ACTION));registerReceiver(newTestReceiver(),newIntentFilter(TestReceiver.ACTION));ButtonbtnSend=findViewById(R.id.btn_send);btnSend.setOnClickListener(v->{Intentintent=newIntent();intent.setAction(TestReceiver.ACTION);sendBroadcast(intent);});}}(3)Test
- 第 1 次点击按钮,发送广播,输出结果如下
收到内容 - com.my.broadcast.mybroadcast.TestReceiver@6458b62 收到内容 - com.my.broadcast.mybroadcast.TestReceiver@be064f3- 第 2 次点击按钮,发送广播,输出结果如下
收到内容 - com.my.broadcast.mybroadcast.TestReceiver@6458b62 收到内容 - com.my.broadcast.mybroadcast.TestReceiver@be064f3