BroadcastReceiver
Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样程序就只会接收到自己关心的广播内容,可能来自于系统,可能来自于其他应用程序。
Android中广播主要可以分为两种类型,标准广播和有序广播。
标准广播,异步执行,广播发出后,所有的BroadcastReceiver几乎同时接收到广播消息,效率高,无法被截断。
有序广播则是一种同步执行,广播接收器按照优先级顺序接受广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播就无法接收到广播消息了。
发送自定义广播
创建广播接收器
发送自定义广播需要创建一个广播接收器,即新建一个类让他继承BroadcastReceiver,并重写父类中的onReceive()方法。当有广播到来时,onReceive()方法就会得到执行。
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.d("", "访问到了么= =");
Toast.makeText(context,"收收收收收到广播",Toast.LENGTH_SHORT).show();
}
}
注册广播
静态注册
动态注册
在活动中添加代码如下
MyReciver mReciver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("com.laowang.broad");
registerReceiver(mReciver,filter);
动态注册系统广播需要再复写一个方法,解绑广播接收器,防止关闭时产生error
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReciver);
}
发送广播
在活动中按键的点击事件中添加发送广播。
Intent intent=new Intent();
intent.setAction("com.laowang.broad");
sendBroadcast(intent);
闹钟DEMO
在上面的基础上添加了俩个按钮,分别实现打开闹钟和关闭闹钟。实现的效果是,点击打开闹钟后,过五秒开始广播,每隔三秒广播一次。点击关闭闹钟来关闭广播。
打开闹钟
Intent intent2=new Intent();
intent2.setAction("com.laowang.broad");
PendingIntent pendingIntent1=PendingIntent.getBroadcast(getApplication(),0x23,intent2,PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+5000,3000,pendingIntent1);
关闭闹钟
Intent intent3=new Intent();
intent3.setAction("com.laowang.broad");
PendingIntent pendingIntent2=PendingIntent.getBroadcast(getApplication(),0x23,intent3,PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.cancel(pendingIntent2);
网络连接和删除软件广播DEMO
在动态注册广播的基础上面,在mainfest中添加权限以及action。实现的功能分别为,打开wlan连接时进行广播,以及删除软件时进行广播。
//权限
<uses-permission android:name="ANDROID.PERMISSION.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.broadcast_package_removed"/>
//action
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="ANDROID.INTENT.ACTION.PACKAGE_REMOVED"/>
整个mainfest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.laowang.android0907" >
<uses-permission android:name="ANDROID.PERMISSION.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.broadcast_package_removed"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="ANDROID.INTENT.ACTION.PACKAGE_REMOVED"/>
</intent-filter>
</receiver>
</application>
</manifest>