检测网络状态变化并从广播接收器启动服务

时间:2014-07-13 22:07:17

标签: android

我编写了以下代码,用于检测BroadcastReceiver中的网络状态。我在网络可用时启动服务,并在网络不可用时停止服务。

我有以下类级变量。

private boolean IsNetworkAlreadyConnected = false;

在主类的onCreate方法中,如果互联网可用,我将启动该服务。

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

    if (InternetConnectivity.isConnected(MainActivity.this)) {
                IsNetworkAlreadyConnected = true;

                Intent timerIntent = new Intent(getBaseContext(), InActivityTimer.class);
                startService(timerIntent);
            }
}

及以下是我在同一类中的BroadcastReceiver的代码,

public class mConnectivityCheckReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        if (action.equals("android.net.conn.CONNECTIVITY_CHANGE")) {

            try {
                boolean networkAvailable = InternetConnectivity.isConnected(context);

                if (networkAvailable) {
                    if (!IsNetworkAlreadyConnected) {   
                        Intent timerIntent = new Intent(getBaseContext(), InActivityTimer.class);
                        startService(timerIntent);
                        IsNetworkAlreadyConnected = true;
                    } 
                    else {
                        Log.d("KC_HomeActivity", "Network was already connected. No need to start service again.");
                    }
                }
                else {

                    Log.d("KC_HomeActivity", "Network Disconnected. Service Stopped.");
                    IsNetworkAlreadyConnected = false;
                    Intent timerIntent = new Intent(getBaseContext(), InActivityTimer.class);
                    stopService(timerIntent);
                }
            }
            catch (Exception e) {
            }
        }
    }
};

当移动数据和Wifi都打开时,服务从onCreate方法启动,并且不会在BroadcastReceiver中再次启动,但是当我关闭Wifi时,Android会将网络模式更改为移动数据,但几秒钟就会出现没有互联网连接,服务停止然后再次启动。我不想这样做。如果只有连接,则应停止服务。如果网络正在从Wifi转移到移动数据,则不应停止服务。

注意:要检查我正在使用的互联网连接,

NetworkInfo info = InternetConnectivity.getNetworkInfo(context);
return (info != null && info.isConnectedOrConnecting()); 

1 个答案:

答案 0 :(得分:2)

网络连接并不精确。你应该放松一下,否则你会把头发拉出来。

我会从广播中实现平滑功能。当您收到连接更改通知时,请将超时设置为15秒。那时,检查您的状态,然后启动,停止或不执行任何操作。如果另一个广播进入,清除第一个并重置另外15秒。这将使设备有时间重新连接。