学习BroadcastReceiver总结——持续更新

Android提供了广播发送和接收机制。广播有标准广播有序广播两种类型。标准广播好似村里面的大喇叭广播消息;有序广播好像是古代驿站传递消息。
Android systemApplication可以发出广播。其中Android system广播标识时字符串常量,这些字符串常量是Intent类(如下给出其继承关系)的属性,具体请参考Android API文档。对于Application来说可以通过,

  1. sendBroadcast(Intent intent)
  2. sendOrderedBroadcast(Intent intent, String string)

来广播消息。当发送有序广播时,接受广播的BroadcastReceiver的onReceive方法中可以执行abortBroadcast(),截断该广播继续传播。

public class Intent
extends Object implements Parcelable, Cloneable

java.lang.Object
   ↳	android.content.Intent

监听Android systemApplication广播的动态注册方式的一般步骤为:

  1. 定义一个继承BroadcastReceiver的XXXReceiver类
  2. 于XXXReceiver类中重写其父类的onReceive(Context context, Intent intent)方法
  3. 于需要的地方new出XXXReceiver类的一个object
  4. 于合适的地方调用context的registerReceiver(BroadcastReceiver broadcastReceiver, IntentFilter intentFilter)方法
  5. 于合适的地方调用context的unregisterReceiver(BroadcastReceiver broadcastReceiver)方法

完成上述五个步骤后,当Android systemApplication发出广播时,onReceive函数就会得到回调。

例如,打开名为NetChangeReceiver.java的文件,如下所示。文件中定义了一个监听网络变化的广播接收器。并且自定义了registerReceiverBy(Context context)和unregisterReceiverBy(Context context)函数,用来注册广播接收器。之所以将registerReceiverunregisterReceiver进行封装,提高代码的可管理性,代码可读性,代码整洁度,降低调试难度,代码耦合度。

package com.ocean.android.systembroadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class NetChangeReceiver extends BroadcastReceiver {

    private static final String TAG = "NetChangeReceiver";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //throw new UnsupportedOperationException("Not yet implemented");
        Log.i(TAG, "onReceive: in");
        //add your code here
    }
    public void registerReceiverBy(Context context){
        Log.i(TAG, "registerReceiver: in");
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        context.registerReceiver(this, intentFilter);
    }
    public void unregisterReceiverBy(Context context){
        Log.i(TAG, "unregisterReceiver: in");
        context.unregisterReceiver(this);
    }
}

监听Android systemApplication广播的静态注册方式的一般步骤为:(当程序在未启动的情况下也要接收到广播时,需要考虑静态注册方式)

  1. 定义一个继承BroadcastReceiver的XXXReceiver类
  2. 于XXXReceiver类中重写其父类的onReceive(Context context, Intent intent)方法
  3. 于AndroidMainfest.xml文件中添加下面代码,其中intent-filter中的android:name=“广播常量码”。
<receiver
   android:name="com.ocean.android.systembroadcastreceiver.NetChangeReceiver "
   ...
   >
   <intent-filter>
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
   </intent-filter>
</receiver>

Application可以通过调用Context的sendBroadCast()或sendOrderedBroadCast()发出广播。

注意事项

  1. 需要说明的是不要在onReceive函数中执行耗时操作
  2. Android O(Android 8)对BroadcastReceiver进行了改进,启动BroadcastReceiver的Intent必须是显示的Intent:要么直接设置XXXReceiver的类名;要么通过Action和package来设置Intent。并且开机启动的BroadcastReceiver不允许在后台启动Service。
发布了6 篇原创文章 · 获赞 1 · 访问量 193
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览