一、BroadcastReceiver是什么?

目录

一、BroadcastReceiver是什么?

二、接收系统广播

1、动态注册

2、静态注册

三、广播的注意事项

四、发送广播


        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"));
            }
        });
    }
}