【问题标题】:Get network state on each activity获取每个活动的网络状态
【发布时间】:2017-06-15 16:09:17
【问题描述】:

我正在实现一个需要互联网连接的应用。如果没有互联网连接,将根据活动以不同方式显示“无连接”消息。

为此,我有以下课程:

public class NetworkAvailability {

    private static final String NETWORK_AVAILABILITY_ACTION = "com.toast.NETWORK_AVAILABILITY_ACTION";

    private ConnectivityManager connectivityManager;
    private ConnectivityManager.NetworkCallback networkCallback;

    private static NetworkAvailability instance;

    private NetworkAvailability() {
    }

    public static NetworkAvailability getInstance(){
        if(instance == null){
            instance = new NetworkAvailability();
        }
        return instance;
    }

    private static boolean isAvailable(Context context) {
        ConnectivityManager cm =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnected();
    }

    public void registerNetworkAvailability(final Context context, BroadcastReceiver networkAvailabilityReceiver) {

        context.registerReceiver(networkAvailabilityReceiver, new IntentFilter(NETWORK_AVAILABILITY_ACTION));

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            context.registerReceiver(connectivityChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        } else{
            connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkRequest.Builder builder = new NetworkRequest.Builder();
            networkCallback = new ConnectivityManager.NetworkCallback() {
                @Override
                public void onAvailable(Network network) {
                    context.sendBroadcast(getNetworkAvailabilityIntent(true));
                }

                @Override
                public void onLost(Network network) {
                    context.sendBroadcast(getNetworkAvailabilityIntent(false));
                }
            };
            connectivityManager.registerNetworkCallback(builder.build(), networkCallback);
            if(isAvailable(context)){
                context.sendBroadcast(getNetworkAvailabilityIntent(true));
            } else{
                context.sendBroadcast(getNetworkAvailabilityIntent(false));
            }
        }
    }

    public void unregisterNetworkAvailability(Context context, BroadcastReceiver networkAvailabilityReceiver){
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            context.unregisterReceiver(connectivityChangeReceiver);
        } else{
            connectivityManager.unregisterNetworkCallback(networkCallback);
        }
        context.unregisterReceiver(networkAvailabilityReceiver);
    }

    public BroadcastReceiver connectivityChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(@NonNull Context context, @NonNull Intent intent) {
            if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) {
                context.sendBroadcast(getNetworkAvailabilityIntent(false));
            } else {
                context.sendBroadcast(getNetworkAvailabilityIntent(true));
            }
        }
    };

    @NonNull
    private Intent getNetworkAvailabilityIntent(boolean isNetworkAvailable) {
        Intent intent = new Intent(NETWORK_AVAILABILITY_ACTION);
        intent.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, !isNetworkAvailable);
        return intent;
    }
}

我现在如何使用每个 Activity 的 BroadcastReceiver?

【问题讨论】:

  • 在基础活动中使用广播

标签: java android android-activity broadcastreceiver android-broadcast


【解决方案1】:

我所做的是在清单上设置广播接收器:

    <receiver
        android:name=".data.sync.CatchConnectionChangesReceiver"
        android:label="Upload cached images broadcast receiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>

那我上课了:

class CatchConnectionChangesReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (Util.isNetworkAvailable()) {
            // Do whatever you want to do when network is available
        }
    }
}

接收器将从每个活动中激活,您不需要在每个活动上都注册它

在 Util.isNetworkAvailable() 中,我与您的 isAvailable() 方法中的相同

根据第一条评论更新

如果你想做这样的事情:

if (isConnected) {
   // Do something here like view.setVisibility(View.Visible)
}

您只需公开您的 isAvailable() 方法,因为它已经是静态的,您可以从任何您想要的活动中执行此操作:

if (NetworkAvailability.isAvailable(this)) {
    // Do something here like view.setVisibility(View.Visible)
}

最后这件事你不需要广播接收器

【讨论】:

  • 但是我该怎么做: if(!isConnected){noConnectionLayout.setVisibility(VIEW.VISIBLE)} 在特定活动中,以及 if(!isConnected){Toast.makeText(context, "没有互联网连接”,Toast.LENGTH_SHORT).show();在另一个活动中?
  • 这很有帮助,但是如果我想在每次网络变化时进行测试,我应该把最后一段代码放在哪里呢?如果我把它放在 onCreate() 中,它只会被调用一次
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多