BroadcastReceiver相关知识点学习与应用

(1)注册广播:动态注册,静态注册

动态注册:

需要IntentFilter对象与自定义的Receiver对象。

IntentFilter对象需要addaction,category,data

Receiver对象要重写onReceive(Contextcontext,Intent intent)方法。

ActivityonCreate方法里注册广播(registerReceiver,onDestory方法里撤销注册(unregisterReceiver)

publicclass MainActivity extends Activity {

privateIntentFilter intentFilter;

privateNetworkChangeReceiver networkChangeReceiver;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

//TODO Auto-generated method stub

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

intentFilter=newIntentFilter();

intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

networkChangeReceiver=newNetworkChangeReceiver();

registerReceiver(networkChangeReceiver,intentFilter);

}

@Override

protectedvoid onDestroy() {

//TODO Auto-generated method stub

super.onDestroy();

unregisterReceiver(networkChangeReceiver);

}

}

classNetworkChangeReceiver extends BroadcastReceiver{

@Override

publicvoid onReceive(Context arg0, Intent arg1) {

//TODO Auto-generated method stub

Toast.makeText(arg0,"change", Toast.LENGTH_LONG);

}

}

静态注册:

新建个类继承BroadcastReceiver.

AndroidManifest.xml中添加<receiver></receiver>标签。然后在它之中添加<intent-filter></intent-filter>标签。

自己的华为荣耀6android4.4实测,静态注册也必须要在应用启动后才有效。当然,按back键确认activityonDestory方法执行后,该应用只要还在后台(home键可以看到),该广播接收器依然有效。一旦该应用进程被杀死(home键看不到后),广播接收器无效。

publicclass BootCompleteReceiver extends BroadcastReceiver {

@Override

publicvoid onReceive(Context arg0, Intent arg1) {

//TODO Auto-generated method stub

Toast.makeText(arg0,"boot", Toast.LENGTH_SHORT).show();

Log.e("ss","sb");

}

}

<receiver android:name=".BootCompleteReceiver" >

<intent-filter>

<actionandroid:name="android.net.conn.CONNECTIVITY_CHANGE"/>

</intent-filter>

</receiver> 

(2)发送标准广播,有序广播

标准广播:

Intentintent=new Intent("xxx");

sendBroadcast(intent);

有序广播:

Intentintent=new Intent("xxx");

sendOrderedBroadcast(intent,null);

sendOrderedBroadcast()方法接收两个参数,第一个参数仍然是Intent,第二个参数是一个与权限相关的字符串,这里传入null就行了。 

(3)有序广播的优先级设置,有序广播的拦截

<intent-filter>标签里设置

<intent-filterandroid:priority="100">

<actionandroid:name="shit111"/>

</intent-filter>

onReceive()方法中调用了abortBroadcast()方法,就表示将这条广播截断

publicvoid onReceive(Context context, Intent intent) {

Toast.makeText(context,"received in MyBroadcastReceive",

Toast.LENGTH_SHORT).show();

abortBroadcast();

(4)本地广播的使用

LocalBroadcastManagerml=LocalBroadcastManager.getInstance(this);

ml要做三件事。

发送广播,注册广播接收器,撤销广播接收器的注册。

本地广播只能动态注册。 

(5)静态广播收不到的原因以及解决方法

情况1:新装的app,再没有运行第一次前,注册的静态广播是收不到的。

情况2:打开app,可以收到静态广播了。然后按home键,杀掉进程,静态广播又收不到了。

情况3:新装的app,但是没有注册activity,比如只有一个BroadcastReceiverService.

原因:

3.1版本以后,新安装而从未启动过的app不能收到系统的广播(启动完成,网络状态变化之类的)

解决方案:1.app做成系统应用,直接安装在system/app目录下2.通过第三方应用,发送带FLAG_INCLUDE_STOPPED_PACKAGES的广播给stop状态的自己

android3.1以后的版本中,如果程序被强制停止后应用状态会被标记为STOPPED,此时应用无法收到其他应用的广播,要等到应用再开启一次,将STOPPED去掉以后才可以。除此之外还有一个解决方法如下:

解决办法:

在广播发发送方发送广播时需要设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES

(6)广播接收器中启动活动和弹出对话框

1.onReceiver()方法中启动活动,必须添加这句

intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

2.onReceiver()中弹出对话框(警告框),必须设置对话框的类型,并添加相应权限。

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

AndroidManifest.xml文件中添加悬浮窗权限

uses-permissionandroid:name=”android.permission.SYSTEM_ALERT_WINDOW” 

(7)在程序中控制wifi的开启和关闭,bluetooth蓝牙的开启和关闭

讲道理的话,最好先判断下WifiManagerBluetoothAdapter对象是否为空,因为有的系统不一定支持。

开启关闭wifi

WifiManagerwifiManager;

wifiManager=(WifiManager)(getActivity().getSystemService(Context.WIFI_SERVICE));

wifiManager.isWifiEnabled();//返回当前wifi的开启状态,这个api并不好用。原因是

publicboolean isWifiEnabled() {

returngetWifiState() == WIFI_STATE_ENABLED;

}

wifiManager.getWifiState()返回值有5个,分别是WIFI_STATE_DISABLED,WIFI_STATE_DISABLING, WIFI_STATE_ENABLED, WIFI_STATE_ENABLING,WIFI_STATE_UNKNOWN

我们采用广播的时候wifi(wlan)开关:intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

当我们开启wifi,实际发了两次广播,从关闭状态到开启中,开启中到已开启。而wifiManager.isWifiEnabled()第一次返回false,紧接着返回true.所以用下面的代码较好:用一组状态值来设置开启关闭。最好用开启中,关闭中这组来设置。

if(wifiManager.getWifiState()== WifiManager.WIFI_STATE_ENABLED)

wlanSwitch.setChecked(true);

elseif(wifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLED){

wlanSwitch.setChecked(false);

}

或者:

if(wifiManager.getWifiState()== WifiManager.WIFI_STATE_ENABLING)

wlanSwitch.setChecked(true);

elseif(wifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLING){

wlanSwitch.setChecked(false);

}

而不是:

if(wifiManager.getWifiState()== WifiManager.WIFI_STATE_ENABLED)

wlanSwitch.setChecked(true);

else{

wlanSwitch.setChecked(false);

}

对于蓝牙的:

使用下面代码

if(bluetoothAdapter.getState()==BluetoothAdapter.STATE_TURNING_ON){

bluetoothSwitch.setChecked(true);

}

elseif(bluetoothAdapter.getState()==BluetoothAdapter.STATE_TURNING_OFF){

bluetoothSwitch.setChecked(false);

}



wifiManager.setWifiEnabled(isChecked);//设置wifi的开启,关闭

还有个apigetWifiState(),返回int类型。

注意要在AndroidManifest.xml文件中声明权限。

<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>



开启关闭bluetooth

BluetoothAdapterbluetoothAdapter;

bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

bluetoothAdapter.isEnabled();//返回蓝牙的状态,同样不好用,详细参考wifiManagerisWifiEnabled().

bluetoothAdapter.enable();//设置蓝牙开启

bluetoothAdapter.disable();//设置蓝牙关闭

还有个apigetState(),返回int类型。

注意要在AndroidManifest.xml文件中声明权限。


<uses-permissionandroid:name="android.permission.BLUETOOTH" />

<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值