Register now for Android Dev Summit 2019!

Mudança de privacidade do Android Q: restrições ao início de atividades em segundo plano

A partir do Android Q Beta 4, essa alteração tem as seguintes propriedades:

  • Afetará seu app se você iniciar atividades sem interação do usuário.
  • Reduzirá os problemas usando atividades acionadas por notificação.
  • Desativará as restrições ativando a opção de desenvolvedor Permitir início de atividades em segundo plano.

Queremos receber seu feedback. Relate os problemas encontrados ao usar esse recurso no programa Beta do Android Q.

O Android Q impõe restrições quanto ao momento em que apps podem iniciar atividades. Essa mudança de comportamento ajuda a minimizar as interrupções para o usuário e dá a ele mais controle sobre o que é exibido na tela.

Essa mudança de comportamento se aplica a todos os apps que operam no Android Q, mesmo os que são destinados ao Android 9 (API de nível 28) ou versões anteriores. Além disso, mesmo que seu app seja destinado ao Android 9 ou versão anterior e tenha sido instalado originalmente em um dispositivo com o Android 9 ou versão anterior, a mudança de comportamento ainda entrará em vigor após o upgrade do dispositivo para o Android Q.

No entanto, desde que seu app inicie atividades como resultado direto da interação do usuário, ele provavelmente não será afetado por essa mudança. Na verdade, a maioria dos apps não será afetada.

Condições que permitem o início das atividades

Apps que operam no Android Q podem iniciar atividades apenas quando uma ou mais das condições a seguir forem atendidas:

Mensagens de aviso

Se seu app estiver executando a versão Beta mais recente do Android Q e tentar iniciar uma atividade em segundo plano, a plataforma enviará uma mensagem de aviso ao logcat e exibirá o seguinte:

    Background activity start from package-name blocked.
    

As restrições associadas a iniciar atividades em segundo plano no Android Q são semelhantes à maneira como o sistema bloqueia o início de atividades após o dispositivo ter entrado em um estado de fixação de tela.

Criar notificações para eventos que dependem de horários

Em quase todos os casos, os apps em segundo plano precisam criar notificações para fornecer informações ao usuário em vez de iniciar uma atividade diretamente.

Em casos específicos, seu app pode precisar chamar a atenção do usuário com urgência, por exemplo, para um alarme ativado ou uma chamada recebida. É possível que você tenha configurado seu app para iniciar uma atividade em segundo plano para essa finalidade. Para estipular o mesmo comportamento em um dispositivo que opera no Android Q, siga as etapas exibidas nas seções a seguir.

Criar uma notificação de prioridade alta

Ao criar a notificação, inclua um título descritivo e uma mensagem. Como opção, você também pode fornecer um intent de tela cheia.

Um exemplo de notificação aparece no snippet de código a seguir:

    val fullScreenIntent = Intent(this, CallActivity::class.java)
    val fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
        fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT)

    val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("Incoming call")
        .setContentText("(919) 555-1234")
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setCategory(NotificationCompat.CATEGORY_CALL)

        // Use a full-screen intent only for the highest-priority alerts where you
        // have an associated activity that you would like to launch after the user
        // interacts with the notification. Also, if your app targets Android Q, you
        // need to request the USE_FULL_SCREEN_INTENT permission in order for the
        // platform to invoke this notification.
        .setFullScreenIntent(fullScreenPendingIntent, true)

    val incomingCallNotification = notificationBuilder.build()
    

Exibir a notificação para o usuário

Ao exibir sua notificação para o usuário, ele pode escolher confirmar ou dispensar o alerta ou lembrete do app, com base no contexto atual. Por exemplo, o usuário pode escolher se aceita ou recusa uma chamada telefônica recebida.

Se sua notificação for contínua, como uma chamada telefônica recebida, associe a notificação a um serviço em primeiro plano. O snippet de código a seguir mostra como exibir uma notificação associada a um serviço em primeiro plano:

    // Provide a unique integer for the "notificationId" of each notification.
    startForeground(notificationId, notification)
    

Benefícios das notificações

Esse sistema de alerta e lembrete baseado em notificações oferece diversas vantagens para os usuários:

  • Ao utilizar o dispositivo, o usuário recebe uma notificação de alerta que permite que ele atenda ou recuse a chamada ou que dispense o alarme. O usuário mantém o contexto atual e tem controle sobre o conteúdo exibido na tela.
  • Sua chamada recebida ou seu alarme respeita as regras de Não perturbe do usuário. Por exemplo, quando a opção "Não perturbe" está ativada, os usuários podem permitir chamadas apenas de contatos específicos ou chamadas repetidas.
  • Quando a tela do dispositivo está desligada, seu intent de tela cheia é iniciado imediatamente.
  • Na tela Configurações do dispositivo, o usuário pode ver quais apps enviaram notificações recentemente, inclusive de canais de notificação específicos. O usuário pode controlar as preferências de notificação nessa tela.

Desativar a mudança de comportamento

Recomendamos que você mantenha essa mudança de comportamento ativada. Dessa forma, você pode ter mais certeza de que os usuários poderão continuar interagindo com seu app da forma esperada quando o Android Q for instalado nos dispositivos deles.

No entanto, se essa mudança impedir você de testar um fluxo de trabalho importante no seu app, é possível desativar a mudança de comportamento durante os testes concluindo uma das tarefas a seguir:

  • Navegue para Configurações > Opções do desenvolvedor e ative a opção Permitir início de atividades em segundo plano.
  • Em uma janela de terminal, execute este comando:

        adb shell settings put global background_activity_starts_enabled 1