广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    Android中BroadcastReceiver(异步接收广播Intent)的使用

    2018-04-04 08:35:30 次阅读 稿源:互联网
    广告
    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。
    代码如下:

    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:
    代码如下:

    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);

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

    <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>

    动态注册的话需要这样做(未调试):
    1. 在Activity的onCreate中:
    //注册网络监听
    IntentFilter filter = new IntentFilter();
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(mNetworkStateReceiver, filter);
    2. 在Activity中的onDestroy中:
    //取消监听
    unregisterReceiver(mNetworkStateReceiver);
    最终效果:
     

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告