2016-09-07 6 views
0

私はTCPソケット接続を実行し、いくつかのデータを繰り返し送信する有界サービスを持っています。デバイスがスリープ状態になると、スレッドが停止し、データが送信されます。私は間違って何をしていますか?TCPSocketサービスはデバイススリープモードで停止します

私の知る限り、メインアクティビティにバインドされたサービスはSTART_STICKYである必要がありますが、それでも問題は解決しません。

サービスが有界と接続ボタンクリックが AsyncTaskでソケットの送信スレッドを開始している

MainActivityクラス:

public class CTIController extends Service implements ICTIController { 

private final IBinder mBinder = new LocalBinder(); 

public TryConnect(String ipAddress, int port) throws IOException{ 

    this.ClientSocket = new Socket(); 
    this.ClientSocket.connect(new InetSocketAddress(ipAddress, port), 10000); 
    //... start sending data repeatedly 

} 

public class LocalBinder extends Binder { 
    public CTIController getService() { 
     return CTIController.this; 
    } 
} 

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

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 

     return START_STICKY; 
    } 
} 

そして、私のマニフェスト:ソケットの接続を制御するCTIControllerサービスを

public class MainActivity extends AppCompatActivity { 

public MainActivity() { 
    super(); 
} 

private CTIController CTIControl; 
protected boolean mBound = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 

    Intent intent = new Intent(this, CTIController.class); 
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    if (mBound) { 
     //disconnect socket and stop sending thread   
     CTIControl.GetControllersFactory().GetCTI2Controller().OnDisconnect();   
     unbindService(mConnection); 
     mBound = false; 
    } 
} 

private ServiceConnection mConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     LocalBinder binder = (LocalBinder) service; 
     CTIControl = binder.getService(); 
     mBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     mBound = false; 
    } 
}; 

/** Callled when the user clicks connect button */ 
public void ConnectClick(View view) {      
    new ConnectOperation().execute("");  
} 

private class ConnectOperation extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     EditText ip = (EditText)findViewById(R.id.ip); 
     EditText port = (EditText)findViewById(R.id.port); 

     //start socket connection and run sending thread 
     CTIControl.TryConnect(ip.getText().toString(), port); 

     return "Executed"; 
    } 
} 

ファイル:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.PERSISTENT_ACTIVITY" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> 

<application 
    android:allowBackup="true" 
    android:persistent="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <service android:name=".controller.CTIController" android:exported="false"/> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

答えて

1

サービスのonStartCommandを変更してください。代わりにreturn START_STICKY;

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 

     return START_REDELIVER_INTENT; 
    } 
} 
+0

いや、申し訳ありませんが、やはり同じ結果の

return START_REDELIVER_INTENT;。 –

関連する問題