用启用的电池节省电池,在Android Nougat或Android Oreo上管理Internet连接



我在用启用的电池避免设备解锁设备时在新的Android版本上正确管理Internet连接时遇到麻烦。

android.permision.internet和android.permission.access_network_state权限被添加到清单文件中。

i注册广播收到了收到connectivitionmanager.connectivition_action inter Actions启动活动并在停止时取消注册。当手动禁用启用Wi-Fi或蜂窝连接时,它的工作原理很完美。

我也使用方法检查连接

   private boolean isNetworkAvailable() {
      ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
      NetworkInfo networkInfo = conn.getActiveNetworkInfo();
      return null != networkInfo && networkInfo.isConnected();
   }

每次解锁电话并且我的应用程序在前景上iSnetworkavailable()方法返回已连接,但不是。

我尝试实现诸如PING逻辑之类的东西,但是解锁手机后,我一直不会连接到电池节省电池模式

    try {
        InetAddress inetAddress = InetAddress.getByName("www.google.com");
        if (inetAddress.isReachable(1000)) {
            // IS CONNECTED
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    // IS NOT CONNECTED

有人知道很好的解决方案如何处理Android 7&Android 8?

谢谢

源代码活动:

public class MainActivity extends AppCompatActivity implements ConnectionManager.ConnectionStatusListener {
private TextView textView;
private ConnectionManager cm;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.textView);
    cm = new ConnectionManager(getBaseContext());
    //Show by default is disconnected
    disconnected();
}
@Override
protected void onStart() {
    super.onStart();
    cm.register(this);
}
@Override
protected void onStop() {
    super.onStop();
    cm.unregister(this);
}

// ConnectionManager.ConnectionStatusListener  implementation
@Override
public void connected() {
    textView.setText("Connected");
    textView.setTextColor(Color.GREEN);
}
@Override
public void disconnected() {
    textView.setText("Disconnected");
    textView.setTextColor(Color.RED);
}
}

我对连接管理器的实施:

class ConnectionManager {
private final Context context;
private final Object syncObj = new Object();
private final LinkedList<ConnectionStatusListener> listeners = new LinkedList<>();
private final Handler uiHandler;
private final Handler ioHandler;

private final BroadcastReceiver connectivityActionBR = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateConnStatus();
    }
};
private final Runnable pingRunnable = new Runnable() {
    @Override
    public void run() {
        try {
            InetAddress inetAddress = InetAddress.getByName("www.google.com");
            if (!inetAddress.isReachable(1000)) {
                notifyListeners(false);
                startPingServerDelayed(500);
            } else {
                notifyListeners(true);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
};
public ConnectionManager(Context context) {
    this.context = context;
    uiHandler = new Handler();
    HandlerThread handlerThread = new HandlerThread("checkInternetConnectionThread");
    handlerThread.start();
    ioHandler = new Handler(handlerThread.getLooper());
    // TODO: 9/18/17 add destroy to stop threadHandler
}

public void register(ConnectionStatusListener listener) {
    synchronized (syncObj) {
        if (!listeners.contains(listener)) {
            listeners.add(listener);
        }
        registerBR();
    }
}
public void unregister(ConnectionStatusListener listener) {
    synchronized (syncObj) {
        listeners.remove(listener);
    }
    unregisterBR();
    stopPingServer();
}

private void registerBR() {
    context.registerReceiver(connectivityActionBR, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
private void unregisterBR() {
    context.unregisterReceiver(connectivityActionBR);
}
private void notifyListeners(final boolean isConnected) {
    Log.e("---", "isConnected=" + isConnected);
    uiHandler.post(new Runnable() {
        @Override
        public void run() {
            synchronized (syncObj) {
                for(ConnectionStatusListener listener : listeners) {
                    if (isConnected) {
                        listener.connected();
                    } else {
                        listener.disconnected();
                    }
                }
            }
        }
    });
}
private void updateConnStatus() {
    if (!isNetworkAvailable()) {
        stopPingServer();
        notifyListeners(false);
    }
    startPingServerNow();
}
private void startPingServerDelayed(long millis) {
    ioHandler.postDelayed(pingRunnable, millis);
}
private void startPingServerNow() {
    ioHandler.post(pingRunnable);
}
private void stopPingServer() {
    ioHandler.removeCallbacks(pingRunnable);
}
private boolean isNetworkAvailable() {
    ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = conn.getActiveNetworkInfo();
    return null != networkInfo && networkInfo.isConnectedOrConnecting();
}

public interface ConnectionStatusListener {
    void connected();
    void disconnected();
}
}

在OnCreate()中注册您的广播,并在OnDestroy()中取消注册。让我,您必须工作。

最新更新