前言:广播接收者的特点和作用:
相关的API如下
发送广播的两种类型
有序广播与一般广播的理解
一、静态注册广播接收者步骤:
1.布局页面:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_static" android:layout_marginLeft="5dp" android:text="静态注册发送广播" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" 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);
结果会输出日志:
二、动态注册广播接收者步骤:
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);
输出日志为:
静态注册广播与动态注册广播的区别:
注意:
在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打出日志