Android:Como verificar se o aplicativo foi colocado em segundo plano para evitar verificações desnecessárias do BroadcastReceiver
-
21-12-2019 - |
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.
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.