4

我正在使用 BroadcastReceiver 在我的应用程序运行时检查网络连接。我已将 BroadcastReceiver 与 Activity 绑定,以便在连接中断时带来一些控件,如 AlertDialog。但现在我不想将此接收器限制为特定活动,而是希望将其应用于我的整个应用程序(所有活动)。那么我应该采取什么方式来完成这项工作......

这是我使用的代码。请让我知道我的代码是否达到标准,如果出现错误请纠正我。

package com.xx.mobile;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;


public class CheckforConnectivity extends Activity {
private static final String LOG_TAG = CheckforConnectivity.class.getSimpleName();
static final String ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
private boolean mActiveNetState = false;
private boolean mMobileNetState = false;
private boolean mStatus = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    IntentFilter filter = new IntentFilter(ACTION);
    this.registerReceiver(ConnectivityCheckReceiver, filter);
}

@Override
protected void onDestroy(){
    super.onDestroy();
    unregisterReceiver(ConnectivityCheckReceiver);
}



private final BroadcastReceiver mConnectivityCheckReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
                boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
                    NetworkInfo currentNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        NetworkInfo otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);
        Log.i(TAG, "Status : " + noConnectivity + ", Reason :" + reason + ", FailOver :" + isFailover + ", Current Network Info : " + currentNetworkInfo + ", OtherNetwork Info :" + otherNetworkInfo);

        mStatus = noConnectivity;
        Log.d(TAG, "Status :" + mStatus);

        if(mStatus){
        AlertDialog.Builder builder = new AlertDialog.Builder(NotifySMSReceived.this);
        builder.setMessage("Connection is not Available !");
        builder.setTitle("Info");
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();

            }

        });
        AlertDialog alert = builder.create();
        alert.show();
    }
    else {

            AlertDialog.Builder builder = new AlertDialog.Builder(NotifySMSReceived.this);
            builder.setMessage("Connection is Available !");
            builder.setTitle("Info");
            builder.setPositiveButton("Ok", new DialogInterface.OnClickListener(){

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    dialog.dismiss();

                }

            });
            AlertDialog alert = builder.create();
            alert.show();
    }



    }
};
}

任何形式的帮助都将受到高度赞赏。

谢谢

4

2 回答 2

14

我想你有2个选择。

第一个选项

首先,您应该注册您的接收器,而不是使用代码,而是在清单文件中。通过这种方式,它会自动为您的应用程序注册。在您的接收器中,您必须将网络的当前状态集中存储在自定义应用程序类或单例类中。

实现某种观察者模式,以便您的活动可以将自己注册到您的自定义应用程序类,该类保存网络状态。然后,Application 类通知每个注册的活动有关网络状态的变化。

您的活动类在 onCreate() 和 onDestroy() 中注册和注销 Application 类(最好是 onResume() 和 onPause()),因此它们仅在可见时才获知网络更改。

第二种选择

另一种选择是坚持您当前的代码并将广播接收器的引用集中在某个地方,自定义应用程序类也可以完成这项工作。

因此,您的活动知道在哪里可以找到注册和取消注册的接收者。但请注意,您必须找到启动接收器的位置。另请记住,您必须处理应用程序可能因内存不足而被 Android 关闭并稍后重新启动的情况,然后您必须重新创建接收器。

于 2011-05-30T14:08:07.843 回答
1

Flo 的选项一对于通过包含在清单文件中使广播接收器全局化是正确的。还有另一种选择是,将活动作为基本活动并以此扩展您的所有活动并将您的接收器注册到基本活动中。

于 2014-03-03T06:30:14.673 回答