2013-11-23 63 views
0

我有,在LAN接收消息的Android應用運行的服務,我的服務做工精細,當所有手機上,但是當我手動鎖定屏幕,或者它會自動鎖定我的服務沒有時間工作並沒有收到消息,有時會收到2到3條消息,但隨後又會停止。 我的服務是:服務停止在手機鎖

public class Server extends Service { 
    static String UDP_BROADCAST = "soft.b.peopleassist"; 
    public static String ip; 
    //Boolean shouldListenForUDPBroadcast = false; 
    DatagramSocket socket; 

    //Intent intent; 
    @SuppressLint("DefaultLocale") 

    public String getIpAddr() { 
      WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
      WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
      int ip = wifiInfo.getIpAddress(); 

      String ipString = String.format(
      "%d.%d.%d.%d", 
      (ip & 0xff), 
      (ip >> 8 & 0xff), 
      (ip >> 16 & 0xff), 
      (ip >> 24 & 0xff)); 

      return ipString; 
     } 





void setIP() 


    { 
     ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

     if (mWifi.isConnected()) { 

     ip="192.168.1.255"; 
     Log.i("server", "AP connected so 192"); 
     } 
     if (!mWifi.isConnected()) { 

     ip="192.168.49.255"; 
     Log.i("server", "AP not connected so"+ip); 
     } 
     } 





    private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception { 
     byte[] recvBuf = new byte[15000]; 
     if (socket == null || socket.isClosed()) { 
      socket = new DatagramSocket(port); 
     // socket.setBroadcast(true); 
     } 
     //socket.setSoTimeout(1000); 
     DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length); 
     Log.e("UDP", "Waiting for UDP broadcast"); 
     socket.receive(packet); 

     String senderIP = packet.getAddress().getHostAddress().trim(); 
     String message = new String(packet.getData()); 

     Log.e("UDP", "Got UDB broadcast from " + senderIP + ", message: " + message); 

String str=getIpAddr().trim(); 
//if(!str.equals(senderIP)) 
//{ 
    broadcastIntent(senderIP, message); 
    String[] arr = message.split(" ", 5); 
    char messagestatus = arr[1].charAt(0); 
    Log.i("UDP", String.valueOf(messagestatus)); 
    if(messagestatus=='s') 
    { 
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
     r.play(); 
    } 
    //  str=null; 

//} 
str=null; 

     socket.close(); 
    } 

    private void broadcastIntent(String senderIP, String message) { 
    Intent intent = new Intent(Server.UDP_BROADCAST); 
     intent.putExtra("sender", senderIP); 
     intent.putExtra("messages", message); 
     sendBroadcast(intent); 
    } 

    Thread UDPBroadcastThread; 

    void startListenForUDPBroadcast() { 
     UDPBroadcastThread = new Thread(new Runnable() { 
      public void run() { 
       try { 
        InetAddress broadcastIP = InetAddress.getByName(ip); //172.16.238.42 //192.168.1.255 
        Integer port = 11111; 
        while (shouldRestartSocketListen) { 
         listenAndWaitAndThrowIntent(broadcastIP, port); 
        } 
        //if (!shouldListenForUDPBroadcast) throw new ThreadDeath(); 
       } catch (Exception e) { 
        Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage()); 
       } 
      } 
     }); 
     UDPBroadcastThread.start(); 
    } 

    private Boolean shouldRestartSocketListen=true; 

    void stopListen() { 
     shouldRestartSocketListen = false; 
     if(socket!=null) 
     socket.close(); 
    } 

    @Override 
    public void onCreate() { 

    }; 

    @Override 
    public void onDestroy() { 
     stopListen(); 
     Log.i("UDP", "Service stoped"); 
    } 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     shouldRestartSocketListen = true; 

     startListenForUDPBroadcast(); 
     Log.i("UDP", "Service started"); 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

} 

回答

1

你需要掌握WifiManager.WifiLock保持wifi連接的丟失。

***從Android官方文檔COPY:

WifiLock允許應用程序保持Wi-Fi無線電清醒。通常,當用戶長時間沒有使用該設備時,Wi-Fi無線電可能會關閉。獲取WifiLock將使收音機保持工作狀態,直到鎖定釋放。多個應用程序可持有WifiLocks,和無線電將只被允許在沒有WifiLocks在任何應用程序保持關閉。

使用WifiLock之前,仔細考慮如果你的應用需要Wi-Fi接入,或通過移動網絡,如果有可能發揮作用。需要下載大文件應持有WifiLock,以確保下載將完成的程序,但其網絡使用率是偶爾或低帶寬不應該持有WifiLock以避免產生負面影響電池壽命的程序。

注意WifiLocks不能覆蓋用戶級的「Wi-Fi功能」設置,也沒有飛行模式。當Wi-Fi已經打開但設備閒置時,它們只會使收音機不能關閉。

使用WifiLock必須請求android.permission.WAKE_LOCK許可中應用的清單的一個元素的任何應用程序。