У меня есть вещатель, который получает сообщение о завершении загрузки и запускает службу, которая подключается к сокету сервера. Если я запускаю службу из основного действия, к которому может подключиться сокет, но когда служба запускается из широковещательного приемника, она не может подключиться, просто возникает исключение ожидания и затем истекает время ожидания.
public void onReceive(Context context, Intent intent) {
if (intent.getAction().compareTo(Intent.ACTION_BOOT_COMPLETED) == 0){
Log.d(TAG, "MyReciever.onReceive(ACTION_BOOT_COMPLETED)");
context.startService(new Intent(context, MyService.class));
}else if(intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0) {
Log.d(TAG, "MyReciever.onReceive(ACTION_TIME_TICK)");
}else{
Log.d(TAG, "MyReciever.onReceive(" + intent.getAction() + ")");
}
}
Это мой телеведущий. Я вижу в logcat, что служба запущена, но соединение с сокетом не удается .. Если я делаю это в основной деятельности ..
startService(new Intent(this, MyService.class));
Вот простой код сокета, который находится в MyService в Handler и вызывается с использованием этого обработчика.
private boolean ConnectSocket() {
try {
Log.d(TAG, "Connecting to server ...");
socket = new Socket();
SocketAddress socketAddress=new InetSocketAddress("192.168.1.6", 5656);
socket.connect(socketAddress, 2000);
socketWriter = new PrintWriter(socket.getOutputStream(), true);
Log.d(TAG,"Connected to server!");
return true;
} catch (Exception ex) {
Log.e(TAG, "Error in connecting socket");
Log.e(TAG, ex.getStackTrace().toString());
return false;
}
}
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
this.ConnectSocket();
}
}
Вот служба
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "MySerivce.onCreate()");
registerReceiver(new MyReceiver(), new IntentFilter(Intent.ACTION_TIME_TICK));
HandlerThread thread = new HandlerThread("ServiceStartArguments",
android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(serviceLooper);
}
public int onStartCommand(Intent intent, int flags, int startId) {
if(!this._started) {
this._started = true;
Log.d(TAG, "MySerivce.onStartCommand()");
Message msg = serviceHandler.obtainMessage();
msg.arg1 = startId;
serviceHandler.sendMessage(msg);
}
return START_STICKY;
}
Вот эта строка стека
2020-04-21 13:28:05.987 8275-8315/x.y.z E/TechCapture: Error in connecting socket
java.net.SocketTimeoutException: failed to connect to /192.168.1.6 (port 5656) from /192.168.1.3 (port 37956) after 2000ms
at libcore.io.IoBridge.connectErrno(IoBridge.java:185)
at libcore.io.IoBridge.connect(IoBridge.java:129)
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:137)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)
at x.y.z.MyService$ServiceHandler.ConnectSocket(MyService.java:80)
at x.y.z.MyService$ServiceHandler.handleMessage(MyService.java:45)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.os.HandlerThread.run(HandlerThread.java:65)
Тогда сокет может подключиться к серверу как обычный. Есть ли какое-либо ограничение android на месте?