一、BroadcastReceiver是什么?
目录
BroadcastReceiver是Android四大组件之一。从字面意思我们就能知道,广播就是应用程序间的全局大喇叭,即通信的一个手段。
系统自己在很多时候都会发送广播,比如电量低或者充足,刚启动完,插入耳机,输入法改变等, 发生这些时间,系统都会发送广播,这个叫系统广播,每个APP都会收到。
如果你想让你的应用在接收到这个广播的时候做一些操作,比如:系统开机后,偷偷后台跑服务,这个时候你只需要为你的应用 注册一个用于监视开机的BroadcastReceiver,当接收到开机广播就启动应用后台服务。当然我们也可以自己发广播,比如:接到服务端推送信息,用户在别处登录,然后应该强制用户下线回到 登陆界面,并提示在别处登录。
二、接收系统广播
在接收系统广播之前,还需要为我们的APP注册广播接收器,而注册的方法又分为以下两种:动态与静态。
1、动态注册
在Java代码中指定IntentFilter,然后添加不同的Action即可,想监听什么广播就写什么Action,另外动态注册的广播,一定要调用unregisterReceiver让广播取消注册(一般来说注册和取消注册成对出现)。
public class MainActivity extends AppCompatActivity {
//需要自定义一个广播接收器MyReceiver
MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册广播
myReceiver = new MyBRReceiver();
IntentFilter itFilter = new IntentFilter();
//把联网时的系统广播添加到过滤器中
itFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(myReceiver, itFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册广播
unregisterReceiver(myReceiver);
}
}
2、静态注册
动态注册需程序启动后才能接收广播,静态广播就弥补了这个短板,在AndroidManifest中制定<IntentReceiver>就可以让程序在未启动的情况下接收到广播了。
<!-- 开机广播 -->
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name = "android.intent.cation.BOOT_COMPLETED">
</intent-filter>
</receiver>
<!-- 添加权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
//自定义广播接收器
public class BootCompleteReceiver extends BroadcastReceiver {
private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_BOOT.equals(intent.getAction()))
Toast.makeText(context, "开机完毕", Toast.LENGTH_LONG).show();
}
}
三、广播的注意事项
不要在广播里添加过多逻辑或者进行任何耗时操作,因为在广播中是不允许开辟线程的, 当onReceiver( )方法运行较长时间(超过10秒)还没有结束的话,那么程序会报错, 广播更多的时候扮演的是一个打开其他组件的角色,比如启动Service,Notification提示,Activity等。
四、发送广播
发送广播要先自定义一个广播接收器,再在MainActivity中发送。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_send = (Button) findViewById(R.id.btn_send);
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendBroadcast(new Intent("com.example.broadcasttest.MY_BROADCAST"));
}
});
}
}