当应用程序仅在前台运行时运行 Android 广播接收器

问题描述

我的应用正在监控网络连接变化以解码离线和在线案例。在这里,我只想在应用程序处于前台时持续监控这一点。我们如何使用 broadcastReceiver 实现这一点。 我正在使用以下代码后台运行。但一旦应用关闭或在后台运行,它也能正常工作。

public class NetworkChangeReceiver extends broadcastReceiver {
    @Override
    public void onReceive(final Context context,final Intent intent) {
        boolean mIsConnected = false;
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();



        if (activeNetwork != null) {
          
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
              
                mIsConnected = true;
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
               
                mIsConnected = true;
            }
        }
        if (mIsConnected) {

            Log.d("mIsConnected11",mIsConnected+"");
        }
        else {

            Log.d("mIsConnected11",mIsConnected+"");

        }
    }

提前致谢!

解决方法

ConnectivityManager.NetworkCallback 对我来说就像一个魅力,它会在我关闭互联网或断开 wifi 连接以及重新连接时立即通知我。

然后我建议在您的应用程序类中使用它,然后您可以在您的基本活动中注册本地广播接收器。

    private ConnectivityManager.NetworkCallback callback;
    
@Override
    public void onCreate() {
        super.onCreate();
        this.initNetworkMonitor();
    }

    void initNetworkMonitor(){
            this.callback = new ConnectivityManager.NetworkCallback() {
                @Override
                public void onAvailable(@NonNull Network network) {
                    super.onAvailable(network);
                    Log.d("UE_MONITOR","onAvailable");
                    Intent intent=new Intent(Constants.NETWORK_STATE_CHANGE);
                    intent.putExtra(Constants.NETWORK_STATE_CHANGE,NetworkState.AVAILABLE);
                    LocalBroadcastManager.getInstance(AppController.this).sendBroadcast(intent);
                }
    
                @Override
                public void onLosing(@NonNull Network network,int maxMsToLive) {
                    super.onLosing(network,maxMsToLive);
                    Log.d("UE_MONITOR","onLosing");
                    Intent intent=new Intent(Constants.NETWORK_STATE_CHANGE);
                    intent.putExtra(Constants.NETWORK_STATE_CHANGE,NetworkState.LOSING);
                    LocalBroadcastManager.getInstance(AppController.this).sendBroadcast(intent);
                }
    
                @Override
                public void onLost(@NonNull Network network) {
                    super.onLost(network);
                    Log.d("UE_MONITOR","onLost");
                    Intent intent=new Intent(Constants.NETWORK_STATE_CHANGE);
                    intent.putExtra(Constants.NETWORK_STATE_CHANGE,NetworkState.LOST);
                    LocalBroadcastManager.getInstance(AppController.this).sendBroadcast(intent);
                }
    
                @Override
                public void onUnavailable() {
                    super.onUnavailable();
                    Log.d("UE_MONITOR","onUnavailable");
                    Intent intent=new Intent(Constants.NETWORK_STATE_CHANGE);
                    intent.putExtra(Constants.NETWORK_STATE_CHANGE,NetworkState.UNAVAILABLE);
                    LocalBroadcastManager.getInstance(AppController.this).sendBroadcast(intent);
                }
            };
            ConnectivityManager manager=((ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE));
            manager.registerNetworkCallback(new NetworkRequest.Builder().build(),callback);
        }

NetworkState 是一个枚举,您可以根据自己的喜好进行设置。