Determinação e monitoramento do estado e do tipo da ancoragem

Dispositivos Android podem ser ancorados em diversos tipos de bases. Isso pode incluir bases no carro ou em casa e bases digitais ou analógicas. O estado da base normalmente está vinculado ao estado de carregamento porque muitas bases fornecem energia para os dispositivos ancorados.

A forma como o estado da base do telefone afeta a taxa de atualização depende do aplicativo. É possível optar pelo aumento da frequência de um aplicativo de um centro esportivo quando o mesmo está na base do desktop ou desativar completamente as atualizações se o dispositivo está na dock do carro. Por outro lado, é possível maximizar as atualizações quando está na base do carro se o serviço de segundo plano está atualizando as condições do tráfego.

O estado da base também é transmitido como uma Intent fixa, permitindo consultar se o dispositivo está ancorado ou não e em que tipo de base.

Determinar o estado atual da ancoragem

Os detalhes do estado da base são incluídos como um extra na transmissão fixa da ação ACTION_DOCK_EVENT. Por ser uma fixação, não é preciso registrar um BroadcastReceiver. Basta chamar registerReceiver() passando null como o receptor de transmissão, como mostrado no snippet a seguir.

IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
Intent dockStatus = context.registerReceiver(null, ifilter);

O estado de ancoragem atual pode ser extraído do extra EXTRA_DOCK_STATE:

int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1);
boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;

Determinar o tipo de base atual

Se um dispositivo está ancorado, isso pode acontecer em um dos quatro tipos diferentes de base:

  • Carro
  • Mesa
  • Mesa de baixa capacidade (analógica)
  • Mesa de alta capacidade (digital)

Observe que as duas últimas opções só foram introduzidas no Android no nível da API 11, portanto, é uma prática recomendada conferir todas as três opções, onde o interesse é no tipo de base, não se ela é digital ou analógica, especificamente:

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;

Monitorar mudanças no estado ou tipo de base

Sempre que o dispositivo está ancorado ou não, a ação ACTION_DOCK_EVENT é transmitida. Para monitorar alterações no estado da base do dispositivo, basta registrar um receptor de transmissão no manifesto do aplicativo, como mostrado no snippet abaixo:

<action android:name="android.intent.action.ACTION_DOCK_EVENT"/>

É possível extrair o tipo e o estado da base dentro da implementação do receptor usando as mesmas técnicas descritas na etapa anterior.