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