Android:Como verificar se o aplicativo foi colocado em segundo plano para evitar verificações desnecessárias do BroadcastReceiver

StackOverflow https://stackoverflow.com//questions/22036634

Pergunta

A questão é simplesmente fácil:

Explicação:

O que estou fazendo é ter um BroadcastReceiver que é chamado toda vez que o estado do GPS muda (habilitado ou desabilitado) e avisa ao usuário se o GPS foi desabilitado, convidando-o a reativá-lo (lançando o intent relativo).

Eu habilito (e eventualmente desabilito) na atividade raiz do meu aplicativo, dessa forma ele será chamado para cada atividade infantil.

Meu problema surge quando o usuário pressiona o botão HOME (por exemplo) ou abre outro aplicativo e desativa o GPS. A notificação ainda aparece trazendo meu aplicativo para frente.

O código

Receptor de radiodifusão

public class GPSStatusReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String provider = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

        if (!provider.contains(LocationManager.GPS_PROVIDER)) {
            Intent gpsIntent = new Intent(context, GPSDialogActivity.class);
            gpsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            gpsIntent.putExtra(GPSDialogActivity.GPS_DIALOG_TITLE, "Attivazione GPS");
            gpsIntent.putExtra(GPSDialogActivity.GPS_DIALOG_MESSAGE, "E' necessario abilitare il GPS. Cliccare su 'Usa satelliti GPS'.");
            context.startActivity(gpsIntent);
        }
    }
}

Habilitar/desabilitar a verificação do receptor em onCreate e onDestroy da atividade raiz

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    *
    *
    Stuff
    *
    *

    ComponentName component=new ComponentName(this, GPSStatusReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}

@Override
protected void onDestroy() {

    *
    *
    Stuff
    *
    *
    *

    ComponentName component=new ComponentName(this, GPSStatusReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
    super.onDestroy();
}

Necessidades primárias

O que eu precisaria é desabilitar a chamada do BroadcastReceiver quando o aplicativo for para segundo plano e habilitá-la quando o aplicativo voltar para a frente

Qual seria o melhor

Seguindo as necessidades acima:

se o usuário desativar o GPS quando o aplicativo estiver em segundo plano (desta forma ele não deverá receber nenhuma notificação), quando ele trará o aplicativo de volta para a frente eu o intercepto e faço uma verificação manual do estado do GPS e eventualmente notifico para o usuário habilite o GPS.

Foi útil?

Solução

Esta é uma das razões pelas quais os fragmentos são úteis.Se você tiver um Activity gerenciando vários fragmentos, o onPause() e onResume() dessa atividade lidará bem com o registro e o cancelamento do registro desse receptor, sem a complicação das atividades infantis.

Exceto isso, eu recomendo subclassificar Activity em "GpsReceiverActivity", manipulando o registro e cancelamento do registro do receptor ali, e usando isso como a classe base de todas as outras atividades pelas quais você deseja que a transmissão seja recebida.

Pergunta bem escrita, aliás.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top