Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中使用BroadcastReceiver检查网络连接_Android_Networking_Broadcastreceiver_Connectivity - Fatal编程技术网

在Android中使用BroadcastReceiver检查网络连接

在Android中使用BroadcastReceiver检查网络连接,android,networking,broadcastreceiver,connectivity,Android,Networking,Broadcastreceiver,Connectivity,我正在使用BroadcastReceiver在我的应用程序运行时检查网络连接。我已将BroadcastReceiver与活动绑定,以便在连接中断时提供一些控件,如AlertDialog。但是现在我不想把这个接收器限制在一个特定的活动中,而是想把它应用到我的整个应用程序中(所有活动)。那我该怎么做才能完成呢 这是我使用的代码。请让我知道我的代码是否达到标准,如果出现错误,请纠正我 package com.xx.mobile; import android.app.Activity; import

我正在使用BroadcastReceiver在我的应用程序运行时检查网络连接。我已将BroadcastReceiver与活动绑定,以便在连接中断时提供一些控件,如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();
    }



    }
};
}
非常感谢您的任何帮助


谢谢

我想你有两个选择

第一选项

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

实现某种类型的,以便您的活动可以将自己注册到保存网络状态的自定义应用程序类。然后,应用程序类通知每个注册的活动有关网络状态的更改

您可以在onCreate()和onDestroy()中向应用程序类注册和从应用程序类注销活动类(最好是onResume()和onPause()),这样它们只会在网络更改可见时收到通知

第二选项

另一种选择是坚持使用当前代码,并将广播接收器的引用集中保存在某个位置,同样,自定义应用程序类将完成这项工作


因此,您的活动知道在哪里可以找到用于注册和注销的接收者。但要知道,你必须找到一个地方,在那里你启动接收器。还请记住,您必须处理应用程序可能因内存不足而被Android关闭并在稍后重新启动的情况,然后您必须重新创建接收器。

Flo的选项一通过包含在清单文件中使广播接收器全局化是正确的。还有一个选项是,将一个活动作为基本活动,并用它扩展所有活动,然后在基本活动中注册接收者

谢谢你的回复。。。请给我一些参考资料/片段,以便我更好地理解和帮助其他人。谢谢……你到底想知道什么?你能举一些例子吗