Android中BroadcastReceiver的使用

本文详细介绍了Android中的BroadcastReceiver组件,包括其基本概念、生命周期特点及如何使用BroadcastReceiver来监听网络状态变化。提供了静态注册和动态注册两种方式的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Broadcast Receiver简介
Broadcast Receiver是Android的五大组件之一,使用频率也很高。
用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似.
广播接收器只能接收广播,对广播的通知做出反应,很多广播都产生于系统代码.如:时区改变的通知,电池电量不足、用户改变了语言偏好或者开机启动等.
广播接收器没有用户界面,但是,它可以为它们接收到信息启动一个Activity或者使用NotificationManager来通知用户.

 

 

生命周期


    一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。

    因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。

 


监听网络状态变化的例子

下面通过一个例子来使用BroadcastReceiver。

NetworkStateReceiver:接收网络状态变化时系统发出的Broadcast。

 

[java]
package com.example.networkbroadcastreceiver; 
 
import android.content.BroadcastReceiver;   
import android.content.Context;   
import android.content.Intent;   
import android.net.ConnectivityManager;   
import android.net.NetworkInfo;   
import android.util.Log;   
import android.widget.Toast;   
   
public class NetworkStateReceiver extends BroadcastReceiver {   
       
    private static final String TAG = "NetworkStateReceiver";   
       
    @Override   
    public void onReceive(Context context, Intent intent) {   
        Log.i(TAG, "network state changed.");   
        if (!isNetworkAvailable(context)) {   
            Toast.makeText(context, "network disconnected!", 0).show();   
        }   
        else Toast.makeText(context, "network connected!", 0).show(); 
    }   
       
    /** 
     * 网络是否可用 
     *  
     * @param context 
     * @return 
     */   
    public static boolean isNetworkAvailable(Context context) {   
        ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);   
        NetworkInfo[] info = mgr.getAllNetworkInfo();   
        if (info != null) {   
            for (int i = 0; i < info.length; i++) {   
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {   
                    return true;   
                }   
            }   
        }   
        return false;   
    }   
   
}   

package com.example.networkbroadcastreceiver;

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.util.Log; 
import android.widget.Toast; 
 
public class NetworkStateReceiver extends BroadcastReceiver { 
     
    private static final String TAG = "NetworkStateReceiver"; 
     
    @Override 
    public void onReceive(Context context, Intent intent) { 
        Log.i(TAG, "network state changed."); 
        if (!isNetworkAvailable(context)) { 
            Toast.makeText(context, "network disconnected!", 0).show(); 
        } 
        else Toast.makeText(context, "network connected!", 0).show();
    } 
     
    /**
     * 网络是否可用
     * 
     * @param context
     * @return
     */ 
    public static boolean isNetworkAvailable(Context context) { 
        ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo[] info = mgr.getAllNetworkInfo(); 
        if (info != null) { 
            for (int i = 0; i < info.length; i++) { 
                if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
                    return true; 
                } 
            } 
        } 
        return false; 
    } 
 

MainActivity:


[java]
package com.example.networkbroadcastreceiver; 
 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
 
 
public class MainActivity extends Activity { 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

package com.example.networkbroadcastreceiver;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;


public class MainActivity extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);[java] view plaincopyprint?    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        getMenuInflater().inflate(R.menu.activity_main, menu); 
        return true; 
    } 

 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }
}

 


静态注册和动态注册
写好BroadcastReceiver 之后要对其进行注册。
静态注册需要修改manifest文件,也是我采用的方法。

添加


[html]

<SPAN style="FONT-SIZE: 14px"><receiver android:name=".NetworkStateReceiver" > 
            <intent-filter> 
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
 
                <category android:name="android.intent.category.DEFAULT" /> 
            </intent-filter> 
        </receiver></SPAN> 

<receiver android:name=".NetworkStateReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
动态注册的话需要这样做(未调试):

1. 在Activity的onCreate中:
//注册网络监听
IntentFilter filter = new IntentFilter(); 
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消监听
unregisterReceiver(mNetworkStateReceiver);


最终效果:

 

 

 

 \Android中BroadcastReceiver的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值