一. 广播接收器的两种注册方法
1. 静态注册
在 AndroidManifest.xml 中注册,这种注册方法只要 APP 安装了,广播接收器就会一直存在。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.geek99.MY_BR"/>
</intent-filter>
</receiver>
在代码中如何接收和发送广播
// 广播接收器
public class MyReceiver extends BroadcastReceiver {
// 接收广播
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"消息来啦!",Toast.LENGTH_SHORT).show();
}
}
// Activity 发送广播
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 静态注册,发送广播
public void send(View view) {
// Intent intent = new Intent(this, MyReceiver.class);
Intent intent = new Intent("com.geek99.MY_BR");
sendBroadcast(intent);
}
}
2. 动态注册
动态注册不用在 AndroidManifest.xml 中注册广播接收器,而是在代码里面当创建 Activity 创建和注册广播接收器。
// 广播接收器类
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"消息来啦!",Toast.LENGTH_SHORT).show();
}
}
// Activity 动态注册广播接收器,发送广播
public class MainActivity extends AppCompatActivity {
MyReceiver mMyReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMyReceiver = new MyReceiver();
}
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction("com.geek99.MY_BR");
// 注册广播接收器
registerReceiver(mMyReceiver,filter);
}
// 一个 Button 的回调函数,发送广播
public void send2(View view) {
Intent intent = new Intent("com.geek99.MY_BR");
sendBroadcast(intent);
}
@Override
protected void onStop() {
super.onStop();
// Activity 停止时,注销广播接收器
unregisterReceiver(mMyReceiver);
}
}
二. 有序广播
在 AndroidManifest.xml 中注册广播接收器时,可以在 android:priority 声明优化级,数字值越大,优化级越高。如下例子,两个广播接收器的 action 是相同的,action 相同的广播,可以用同个 intent 同时 send 出去,但优化级高的会先在 reciever 收到。
<receiver android:name=".MyReceiver">
<intent-filter android:priority="100">
<action android:name="com.geek99.MY_BR"/>
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
<intent-filter android:priority="1000">
<action android:name="com.geek99.MY_BR"/>
</intent-filter>
</receiver>
// receiver1
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "我第一个收到消息!", Toast.LENGTH_SHORT).show();
}
}
// receiver2
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "我第二个收到消息!", Toast.LENGTH_SHORT).show();
this.abortBroadcast();
}
}
// 如上两个 Receiver,在 AndroidManifest.xml 中注册优化级高的,会先收到广播,Toast 会先打印
三. 系统广播
在 Android 系统某些事件发生时,会收到一些广播。
在 AndroidManifest.xml 中注册广播接收器,接收 action 为 "android.intent.action.TIME_SET" 的系统广播。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET"/>
</intent-filter>
</receiver>
// 广播接收器
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "时间更改了!", Toast.LENGTH_SHORT).show();
}
}
public class MainActivity extends AppCompatActivity {
MyReceiver r;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
r = new MyReceiver();
}
@Override
protected void onResume() {
super.onResume();
// 过滤 Intent,接收广播
IntentFilter f = new IntentFilter();
f.addAction(Intent.ACTION_TIME_CHANGED);
registerReceiver(r,f);
}
}