Android基础知识梳理-四大组件之BroadcastReceiver

定义 Broadcast(广播):一种广泛应用在应用程序之间传输信息的机制;
BroadcastReceiver(广播接收器):用于接收来自系统和其他应用的广播,并对其进行响应的组件。
注册 1.定义广播接收者
继承BroadcastReceiver,实现自定义的广播接收者,实现onReceive()方法用于接受广播

public class ExampleBroadcastReceiver extends BroadcastReceiver { private static final String TAG = ExampleBroadcastReceiver.class.getSimpleName(); private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED"; @Override public void onReceive(Context context, Intent intent) { if (ACTION_BOOT.equals(intent.getAction())) { Log.i(TAG, "receive boot completed broadcast"); Toast.makeText(context, "system boot completed.", Toast.LENGTH_LONG).show(); } } }

onReceive()方法执行完成之后,ExampleBroadcastReceiver生命周期结束可能会被系统回收,所以onReceive()中不建议进行异步操作;另外,由于ANR限制,onReceive()方法必须在10秒内执行完成。
2.静态注册
在AndroidManifest.xml中注册

  • 静态方式注册广播,即使应用未启动,也能接收到广播,所以可以利用广播作为应用的自启动和保活机制。
  • android:name:表示自定义的广播接收者类
  • action:指定了接收的广播类型,这里表示接受系统开机启动广播
  • uses-permission:声明我们需要使用到接收开机状态的权限
3.动态注册
public class ExampleActivity extends AppCompatActivity { private ExampleBroadcastReceiver myReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver = new ExampleBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.BOOT_COMPLETED"); registerReceiver(myReceiver, filter); }@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(myReceiver); } }

  • 在Activity的onCreate()中通过registerReceiver注册广播,并指定监听的广播类型;最后在onDestory()中关掉广播监听
  • 动态方式注册广播,用户可以在需要使用时进行注册,不再使用后关闭掉广播监听,使用上更为灵活
分类 广播可以分为无序广播(默认)、有序广播、本地广播和粘性(Sticky)广播。
无序广播
无序广播是一种异步执行方式,所有广播接收者几乎都能同时接收到该广播,没有先后顺序,直到没有接收者再接受广播则广播结束。
  • 发送广播
    public void sendCustomBroadcast(View view){ Intent intent = new Intent("com.example.broadcast"); sendBroadcast(intent); }

有序广播
有序广播是一种同步执行方式,广播发送之后,同一时刻只会有一个广播接收者在执行广播接收,广播执行者按照优先级顺序进行广播接收,而且在接收的过程中可以截断广播,后面的接收者就无法再接收到该广播。
  • 声明广播接收者优先级

    IntentFilter中通过android:priority指定优先级,值越大优先级越高
  • 发送广播
    public void sendOrderBroadcast(View view){ Intent intent = new Intent("com.example.broadcast"); sendOrderBroadcast(intent); }

  • 截断广播
    @Override public void onReceive(Context context, Intent intent) { abortBroadcast(); }

    在广播接收者的onReceive()方法中,可以通过调用abortBroadcast()方法截断广播,优先级较低的广播接收者就无法再接收到该广播
本地广播
本地广播是一种局部广播,只能在本应用内部传播,广播接收者也只能接收本应用内部的广播,由于这一特点,所以本地广播不支持静态注册方式。
  • 注册本地广播接收者
    public class ExampleActivity extends AppCompatActivity { private ExampleBroadcastReceiver myReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver = new ExampleBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.BOOT_COMPLETED"); localBroadcastManager = LocalBroadcastManager.getInstance(this); localBroadcastManager.registerReceiver(intent, filter); }@Override protected void onDestroy() { super.onDestroy(); localBroadcastManager.unregisterReceiver(myReceiver); } }

    通过LocalBroadcastManager.getInstance()或者本地广播管理的实例,使用该实例来注册广播接收者
  • 发送广播
    private void sendBroadcast() { Intent intent = new Intent("com.example.broadcast"); localBroadcastManager.sendBroadcast(intent); }

粘性广播
【Android基础知识梳理-四大组件之BroadcastReceiver】前面了解了几种广播类型,我们可以知道,当所有广播接收者处理完广播接收之后则广播结束。也就是说,只有在发送前已完成注册的广播接收者才能接收到该广播。那么如果我们在某种情况下,广播接收者注册晚于广播发送时间,但是我们又想接收到该广播,该如何处理呢?这里就需要使用到粘性广播。
  • 粘性广播在发送之后会保存刚发送过的广播,当有新注册的广播接收者注册后可以继续使用该广播,直到该广播被移除;
  • 粘性广播只会保存最后一次的广播,也就是说如果在某个广播接收者注册前,发送了多条同样的广播,那么广播接收者注册后只能接收到最后一条;
  • 粘性广播通过sendStickyBroadcast()发送广播,removeStickyBroadcast()移除广播,且需要添加权限

    推荐阅读