Android无法从后台服务连接套接字

时间:2020-04-21 06:54:45

标签: android sockets broadcastreceiver android-service

我有一个广播公司,它可以接收启动完成广播并启动连接到服务器套接字的服务。如果我从主要活动启动该服务,则套接字可以连接,但是从广播接收器启动该服务时,它无法连接,只需等待,然后发生超时异常即可。

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中并使用该处理程序调用的简单套接字代码。

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;
        }

这是堆栈strace

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限制?

0 个答案:

没有答案
相关问题