0908Android基础四大组件之BroadcastReceiver

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>
发布了56 篇原创文章 · 获赞 1 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章