Android 平台默认仅支持一个PDP,即某个时刻只能打开一个数据连接。比如典型的一个用例是,当用户有 WiFi 接入的时候,可以优先使用 WiFi,否则使用移动数据连接(比如GPRS),当有 MMS 等特殊应用需要时,会自动切换到 MMS 专用的连接(很多运营商都会提供专门的 MMS 连接设置,在实际的 2G 网络中也是一个 GPRS 连接),等 MMS 数据收发完毕后再切换回 WiFi 或者是 GPRS 连接。这种设计可以封装并简化连接管理,应用开发者只需要通过设置一个 listener 或者 receiver 来监听 网络的切换以及网络状态的变化即可。
但是这种设计在某些现实环境中可能并不适用,有时候几个应用可能需要独立运行并且同时通过不同的网关从网络侧收发数据。OPhone 平台实现了多 PDP 复用的功能,不同的应用可以根据自身需要,通过 DataConnection 接口打开不同的网络连接,通过这种方式我们就可以在浏览网页的同时接收 MMS。
下面是一段示例代码,我们在代码注释中说明如何使用 DataConnection 的相关接口。
以下是一个典型的数据连接监听接口,需要实现两个接口来分别处理打开数据连接的(异步)返回结果,以及数据连接的状态变化。由于这些回调函数都不是运行在应用的主线程(即通常情况下的 UI 线程)中的,所以最好通过 android.os.Handler 的 post 接口将相应的处理函数挂到 Activity 的缺省消息队列中去,通过这种方式就可以让自己的处理函数在主线程中得到执行了。
关于数据连接的更详细信息和其它接口更参考 OPhone 的 SDK 文档。在OPhone平台上,某一个数据连接是通过引用计数来进行不同应用之间的复用的,具体的一个用例是,假设有3个应用A,B,C需要打开同一个数据连接,那么系统只会在第一个请求时激活 PDP ,同时在最后一个关闭请求时在去激活这个 PDP ,以此保证3个应用都能无缝使用这个数据连接。当应用忘记通知系统关闭数据连接时,系统会通过 Android binder 的机制在应用的进程退出时自动为其减少一个引用计数,以保证 PDP 被正确去激活。
使用OPhone 数据连接的另外一个作用是能够保证应用在多 PDP 的情况下能通过正确的网络设备(这种情况下一般存在一个以上的网络设备)与网络侧通信。没有调用OPhone数据连接的应用理论上也能在 PDP 已激活的情况下与网络侧通信,只是这些通信只能依赖于平台的缺省路由机制。
由于 Android 平台在装载应用时有相关的权限检查, 所以最后不要忘了在应用的 AndroidManifest.xml 中声明如下权限:
举例来说,一个优秀的网络应用往往还应该考虑如下问题:
- 是否有网络状态监听机制,比如连接中断时自动重连等
- 是否有足够以及合适的错误处理机制,因为网络操作中往往会产生各种各样的异常
- 是否考虑到网络延迟,网络带宽,以及负载均衡等问题,比如可以将数据加载放到后台线程执行,同时在 UI 上优先向用户呈现已得到的部分数据
- 此外还有用户信息的本地保存和恢复,安全机制等问题