breadcastreceiver作为安卓四大组件之间一般作为通讯
静态创建:
XML代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.broadcastrescvierdemo.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="send"
android:text="静态注册发送广播" />
</RelativeLayout>
java代码:
//使用静态注册创建一个广播接受者
//第一步创建个类继承BroadcastReceiver
public class MyBroadCastReceiver extends BroadcastReceiver {
//第二步重写onrReceive方法
@Override
public void onReceive(Context context, Intent intent) {
//接受广播数据数据在intent里面
Toast.makeText(context, intent.getStringExtra("text"), Toast.LENGTH_SHORT).show();
//拦截有序广播
abortBroadcast();
}
}
mainfest代码
<!--第三步注册,建立白名单管理,设置action接受的活动和category一般DEFAULT-->
<receiver android:name=".MyBroadCastReceiver">
<!--在intent-filter里面设置优先级一般是-1000到1000-->
<intent-filter android:priority="900">
<!--自定义的活动-->
<action android:name="ok" />
<!--系统的活动,飞行模式,可以定义自动需要的活动-->
<action android:name="ACTION_AIRPLANE_MODE_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
mainactivity代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void send(View view) {
//sendBroadcast()方法在context的方法他的子类都可以调用这方法
//这里设置了自定义的活动名称,广播接受者注册必须设置通样的活动名称
Intent intent= new Intent("ok");
//携带数据发广播
intent.putExtra("text","activity 发了一个广播");
//无序广播(拦截不了)
//sendBroadcast(intent);
//有序广播(广播接受者设置优先级可以先后接受到广播,先接受到的广播可以对广播拦截,后面的接受不到)
sendOrderedBroadcast(intent,null);
//粘性广播(可以等待的广播,比较耗资源,过期了)
// sendStickyBroadcast(intent);
}
}
//当mainactivity发送一个广播,静态创建个广播接受者就可以获取到广播。
注意:这个广播是全局的广播(所有app如果配置了活动都可以接受)。
//动态创建broadcastreceiver
//动态创建
public class MainActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
//注册广播
//设置过滤(白名单)
//电池电量Intent.ACTION_BATTERY_CHANGED
//飞行模式Intent.ACTION_AIRPLANE_MODE_CHANGED
IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction("text");
//设置优先级
filter.setPriority(500);
//注册
registerReceiver(receiver, filter);
}
@Override
protected void onDestroy() {
//注销广播
unregisterReceiver(receiver);
receiver = null;
super.onDestroy();
}
//发广播
public void send(View view) {
//发送无序广播
//注意自定义发的广播必须要标注个活动(在注册中添加到活动中)
Intent intent = new Intent("text");
intent.putExtra("broadCast", "发送一个无序广播");
sendBroadcast(intent);
}
//动态创建广播接受者
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//接受系统的广播
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
//获取目前电池电量
int level = intent.getIntExtra("level", 0);
tv.setText("当前电池电量:" + level);
}
boolean b = Settings.System.getInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 0 ? false : true;
Log.e("TAG", "--------------->>飞行模式:" + b);
//接受activity自定义的发送的广播
String broadCast = intent.getStringExtra("broadCast");
Log.e("TAG", "--------------->>activity:" + broadCast);
if (!TextUtils.isEmpty(broadCast))
Toast.makeText(context, broadCast, Toast.LENGTH_SHORT).show();
}
};
}
//总结
静态创建优点:APP没有启动也可以接受到,在8.0后无效。
缺点:系统需要到每个APP的mainfest配置文件去匹配,太消耗资源。
动态创建优点:系统无需到mainfest文件匹配,占用系统资源少。
缺点:APP需要启动才可以接受。