(1)注册广播:动态注册,静态注册
动态注册:
需要IntentFilter对象与自定义的Receiver对象。
IntentFilter对象需要addaction,category,data。
Receiver对象要重写onReceive(Contextcontext,Intent intent)方法。
在Activity的onCreate方法里注册广播(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,比如只有一个BroadcastReceiver和Service.
原因:
在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蓝牙的开启和关闭
讲道理的话,最好先判断下WifiManager和BluetoothAdapter对象是否为空,因为有的系统不一定支持。
开启关闭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的开启,关闭
还有个api是getWifiState(),返回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();//返回蓝牙的状态,同样不好用,详细参考wifiManager的isWifiEnabled().
bluetoothAdapter.enable();//设置蓝牙开启
bluetoothAdapter.disable();//设置蓝牙关闭
还有个api是getState(),返回int类型。
注意要在AndroidManifest.xml文件中声明权限。
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />