Android 静态注册广播接收者和动态注册广播接收者(Android8.0之前和之后)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 静态注册广播接收者和动态注册广播接收者(Android8.0之前和之后)相关的知识,希望对你有一定的参考价值。

前言:广播接收者的特点和作用:

Android


相关的API如下

Android


发送广播的两种类型

Android

有序广播与一般广播的理解

Android

一、静态注册广播接收者步骤:

Android

1.布局页面:

<Button
android:layout_
android:layout_
android:id="@+id/btn_static"
android:layout_marginLeft="5dp"
android:text="静态注册发送广播"
/>
<Button
android:layout_
android:layout_
android:id="@+id/btn_dynamic"
android:layout_marginLeft="5dp"
android:text="动态注册发送广播"
/>

2.创建广播接收者StaticReceiver:

public class StaticReceiver extends BroadcastReceiver 
private static final String TAG = "StaticReceiver";
@Override
public void onReceive(Context context, Intent intent)
Log.e(TAG, "静态注册的广播接收者" );

3.在清单文件中注册广播接收者

<!--静态注册广播接收者-->
<receiver android:name=".StaticReceiver">
<intent-filter>
<action android:name="com.example.day_static"/>
</intent-filter>
</receiver>

4.创建一个接口ActionUtils,定义广播注册与发送广播的唯一标识:

public interface ActionUtils 
//广播注册时与发送广播时的唯一标识,必须要保持一致(静态注册)
String ACTION_FLAG="com.example.day_static";
//广播注册时与发送广播时的唯一标识,必须要保持一致(动态注册)
String ACTION_UPDATE_IP="com.example.day_dynamic";

5.点击按钮发送广播:

//静态发送广播给接收者
Intent intent = new Intent();
//ActionUtils.ACTION_FLAG与注册时保持一致
intent.setAction(ActionUtils.ACTION_FLAG);
sendBroadcast(intent);

结果会输出日志:

Android


二、动态注册广播接收者步骤:

1.创建广播接收者

public class DynamicReceiver extends BroadcastReceiver 
private static final String TAG = "DynamicReceiver";
@Override
public void onReceive(Context context, Intent intent)
Log.e(TAG, "onReceive: 动态注册广播接收者" );

2.在onCreate中动态注册广播接收者:

//使用java代码动态注册广播接收者
DynamicReceiver dynamicReceiver = new DynamicReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ActionUtils.ACTION_UPDATE_IP);
registerReceiver(dynamicReceiver,filter);

3.点击按钮发送广播:

Intent intent = new Intent();
intent.setAction(ActionUtils.ACTION_UPDATE_IP);
sendBroadcast(intent);

输出日志为:

Android

静态注册广播与动态注册广播的区别:

Android

注意:

在Android8.0 Oreo(API级别26)之前,配置清单文件中注册的Receiver可以通过包含intent-filter标签来指定支持监听隐式广播的动作。
但是,这会引起相关的资源使用风险,如果频繁地广播Intent,则可能会导致应用被重复唤醒,从而导致大量的的电池消耗。
为了最小化这种风险,Android8.0不再支持在配置清单中注册任意隐式Intent的Receiver。
但是少数特殊的系统广播仍然允许使用静态注册的方式来接收。
在这些特殊的系统广播中,有一条值为android.intent.action.BOOT_COMPLETED的广播,这是一条开机广播。

还有其他的一些特殊广播如下

​https://developer.android.com/guide/components/broadcast-exceptions.html​

所以我们只能通过在配置清单中注册显示广播。

比如 配置清单文件注册广播:

<receiver android:name=".receiver.TestReceiver"/>

在java文件中通过Intent在组件之间广播消息

Intent intent = new Intent(BroadCastTest1Activity.this, TestReceiver.class);
sendBroadcast(intent);

具体的实例

一、应用A,广播接收者的注册与实现

1、在应用A中进行动态广播的注册,具体代码如下

public class MainActivity extends AppCompatActivity 
private MyReceiver2 myReceiver2;
private TimeChangeReceiver timeChangeReceiver;

@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


//注册广播接收器
public void register(View view)
if (myReceiver2 == null)
//创建receiver对象
myReceiver2 = new MyReceiver2();
//创建过滤对象
IntentFilter filter = new IntentFilter("com.example.broadreceiver.MyReceiver1.action");
//注册receiver
registerReceiver(myReceiver2, filter);
Toast.makeText(this, "注册广播接收器", Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "已经注册广播接收器", Toast.LENGTH_SHORT).show();




//解注册广播接收器
public void sendRegister(View view)
if (myReceiver2 != null)
unregisterReceiver(myReceiver2);
Toast.makeText(this, "解注册广播接收器", Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "还未注册广播接收器", Toast.LENGTH_SHORT).show();



@Override
protected void onDestroy()
super.onDestroy();
//在Activity销毁之前,要解注册广播
if (myReceiver2 != null)
unregisterReceiver(myReceiver2);
myReceiver2 = null;



//动态注册广播,能够监听时间变化,一分钟系统会发一次广播
//之后TimeChangeReceiver()类中的onReceiver()方法,就会得到执行
public void timeReceiver(View view)
if (timeChangeReceiver == null)
timeChangeReceiver = new TimeChangeReceiver();
IntentFilter filter = new IntentFilter("android.intent.action.TIME_TICK");
registerReceiver(timeChangeReceiver, filter);


2、对应的广播接收者类如下

MyReceiver2 类

/**
* 动态注册的receiver
*/
public class MyReceiver2 extends BroadcastReceiver
public MyReceiver2()
Log.i("TAG", "MyReceiver2() ");


@Override
public void onReceive(Context context, Intent intent)
Bundle bundle = intent.getExtras();
//接收发送广播方,传来的信息
String action = bundle.getString("action");
Log.i("TAG", "onReceive2() " + action);

TimeChangeReceiver 类

public class TimeChangeReceiver extends BroadcastReceiver 
@Override
public void onReceive(Context context, Intent intent)
Log.i("TAG", "onReceive() " + "时间改变");

二、应用B,广播的发送

应用B中的发送广播,广播发出后,应用A的广播接收者MyReceiver2,就可以监听到该广播信息,回调onReceiver()方法。

public class BroadCastActivity extends AppCompatActivity 

@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broad_cast);


//发送一般广播
public void sendNormalBC(View view)
Intent intent = new Intent("com.example.broadreceiver.MyReceiver1.action");
intent.putExtra("action", "gaogao");
sendBroadcast(intent);
Toast.makeText(this, "发送一般广播!", Toast.LENGTH_SHORT).show();

广播发出后,应用A打出日志

Android


以上是关于Android 静态注册广播接收者和动态注册广播接收者(Android8.0之前和之后)的主要内容,如果未能解决你的问题,请参考以下文章

Android--静态广播和动态广播的区别

12、注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。

广播机制之动态注册和静态注册

Android 第六讲 广播接收器和服务

Android中BroadcastReceiver的两种注册方式(静态和动态)详解

Android深入四大组件广播的注册发送和接收过程