0

저는 소켓 io를 사용하여 실시간 택시 응용 프로그램을 구현 중이며 드라이버 응용 프로그램 구현시 소켓 문제를 처리하고 있습니다. 사용자가 장치 화면을 닫더라도 소켓 연결을 유지하려고합니다. android에 대한 특정 권한이 있습니까?화면을 닫은 후 몇 분 안에 안드로이드가 소켓 연결을 닫습니다.

소켓을 유지하는 것에 대한 제안 사항이 있습니까?

내 허락 목록 공유.

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.FLASHLIGHT"/> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
<uses-permission android:name="ACCESS_WIFI_STATE"/> 
<uses-permission android:name="ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="READ_PHONE_STATE"/> 
<uses-permission android:name="SYSTEM_ALERT_WINDOW"/> 
<uses-permission android:name="RECEIVE_BOOT_COMPLETED"/> 
<uses-permission android:name="REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> 

내 소켓 연결 및 소켓 처리 코드는 다음과 같습니다. 연결을 위해 :

public Observable<SocketConnection.State> connect(String customerId) { 
    if (mUserId == null || mUserType == null) { 
     return null; 
    } 
    if (mAddress == null) { 
     mAddress = Constants.DEFAULT_SOCKET_ADDRESS; 
    } 
    mNamespace = Constants.DEFAULT_SOCKET_NAMESPACE; 
    if (customerId != null) { 
     mNamespace = Constants.CUSTOMER_SOCKET_NAMESPACE; 
    } 
    if (socket != null) { 
     socket.disconnect(); 
     removeSocketListeners(); 
    } 

    try { 
     socket = IO.socket(mAddress + mNamespace, getOptions(customerId)); 
     setSocketListeners(); 
     startInternalPong(); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
    socket.connect(); 
    return mConnectionObservable; 
} 

분리를 들면 :

public Observable<SocketConnection.State> disconnect() { 

    if (socket != null) { 
     removeSocketListeners(); 
     socket.disconnect(); 
    } 
    return mConnectionObservable; 
} 

연결 관찰자 :

private Observable<SocketConnection.State> mConnectionObservable = Observable.create(new ObservableOnSubscribe<SocketConnection.State>() { 

    @Override 
    public void subscribe(final ObservableEmitter<SocketConnection.State> observableEmitter) throws Exception { 
     mConnectionObservableEmitter = observableEmitter; 

     observableEmitter.setCancellable(new Cancellable() { 
      @Override 
      public void cancel() throws Exception { 
       mConnectionObservableEmitter = null; 
      } 
     }); 
    } 

}); 
+2

당신이 소켓 취급에 관한 코드를 게시 할 수 있습니까? –

+0

앱이 포 그라운드에 있지 않을 때 연결을 유지하는 것은 매우 나쁜 습관입니다. 이것을하기위한 또 다른 방법이 있어야합니다. – DevMike

답변