Android的广播机制

广播的应用场景:

  • 同一app内部的同一组件内的消息通信(单个或多个线程之间)
  • 同一app内部的不同组件之间的消息通信
  • 同一app具有多个线程的不同组件之间的消息通信
  • 不同app之间的组建之间消息通信
  • Android系统在特定情况下与App之间的消息通信

广播分为两种:

  • 有序广播
  • 类似于击鼓传花的游戏,游戏开始时发送广播,每个游戏者就是广播接收器,依次向下传递,只能由前一个游戏者传递给下一个游戏者。若某一个游戏者的花掉了,这就是广播截断,广播就不能继续传下去
  • 无序广播
  • 类似于老师宣布下课,学生就是广播接收者,基本都是按照同一时间执行某些操作

广播的使用,需要继承BroadcastReceiver并实现抽象方法

1
2
3
4
5
6
public class MyBroadcast  extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context, "收到广播,执行onReceiver()方法", Toast.LENGTH_LONG).show();
}
}

当BroadcastReceiver作为Android的四大组件之一,在使用时,必须对BroadcastReceiver进行注册
注册方式分为两种:

  • 静态注册

    • 类似于Activity,自定义广播接收器之后,在AndroidManifest.xml中注册即为静态注册
    1
    2
    3
    4
    5
    <receiver android:name=".MyBroadcast">
    <intent-filter>
    <action android:name="io.innofang.broadcastdemo.MYBROADCAST"/>
    </intent-filter>
    </reveiver>

    其中action类似于显示广播的频段,当广播发送的时候需要指定后面的字符串。接收器接收的时候,也会根据该处指定的字符串进行过滤

  • 动态注册

    • 动态注册,即在java代码中进行注册,也就是程序启动后,执行到注册的代码才会注册成功,并且动态注册的广播需要接触注册
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      public class MainActivity extends AppCompatActivity {
      private static final String MY_ACTION = "io.innofang.broadcastdemo.MYBROADCAST";
      private MyBroadcast mMyBroadcast;
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final Intent intent = new Intent(MY_ACTION);
      // 初始化广播接收器
      mMyCast = new MyBroadcast();
      // 初始化过滤器,对应Manifest文件中的receiver的字段
      IntentFilter filter = new IntentFilter();
      // 在过滤器中添加action
      filter.addAction(MY_ACTION);
      // 注册广播接收器
      registerReceiver(mMyCast, filter);
      }

      protected void onDestroy(){
      super.onDestroy();
      // 在onDestroy中取消注册
      unregisterReceiver(mMyCast);
      }
      }

区别:

  • 动态注册的广播接收者要优先于静态注册的广播接收者
  • 当程序被销毁掉之后,静态注册的广播接收者任然可以接受到广播,但是动态注册的广播接收者则不可以
Author: Inno Fang
Link: http://innofang.github.io/2017/01/12/Android%E7%9A%84%E5%B9%BF%E6%92%AD%E6%9C%BA%E5%88%B6/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-ND 4.0 unless stating additionally.