BroadcastReceiver详解 注册 广播的种类

BroadcastReceiver详解
注册
广播的种类

静态注册

  • 新建一个Java类,继承于android.content.BroadcastReceiver,并实现他的onReceiver()方法,下面就是一个名为MBroadcast的广播接收者:
public class MyBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
    }
}
<receiver android:name=".MyBroadcast">
      <intent-filter>
      <action android:name="android.intent.action.MY_BROADCAST"/>
      <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
</receiver>

动态注册

public class MainActivity extends Activity {

    private MyBroadcast myBroadcast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myBroadcast = new MyBroadcast();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.MY_BROADCAST");
        registerReceiver(myBroadcast,filter);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myBroadcast);
    }
}

发送广播:

        Intent intent = new Intent("android.intent.action.MY_BROADCAST");
        intent.putExtra("msg","hello receiver");
        sendBroadcast(intent);

当收到广播之后,广播接收者就会执行onReveiver()方法;

广播的种类

普通广播(Normal Broadcast)

  • 普通广播对于多个接收者来说,完全是异步的,通常每个对象都无需等待即可接受到广播,接收者直接相互不会有影响,接收者无法终止广播

有序广播

  • 我们重点说说有序广播,有序广播是按一定的优先级顺序发送的(根据android:priority,最大值是int的最大值),广播一层一层的往下发送,中间可以停在向下发送(abortBroadcast(); ),下面我们创建三个广播接收者:
public class FirstBroad extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,intent.getStringExtra("msg")+1,Toast.LENGTH_SHORT).show();
        setResultData("我已经被接受过一次了");
    }
}
public class SecondBroad extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,getResultData()+intent.getStringExtra("msg")+2,Toast.LENGTH_SHORT).show();
        setResultData("我已经被接受过二次了");
        //abortBroadcast();
    }
}
public class ThirdBroad extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,getResultData()+intent.getStringExtra("msg")+3,Toast.LENGTH_SHORT).show();
    }
}
  • 注册有序广播:
<receiver android:name=".FirstBroad">
            <intent-filter android:priority="1000">
                <action android:name="android.coderwei.orderbroadcast"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".SecondBroad">
            <intent-filter android:priority="800">
                <action android:name="android.coderwei.orderbroadcast"/>
            </intent-filter>
        </receiver>

        <receiver android:name=".ThirdBroad">
            <intent-filter android:priority="500">
                <action android:name="android.coderwei.orderbroadcast"/>
            </intent-filter>
        </receiver>
  • 发送有序广播:
Intent intent = new Intent("android.coderwei.orderbroadcast");
        intent.putExtra("msg","hello receiver");
        sendOrderedBroadcast(intent,null);

其中setResultData可以向下一个广播接收者发送数据。
sendOrderedBroadcast(intent,null);中的第二个参数为null的时候,不需要接收者声明指定的权限,不为null则需要声明指定的权限,在AndroidManifest.xml中定义一个权限:

<permission android:name="permission.MY_BROADCAST_PERMISSION" />  

然后使用这个权限:

<uses-permission android:name="permission.MY_BROADCAST_PERMISSION" />  

然后null改成"permission.MY_BROADCAST_PERMISSION"