BroadcastReceiver本意是广播接收者。这个也是android四大组件之一,广播其实我们也不难理解它,打个简单的比方,比如我们上课时,只要听到下课的铃声,这说明就要下课。在安卓中,广播是全局性的,每个应用都有可能接受到。下面就学习下怎么用广播接受者:
接下来我们就学习以下知识
- 静态注册广播
- 动态注册广播
- 普通广播
- 有序广播
静态注册广播
静态注册就是在清单文件里面注册
<receiver
android:name=".MyReceiver">
<intent-filter>
<action android:name="edu.jju.broadcastreceiver">
</action>
</intent-filter>
</receiver>
动态注册广播
就是通过java代码去注册而不是在清单文件里面去配置
MyReceiver receiver=new MyReceiver();//广播接受者实例
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("edu.jju.broadcastreceiver");
registerReceiver(receiver,intentFilter);
注册广播就是这两种方式。接下来我们重点学习下普通广播跟有序广播
普通广播
1, 我么先定义一个类MyReceiver去继承BroadcastReceiver。并重写里面的方法
代码如下:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"我接受到广播啦!!!",Toast.LENGTH_SHORT).show();
}
}
当有广播时,就会调用onReceive方法
MainActivity.java代码如下:
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 这是绑定按钮添加的事件
* @param view
*/
public void send(View view) {
/*
这是通过静态注册的广播
*/
Intent intent = new Intent();
intent.setAction("edu.jju.broadcastreceiver");
sendBroadcast(intent);//发送普通广播
}
}
运行结果:
也可以通过动态注册来实现,可以不需要在清单文件配置。修改的代码如下:
/**
* 这是绑定按钮添加的事件
* @param view
*/
public void send(View view) {
MyReceiver receiver = new MyReceiver();//广播接受者实例
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("edu.jju.broadcastreceiver");
registerReceiver(receiver, intentFilter);
Intent intent = new Intent();
intent.setAction("edu.jju.broadcastreceiver");
sendBroadcast(intent);//发送普通广播
}
运行效果是一样的
有序广播
接下来我们定义四个广播来演示下 A B C D,然后它们是接收相同的广播。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="edu.jju.broadcastreceiver" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiverA">
<intent-filter>
<action android:name="edu.jju.broadcastreceiver" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiverB">
<intent-filter>
<action android:name="edu.jju.broadcastreceiver" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiverC">
<intent-filter>
<action android:name="edu.jju.broadcastreceiver" />
</intent-filter>
</receiver>
可以看到,我们是通过静态注册的方式,而且是接受相同的广播, 在每个广播接收者中打印log
然后运行:
可以看到,我们发送一条广播,广播接收者都接受到了该广播。默认的是按在清单文件注册顺序接受的。我们可以改它们的优先级
修改代码如下
<receiver android:name=".MyReceiver">
<intent-filter android:priority="100">
<action android:name="edu.jju.broadcastreceiver" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiverA">
<intent-filter android:priority="200">
<action android:name="edu.jju.broadcastreceiver" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiverB">
<intent-filter android:priority="50">
<action android:name="edu.jju.broadcastreceiver" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiverC">
<intent-filter android:priority="300">
<action android:name="edu.jju.broadcastreceiver" />
</intent-filter>
</receiver>
优先级设置为MyReceiver 100 , MyReceiverA 200 , MyReceiverB 50 , MyReceiverC 300
再运行下
可以看到优先级高的,先接收到广播
我们也可以截断这条广播,我们就在MyReceiverA 这里截断试下
修改下MyReceiverA 代码:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyReceiverA extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("TAG", " MyReceiverA 广播 ");
abortBroadcast();//截断广播
}
}
再运行下:
可以看到只有两个接收到了该广播,说明是被截断了
总结:
写的不是太好,只是讲了怎么用,我也是一名初学者。争取下次博客结合案例来写。
源码下载
https://github.com/songshuilin/AndroidForBlog/tree/master/androidforbroadcastreceiver