Android-Receiver

静态注册广播

①静态注册广播接收者

创建一个MyReceiver类作为广播接收者

1
2
3
public class MyReceiver{

}

该类继承自BroadcastReceiver,并重写了onReceive方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

//广播接收者
public class MyReceiver extends BroadcastReceiver {
@Override
// MyReceiver接收广播后,会调用onReceive方法
public void onReceive(Context context, Intent intent) {
// 接收intent中的消息
String msg = intent.getStringExtra("message");
Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
}
}

在清单文件的application中注册广播接收类

1
2
<!--    注册广播接收类-->
<receiver android:name=".MyReceiver"/>

清单文件中注册后,需要给它一个标记,通过这个标记找到广播接收类

1
2
3
4
5
6
7
<!--    注册广播接收类-->
<receiver android:name=".MyReceiver">
<intent-filter>
<!-- 标记可以任意填写-->
<action android:name="com.test.myReceiver"/>
</intent-filter>
</receiver>

②发送广播给接收者

在事件中

1
2
3
4
5
6
7
8
9
10
//  创建意图
Intent intent = new Intent();
// 传入的action要和注册的广播接收类中的action保持一致
intent.setAction("com.test.myReceiver");
// 发送消息
intent.putExtra("message","MainActivity发送的消息");
// 在Android8.0以上,需要设置setComponent()传入ComponentName对象,ComponentName对象需要设置广播接收者所在的包名和广播接收者的完整类名
intent.setComponent(new ComponentName(getPackageName(),getPackageName().toString()+".MyReceiver"));
// 发送广播
sendBroadcast(intent);

在Android8.0以上,静态广播必须设置

1
2
3
4
//  创建ComponentName对象,传入广播接收者所在的包名、广播接收者的完整类名
ComponentName componentName = new ComponentName(getPackageName(),getPackageName()+".MyReceiver");
// 设置Component
intent.setComponent(componentName);

动态注册广播

①动态注册广播接收者

创建一个MyReceiver类作为广播接收者

1
2
3
public class MyReceiver{

}

该类继承自BroadcastReceiver,并重写了onReceive方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

//广播接收者
public class MyReceiver extends BroadcastReceiver {
@Override
// MyReceiver接收广播后,会调用onReceive方法
public void onReceive(Context context, Intent intent) {
// 接收intent中的消息
String msg = intent.getStringExtra("message");
Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
}
}

动态注册广播接收类

1
2
3
4
5
6
7
8
//  使用广播接收类创建对象
MyReceiver myReceiver = new MyReceiver();
// 创建intentFilter
IntentFilter intentFilter = new IntentFilter();
// 给intentFilter添加Action
intentFilter.addAction("com.test.myReceiver");
// 注册Receiver
registerReceiver(myReceiver,intentFilter);

②发送广播给接收者

在事件中

1
2
3
4
5
6
7
8
//  创建意图
Intent intent = new Intent();
// 发送消息
intent.putExtra("message","MainActivity发送的消息");
// 设置Action
intent.setAction("com.test.myReceiver");
// 发送广播
sendBroadcast(intent);

动态注册广播一定不要设置setComponent()

发送广播的方式

①sendBroadcast

所有满足条件的广播接收者都会执行其onReceive()方法来处理响应,当有多个满足条件的广播接收者时,不能保证它们onReceive()的执行顺序

②sendStickyBroadcast

intent在发送后一直存在,并且在以后调用registerReceiver注册相匹配的Receive时会把这个intent直接返回给新注册的Receive

通俗讲:先动态注册再发送广播,或者先发送广播再动态注册,intent都可以被接收器接收到并执行其onReceive方法。

不过需要在manifest.xml文件中配置此类型广播权限

1
<uses-permissionandroid:name="android.permission.BROADCAST_STICKY"/>

③sendOrderBroadcast

通过sendOrderBroadcast发送广播,当有多个满足条件的广播接收者,会根据广播接收者注册时intentFilter设置的优先级顺序来执行onReceive()方法,对于相同优先级的广播接收者则不能保证onReceive()的执行顺序