Partial Wake Lock для получения широковещательных пакетов UDP, когда экран устройства выключен - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь разработать приложение для Android, которое получает широковещательные пакеты UDP, которые затем отправляет в конечную точку.Отдельный поток продолжает прослушивать широковещательные пакеты.Приложение работает нормально, когда экран устройства включен.Когда экран устройства выключен, приложение не получает эти пакеты, даже когда я получил эти блокировки: PARTIAL_WAKE_LOCK / WifiLock (WIFI_MODE_FULL_HIGH_PERF) / MulticastLock

public class MainActivity extends AppCompatActivity implements OnClickListener {

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

        pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
        if (wl == null) {
            wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myapp:sampWakeLockTag");
        }
        if (!wl.isHeld()) {
            wl.acquire();
        }
        wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if (wifiLock == null) {
            wifiLock = wifi.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
        }
        if (!wifiLock.isHeld()) {
            wifiLock.acquire();
        }
        if (multicastLock == null) {
            multicastLock = wifi.createMulticastLock("multicast_Lock");
        }
        multicastLock.setReferenceCounted(true);
        if (!multicastLock.isHeld()) {
            multicastLock.acquire();
        }

    }

    @Override
    protected void onStart() {
        udpServerThread = new UdpServerThread(UdpServerPORT);
        udpServerThread.start();
        super.onStart();
    }

    private class UdpServerThread extends Thread{

        int serverPort;
        DatagramSocket socket;

        boolean running;

        public UdpServerThread(int serverPort) {
            super();
            this.serverPort = serverPort;
        }

        public void setRunning(boolean running){
            this.running = running;
        }

        @Override
        public void run() {

            running = true;

            try {
                socket = new DatagramSocket(null);
                socket.setBroadcast(true);
                socket.bind(new InetSocketAddress("0.0.0.0",serverPort));
                String[] prevPacket = new String[0];
                while(running){
                    byte[] buf = new byte[256];
                    // receive request
                    DatagramPacket packet = new DatagramPacket(buf, buf.length);
                    socket.receive(packet);     //this code blocks the program flow
                    final String packetText = new String(buf, 0, packet.getLength());
                    jsonPacket.put("packetText", packetText);
                    // POST to endpoint
                }

            }
        }
    }

}

Я тестирую это на планшете Samsung под управлением Android Oreo,Ребята, можете ли вы направить меня в правильном направлении?Я застрял на этой проблеме некоторое время

...