Android 设备可以接在不同类型的 Dock 底座中,其中包括车载的,家用的,以及数字的和模拟的。许多 Dock 基座都能为接在其上面的设备供电,所以,“dock-state”(Dock状态)也通常是接入设备的充电状态。
Dock 状态的变化如何影响您应用程序的服务更新速度取决于您应用程序的设计。假如是一个获取体育赛况的应用程序,那么在 “desktop dock” 状态时,可以提高其数据的更新频率,而当在 “car docked” 状态时,可以完全禁用数据的更新。相反,假如该应用程序是用来获取当前交通路况的,那么就应当在“car docked” 状态时选择最大限度提高数据的更新速度。
系统会广播 “sticky” 类型的 Dock 状态通知 Intent,您可以通过该 Intent 来查询设备当前是否在 Dock 状态,以及具体的 Dock 类型。
获得当前的 Dock 状态
Dock 状态的详细信息可以从 Action 为 ACTION_DOCK_EVENT 中的广播数据中取得,因为广播类型是 “sticky”的,您不需要自己定义 BroadcastReceiver ,只需要调用 registerReceiver() 方法,并且传入空的参数null就可以了。
该方法的返回值 intent 就包括了当前 Dock 状态的详细信息。
示例代码:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT); Intent dockStatus = context.registerReceiver(null, ifilter);
您可以通过键值 EXTRA_DOCK_STATE 来取得当前的 Dock 状态。
示例代码:
int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1); boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;
获得当前的Dock 类型
如果设备当前在Dock状态,那么目前支持的Dock类型如下:
- Car (车载)
- Desk(家用,桌面)
- Low-End (Analog) Desk (低端模拟)
- High-End (Digital) Desk (高端数字)
请注意后面的两种Dock类型只支持Android API Level 11以上,所以较好的方法是只需要区分大的 dock 类型,而不用去具体关注是数字的,还是模拟的。
示例代码:
boolean isCar = dockState == EXTRA_DOCK_STATE_CAR; boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK || dockState == EXTRA_DOCK_STATE_LE_DESK || dockState == EXTRA_DOCK_STATE_HE_DESK;
监测 Dock 状态和类型的变更
每当 Andoid 设备在 Dock 和非 Dock 状态之间切换的时候(即设备接入底座和从底座拔出),系统就会广播 Action 为 ACTION_DOCK_EVENT 的广播。要想在应用程序中捕捉这种状态的变化,您只需要注册一个自定义的广播接收器Receiver就可以了。
示例代码:
<action android:name="android.intent.action.ACTION_DOCK_EVENT"/>
您可以在Receiver的代码实现中获取当前Dock的详细信息,具体方法参照前面的步骤。
参考文摘:
http://developer.android.com/training/monitoring-device-state/docking-monitoring.html