BroadCast简介
Broadcast是android中的四大组件之一,是在组件之间传播数据(Intent)的一种机制。广播的发送者和接收者事先是不需要知道对方的存在的。这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。
广播具有以下特性:
1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁。
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框。
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉。
4.耗时的较长的工作最好放在服务中完成广播接收器。
广播接收器
广播接收器主要分为两种类型:标准广播和有序广播。
标准广播
标准广播又分静态注册和动态注册。
静态注册:直接在androidManifest.xml中注册。
a.创建一个广播接收者
public class MyStaticReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("MyStaticReceiver:","收到一条:"+intent.getStringExtra("info"));
}
}
b.在AndroidManifest.xml清单文件中进行注册
<receiver
android:name=".MyStaticReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="demo" />
</intent-filter>
</receiver>
c.发送静态信息
public class MainActivity extends AppCompatActivity {
private Button btn_staticRecevier;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_staticRecevier=findViewById(R.id.btn_staticRecevier);
btn_staticRecevier.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
intent.setPackage(getPackageName());//静态广播接收者在8.0以后会遇到问题,在发送广播是,需要设置报名
intent.putExtra("info","静态你收到了吗");
intent.setAction("wpw");
sendBroadcast(intent);
}
});
}
}
动态注册:使用java代码注册。
public class MainActivity extends AppCompatActivity {
private Button btn_dymnicRecevier;
private MydymnicRecevier mmr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_dymnicRecevier=findViewById(R.id.btn_dymnicRecevier);
btn_dymnicRecevier.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
intent.putExtra("info","动态你收到了吗");
intent.setAction("hopu");
sendBroadcast(intent);
}
});
mmr=new MydymnicRecevier();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("hopu");
registerReceiver(mmr,intentFilter);
}
class MydymnicRecevier extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("MyStaticReceiver:","收到一条:"+intent.getStringExtra("info"));
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mmr);
}
}