【问题标题】:Broadcast Receiver Throughtout the application整个应用程序中的广播接收器
【发布时间】:2013-12-11 18:08:36
【问题描述】:

我在我的活动中使用广播接收器来检查互联网是否连接,如果它只连接,那么它应该发出一个 http 请求,否则会显示一个警告对话框,说明没有互联网连接并且它工作正常。

问题我的整个应用程序使用互联网连接,所有活动。我应该如何使广播接收器在整个应用程序中可用。

我的Broadcast Receiver class


private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        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);

        currentNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);

        if(currentNetworkInfo.isConnected())
        {

            Toast.makeText(getApplicationContext(), "Internet Connected", Toast.LENGTH_LONG).show();

        }
        else
        {

            Toast.makeText(getApplicationContext(), "Internet Not Connected", Toast.LENGTH_LONG).show();

        }
    }
};



然后onCreate

    this.registerReceiver(this.mConnReceiver,
            new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

【问题讨论】:

  • 您想在用户连接到互联网时收到通知,还是要检查他是否已连接(您不需要 BroadcastReceiver)?
  • 你可以有一个抽象的Activity来实现B​​raodcardreceiver,并将该Activity扩展到其他Activity
  • @RvdK 我的整个应用程序主要在网络服务(json)的帮助下工作在互联网连接上,所以我希望在连接丢失时通知用户

标签: android broadcastreceiver android-broadcast


【解决方案1】:

我建议您将接收器提取到顶级类中,将其安装在所有入口点中(每个活动用户都可以在您的应用程序之外开始)。然后使用一个单例设置对象来保持状态,你所有的活动都可以简单地访问这个设置对象来检查连接。

由于您的所有活动都需要它,甚至需要在连接更改时得到通知,您可以定义一个包含所有连接处理逻辑的基础活动,并让所有其他活动继承它。

【讨论】:

    【解决方案2】:

    为此制作接收器:

    public class NetReceiver extends BroadcastReceiver {
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
    
          ConnectivityManager connectivityManager = (ConnectivityManager) 
                                       context.getSystemService(Context.CONNECTIVITY_SERVICE );
          NetworkInfo activeNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
          boolean isConnected = activeNetInfo != null && activeNetInfo.isConnectedOrConnecting();   
          if (isConnected)       
                 //Nothing
          else 
              Toast.makeText(context, "Not Connected", Toast.LENGTH_LONG).show(); 
        }
    }
    

    现在在 androidmanifest.xml 中添加这个

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    

    如果您已在上面添加,请检查此代码:

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

    【讨论】:

    • 非常感谢...像魅力一样工作...但是当我尝试打开活动时,它会强制关闭 http 请求的 bcoz .. 仅在连接互联网时才发出 http 请求.. .我应该如何修改else部分?
    • 用一个变量创建应用程序类,用于存储互联网连接的值。如果互联网连接,然后从广播接收器设置值.. 然后当您发出 http 请求时,首先检查该变量的值..
    【解决方案3】:
    ConnectivityManager connMgr = (ConnectivityManager) 
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            // connected to internet
        } else {
            // no internet
        }
    

    【讨论】:

      【解决方案4】:

      如果您只需要检查用户是否已连接到 Internet,请检查

              ConnectivityManager conMgr = (ConnectivityManager)                
              context.getSystemService(Context.CONNECTIVITY_SERVICE);
      
              // ARE WE CONNECTED TO THE NET
      
              if (conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable() && conMgr.getActiveNetworkInfo().isConnected())
              {
                  return true;
              }
              else
              {
                  return false;
              }
      

      在开始 Http 请求之前。您不需要为此注册BroadcastReceiver。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多