1、BroadcastReceiver基础
- 动态注册
- 静态注册
- 动态绑定
- 动态注销
- 实现静态注销【其实就是设置不去响应,并没有所谓注销】
2、代码走起
MyBroadcast:
会在MianActivity中使用代码动态注册它
package weizhengzhou.top.interviewbroadcast.BroadcastDemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* Created by 75213 on 2017/7/11.
* Are you known Broadcast ?
* Broadcast(广播)是在在组件中传播数据(Intent)的一种机制。通过Broadcast发送者和接受者都不需要知道对方是否存在。
* Are you known BroadcastReceiver ?
* BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件。
*/
// 使用动态注册
public class MyBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context , "动态注册广播" , Toast.LENGTH_SHORT).show();
}
}
MyBroadcast2:
会在AndroidManifes.xml中使用j静态注册它
package weizhengzhou.top.interviewbroadcast.BroadcastDemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* Created by 75213 on 2017/7/11.
*/
//使用静态注册
public class MyBroadcast2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context , "静态注册广播" , Toast.LENGTH_SHORT).show();
}
}
MianActivity:
里面有部分代码是实现蓝牙状态监听的
package weizhengzhou.top.interviewbroadcast;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import weizhengzhou.top.interviewbroadcast.BluetoothStateBroadcastReceiver.BluetoothStateBroadcastReceiver;
import weizhengzhou.top.interviewbroadcast.BroadcastDemo.MyBroadcast;
import weizhengzhou.top.interviewbroadcast.BroadcastDemo.MyBroadcast2;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button mButton1 , mButton2 , mButton3 , mButton4 , mButton5 , mButton6;
private MyBroadcast mMyBroadcast;
private BluetoothStateBroadcastReceiver mReceiver;
private BluetoothAdapter mBluetoothAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMyBroadcast = new MyBroadcast();
mReceiver = new BluetoothStateBroadcastReceiver();
mButton1 = (Button)findViewById(R.id.testButton1);
mButton2 = (Button)findViewById(R.id.testButton2);
mButton3 = (Button)findViewById(R.id.testButton3);
mButton4 = (Button)findViewById(R.id.testButton4);
mButton5 = (Button)findViewById(R.id.testButton5);
mButton6 = (Button)findViewById(R.id.testButton6);
mButton1.setOnClickListener(this);
mButton2.setOnClickListener(this);
mButton3.setOnClickListener(this);
mButton4.setOnClickListener(this);
mButton5.setOnClickListener(this);
mButton6.setOnClickListener(this);
registerReceiver(mReceiver , makeFilters());
//获取蓝牙适配器实例。如果设备不支持蓝牙则返回null
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//获取状态码
int test = mBluetoothAdapter.getState();
//判断蓝牙状态
switch (test){
case BluetoothAdapter.STATE_CONNECTED:
Toast.makeText(this , "判断状态为连接中" , Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_CONNECTING:
Toast.makeText(this , "判断状态为连接" , Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_DISCONNECTED:
Toast.makeText(this , "判断状态为断开" , Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_DISCONNECTING:
Toast.makeText(this , "判断状态为断中" , Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_OFF:
Toast.makeText(this , "关闭" , Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_ON:
Toast.makeText(this , "打开" , Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
//蓝牙监听需要添加的Action
private IntentFilter makeFilters(){
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED");
intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
intentFilter.addAction("android.bluetooth.BluetoothAdapter.STATE_OFF");
intentFilter.addAction("android.bluetooth.BluetoothAdapter.STATE_ON");
return intentFilter;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.testButton1:
//动态注册
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("weizhengzhou.top");
registerReceiver(mMyBroadcast, intentFilter);
break;
case R.id.testButton2:
//发送动态注册的广播信息
Intent intent = new Intent("weizhengzhou.top");
sendBroadcast(intent);
break;
case R.id.testButton3:
//发送静态注册的广播信息
Intent intent2 = new Intent("weizhengzhou.top.test");
sendBroadcast(intent2);
break;
case R.id.testButton4:
//解除动态绑定的广播接收者
unregisterReceiver(mMyBroadcast);
break;
case R.id.testButton5:
//实现不响应静态注册的广播
getPackageManager().setComponentEnabledSetting(
new ComponentName("weizhengzhou.top.interviewbroadcast" ,
MyBroadcast2.class.getName()),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
break;
case R.id.testButton6:
//重新激活静态广播接收者
getPackageManager().setComponentEnabledSetting(
new ComponentName("weizhengzhou.top.interviewbroadcast",
MyBroadcast2.class.getName()),
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
PackageManager.DONT_KILL_APP);
break;
}
}
}
3、蓝牙状态监听具体代码
BluetoothStateBroadcastReceiver:
主要实现蓝牙状态广播接收
package weizhengzhou.top.interviewbroadcast.BluetoothStateBroadcastReceiver;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* Created by 75213 on 2017/7/11.
* 实现蓝牙状态广播接收
*/
public class BluetoothStateBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//获取蓝牙设备实例【如果无设备链接会返回null,如果在无实例的状态下调用了实例的方法,会报空指针异常】
//主要与蓝牙设备有关系
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(context , "监听蓝牙变化" , Toast.LENGTH_SHORT).show();
switch (action){
case BluetoothDevice.ACTION_ACL_CONNECTED:
Toast.makeText(context , "蓝牙设备:" + device.getName() + "已链接" , Toast.LENGTH_SHORT).show();
break;
case BluetoothDevice.ACTION_ACL_DISCONNECTED:
Toast.makeText(context , "蓝牙设备:" + device.getName() + "断开链接" , Toast.LENGTH_SHORT).show();
break;
//上面的两个链接监听,其实也可以BluetoothAdapter实现,修改状态码即可
case BluetoothAdapter.ACTION_STATE_CHANGED:
int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
switch (blueState){
case BluetoothAdapter.STATE_OFF:
Toast.makeText(context , "蓝牙关闭", Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_ON:
Toast.makeText(context , "蓝牙开启" , Toast.LENGTH_SHORT).show();
break;
}
break;
default:
break;
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="weizhengzhou.top.interviewbroadcast">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name=".BroadcastDemo.MyBroadcast2"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="weizhengzhou.top.test"></action>
</intent-filter>
</receiver>
</application>
</manifest>