如何在 Android 中使用 Socket 作为 Intent extra?
How to use Socket as Intent extra in Android?
我想启动一项服务,该服务需要通过打开的 Socket
连接发送和接收某些内容。那Socket
就是一个对象的字段,像这样:
public class A implements Serializable {
Socket socket;
}
我正计划将此对象作为 Intent extra 传递:
A a = getInstanceOfA(); // Get an instance of A from somewhere.
intent.putExtra("A", a);
当然,A
是可序列化的,因为它需要序列化,以便将其作为额外的意图。可是等等。套接字不可序列化。
我该如何解决?
- 我可以将套接字标记为
transient
,这样它就不会被序列化吗?或者我会不会在这样做时不再能够通过该套接字发送一些字节?
- 或者我应该停止使用
Service
和 BroadcastReceiver
并使用其他方法吗?
- 或者有其他方法可以实现上述目标吗?
PS: 我已经read something 关于在Activity
之间转移InputStream
和Socket
,但是给出的答案不是很清楚。
如果没有一些可能肮脏的技巧,这是不可能的。
正如 Chris Stratton – 归功于他 – 提到的那样,可以通过静态对象或单例检索来绕过该问题。
或者,可以更改应用程序结构,让服务自己创建或控制 Socket。
我想启动一项服务,该服务需要通过打开的 Socket
连接发送和接收某些内容。那Socket
就是一个对象的字段,像这样:
public class A implements Serializable {
Socket socket;
}
我正计划将此对象作为 Intent extra 传递:
A a = getInstanceOfA(); // Get an instance of A from somewhere.
intent.putExtra("A", a);
当然,A
是可序列化的,因为它需要序列化,以便将其作为额外的意图。可是等等。套接字不可序列化。
我该如何解决?
- 我可以将套接字标记为
transient
,这样它就不会被序列化吗?或者我会不会在这样做时不再能够通过该套接字发送一些字节? - 或者我应该停止使用
Service
和BroadcastReceiver
并使用其他方法吗? - 或者有其他方法可以实现上述目标吗?
PS: 我已经read something 关于在Activity
之间转移InputStream
和Socket
,但是给出的答案不是很清楚。
如果没有一些可能肮脏的技巧,这是不可能的。
正如 Chris Stratton – 归功于他 – 提到的那样,可以通过静态对象或单例检索来绕过该问题。
或者,可以更改应用程序结构,让服务自己创建或控制 Socket。