BroadcastReceiver广播接收器
BroadcastReceiver是为了方便Android系统各个应用程序以及程序内部进行通信,Android系统引入了一套广播机制。各个应用程序之间可以对感兴趣的广播进行注册,当系统或其他程序发出这条广播时,对发出的广播进行注册过的程序便能够收到这条广播。Android系统中有一套完整的API,允许程序只有的发送和接收广播。
注意:不要在广播中处理过多逻辑或是进行任何耗时过久的操作,因为在广播中是不允许开启线程的;当 onReceiver()方法运行时间超过10S还没有结束的话,程序会报错(ANR),广播的时候是扮演打开其他组件的角色,例如启动Service,Notification提示,Activity等。
在Android系统中广播主要有两种类型:
1.标准广播(Normal Broadcasts)
是一种完全异步执行的广播,在广播播出之后,所有的广播接收器会在同一时间接收到这条广播,广播无法被截断。
发送方式:
Intent intent = new Intent("com.example.servicedemo.BORADCAST_TEST");
sendBroadcast(intent);
2.有序广播(Ordered Broadcasts):
是一种同步执行的广播,在广播发出之后,优先级高的广播接收器可以优先接收到这条广播,并可以在优先级较低的广播接收器接收之前截断停止掉这条广播。
发送方式:
Intent intent = new Intent("com.example.servicedemo.BORADCAST_TEST");
//第二个参数是与权限相关的字符串
sendoradeBroadcast(intent,null);
广播注册:
在Android的广播接收机制中,如果需要接收广播,就需要创建广播接收器。而创建广播接收器的方法就是新建一个类(可以是单独新建一个类,也是有是内部类)继承BraadcastReceiver,然后使用。
public class MyBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
动态注册和静态注册的区别
动态注册的广播接收器可以自由的控制注册和取消,有很大的灵活性。但是只能在程序启动之后才能收到广播,广播接收器的注销实在 onDestroy() 方法中的。所有广播接收器的生命周期和活动的生命周期一样。
静态注册的广播不受程序是否启动的约束,当程序关闭之后也还是可以接收广播。
两种方式注册广播:
动态注册
就是在代码中注册,步骤如下:
1.实例化自定义的广播接收器。
2.创建 IntentFilter 实例。
3.调用 IntentFilter 实例的 addAction()方法添加监听的广播类型。
4.最后调用 Context 的registerReceiver(BroadcastReceiver ,IntentFilter) 注册的广播。
注意:如果需要接收系统广播(电量变化,网络变化等)需要在 AndroidManifest.xml 文件中添加权限!!!
静态注册
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.MY_BROADCAST"></action>
</intent-filter>
</receiver>
动态注册广播示例:
1.注册广播
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("MyBroadcast","onReceive()");
}
}
2.注册广播接收器
public class MainActivity extends AppCompatActivity {
private MyBroadcastReceiver myBroadcastReceiver;
private Button button ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册广播接收器
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcastdemo.MyBroadcastReceiver");
registerReceiver(myBroadcastReceiver,intentFilter);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销广播
unregisterReceiver(myBroadcastReceiver);
Log.e("注销广播---------","unregisterReceiver");
}
}
3.在 SecondActivity 中发送广播
public class SecondActivity extends AppCompatActivity {
private Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcastdemo.MyBroadcastReceiver");
sendBroadcast(intent);
}
});
}
}
说明在 MainActivity 中接收到了广播。
静态注册广播示例:
1.(同上1)
2.注册接收器(同上2)
//动态注册广播接收器
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcastdemo.MyBroadcastReceiver");
registerReceiver(myBroadcastReceiver,intentFilter);
3.发送广播
public class SecondActivity extends AppCompatActivity {
private Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送广播
// Android 8.0 以上系统不再支持这种方式。
// Intent intent = new Intent("com.example.broadcastdemo.MyBroadcastReceiver");
Intent intent = new Intent();
intent.setComponent(new ComponentName(SecondActivity.this,MyBroadcastReceiver.class));
sendBroadcast(intent);
}
});
}
}
4.在 AndroidManifest.xml 中注册
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.broadcastdemo.MyBroadcastReceiver"></action>
</intent-filter>
</receiver>