onStart: essência, visibilidade da Activity na tela Android

Autor: IT Sectr Publicado: 2026-03-04 Tempo de leitura: 9 min

onStart é um método do ciclo de vida do Android que é chamado quando uma Activity ou Fragment se torna visível para o usuário. Neste momento, a tela aparece no display do dispositivo, mas ainda não pode interagir com o usuário — o foco de entrada está ausente até que onResume seja chamado. O método onStart é ideal para registrar listeners do sistema, conectar-se a serviços de geolocalização e iniciar animações que devem funcionar enquanto o componente estiver visível na tela. Saiba mais sobre o ciclo de vida completo da Activity no artigo Activity Lifecycle.

Pontos principais

  • onStart — chamado quando Activity ou Fragment se torna visível na tela; precede onResume
  • Registro de listeners — BroadcastReceiver, LocationListener, SensorListener registram em onStart e cancelam em onStop
  • Animações — iniciar animações que devem funcionar enquanto a tela estiver visível; pausar em onStop
  • Serviços vinculados — conectar a serviços cliente-servidor via bindService em onStart, desconectar em onStop
  • onStart vs onResume — onStart = visibilidade, onResume = foco + interação; diferentes níveis de atividade da tela
  • Fragment.onStart — chamado após Activity.onStart, quando Fragment se torna visível no contêiner
  • Par onStart/onStop — recursos conectados em onStart devem ser liberados em onStop para evitar vazamentos

A essência do onStart no Android

onStart é o segundo método do ciclo de vida da Activity, chamado pelo sistema após onCreate (ou após onRestart ao retornar de um estado parado). No momento em que onStart é chamado, a Activity ou Fragment se torna visível na tela. O usuário vê a interface, mas a tela ainda não está pronta para interação — o foco de entrada aparecerá apenas após onResume.

O método onStart faz parte do “tempo de vida visível” (visible lifetime) de uma Activity — o intervalo entre onStart e onStop. Durante este período, a Activity pode estar parcialmente coberta por outras janelas (por exemplo, uma Activity transparente ou janela de diálogo), mas sua UI permanece visível. Isso distingue o tempo de vida visível do “tempo de vida em primeiro plano” (onResume — onPause), quando a Activity tem foco de entrada completo.

Compreender essa hierarquia de três níveis é fundamental para distribuir o código corretamente. onCreate — inicialização única, onStart — conexão de recursos visíveis, onResume — acesso exclusivo a recursos exclusivos. Um desenvolvedor que confunde esses níveis corre o risco de criar vazamentos de memória ou comportamento incorreto do aplicativo ao alternar entre telas.

onStart na Activity

Na Activity, o método onStart é chamado toda vez que a tela aparece no display — tanto no primeiro lançamento (após onCreate) quanto ao retornar do segundo plano (após onRestart). Ao contrário do onCreate, onStart pode ser chamado múltiplas vezes durante a vida de uma instância da Activity, portanto, o código que deve ser executado toda vez que a tela aparece é colocado aqui.

kotlin
class DashboardActivity : AppCompatActivity() {
    private val connectivityReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val isConnected = ... // Verificação de ConnectivityManager
            binding?.statusIndicator?.setColor(
                if (isConnected) Color.GREEN else Color.RED
            )
        }
    }

    override fun onStart() {
        super.onStart()
        registerReceiver(
            connectivityReceiver,
            IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
        )
        SensorManager.getInstance().registerStepCounter()
    }

    override fun onStop() {
        unregisterReceiver(connectivityReceiver)
        SensorManager.getInstance().unregisterStepCounter()
        super.onStop()
    }
}

Regra fundamental: todos os recursos conectados em onStart devem ser liberados em onStop. Isso garante que quando a Activity estiver oculta da tela, ela não consuma bateria, não ouça eventos do sistema nem ocupe memória. O Android Studio inclui regras lint que alertam sobre o registro de um BroadcastReceiver sem o cancelamento correspondente.

onStart no Fragment

onStart no Fragment está intimamente ligado ao ciclo de vida da Activity contêiner. O Fragment recebe a chamada onStart após a Activity que o contém ter recebido onStart. No entanto, se o Fragment for adicionado em modo diferido (FragmentTransaction.commit() sem addToBackStack), onStart pode ser chamado com atraso.

kotlin
class MapFragment : Fragment() {
    private var mapView: MapView? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        mapView = MapView(requireContext())
        return mapView!!
    }

    override fun onStart() {
        super.onStart()
        mapView?.onStart()
        LocationService.connect(requireContext())
    }

    override fun onStop() {
        mapView?.onStop()
        LocationService.disconnect()
        super.onStop()
    }
}

Especificidades do Fragment.onStart: se o Fragment estiver em um ViewPager com offscreenPageLimit = 1, fragmentos vizinhos também receberão onStart antes de se tornarem visíveis. Isso pode levar ao registro prematuro de listeners. Para esses casos, use o método setUserVisibleHint() ou verifique isVisible dentro de onStart para registrar listeners apenas para fragmentos realmente visíveis.

Diferença entre onStart e onResume

A principal diferença entre onStart e onResume é o nível de atividade da tela. onStart sinaliza que a Activity está visível na tela, mas não necessariamente em primeiro plano. onResume sinaliza que a Activity está em primeiro plano e tem foco de entrada. A diferença é demonstrada com um exemplo de janela de diálogo: quando um Dialog aparece sobre uma Activity, a Activity perde onResume (onPause é chamado) mas permanece visível — onStart/onStop não são chamados.

A tabela comparativa mostra claramente em quais cenários cada método é chamado:

CenárioonStartonResume
Início do aplicativoChamadoChamado
Dialog aberto sobre ActivityNão chamadoonPause (perde foco)
Botão Início pressionadoonStop (oculto)onPause → onStop
Retorno de RecentesonStart (visível)onResume (foco)
Rotação de telaonCreate → onStart→ onResume
Chamada recebidaonStop (oculto)onPause → onStop

Esta tabela ajuda o desenvolvedor a decidir em qual método colocar um código específico. Por exemplo, se o aplicativo deve pausar a reprodução de vídeo durante qualquer sobreposição de tela (mesmo um diálogo), o código é colocado em onPause. Se o vídeo deve parar apenas quando a tela estiver completamente oculta — o código é colocado em onStop.

Registro de listeners e serviços

onStart é o local ideal para registrar listeners que devem funcionar apenas enquanto a Activity estiver visível na tela. Isso diz respeito a três tipos principais de componentes do sistema: BroadcastReceiver para eventos do sistema, LocationListener para geolocalização e SensorListener para sensores do dispositivo.

BroadcastReceiver em onStart

BroadcastReceiver é registrado dinamicamente via Context.registerReceiver() em onStart e cancelado em onStop via unregisterReceiver(). O registro dinâmico é preferível ao registro estático (no manifesto) porque limita o tempo de vida do receptor ao período de visibilidade da Activity — o aplicativo não acorda com mensagens de broadcast do sistema quando a Activity está oculta.

kotlin
private val batteryReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent) {
        val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
        binding?.batteryText?.text = "$level%"
    }
}

override fun onStart() {
    super.onStart()
    registerReceiver(batteryReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
}

override fun onStop() {
    unregisterReceiver(batteryReceiver)
    super.onStop()
}

LocationListener e SensorListener

Geolocalização e sensores são operações que consomem muitos recursos. Solicitar atualizações de GPS em onStart e cancelar em onStop garante que o aplicativo não consuma bateria quando a tela estiver oculta. Para ajuste fino, use requestLocationUpdates com intervalo e distância mínimos — por exemplo, 10 segundos e 10 metros, o que proporciona um equilíbrio ótimo entre precisão e consumo de energia.

Animações e onStart

Iniciar animações em onStart, em vez de em onCreate, garante que a animação comece toda vez que a tela aparecer. Se você iniciar uma animação em onCreate, ela funcionará apenas na primeira criação da Activity, não ao retornar do segundo plano. onStart é chamado toda vez que a Activity se torna visível, tornando-o o local ideal para iniciar animações cíclicas e transições.

kotlin
private lateinit var pulseAnimator: ValueAnimator

override fun onStart() {
    super.onStart()
    pulseAnimator.start()
    binding?.loadingIndicator?.animate()?.alpha(1f)?.start()
}

override fun onStop() {
    pulseAnimator.cancel()
    binding?.loadingIndicator?.animate()?.cancel()
    super.onStop()
}

Para animações que usam ObjectAnimator ou ValueAnimator, é importante chamar cancel() em onStop. Se a animação continuar executando após a Activity ser ocultada, ela consome recursos de GPU e CPU inutilmente, degradando o desempenho do dispositivo e acelerando o consumo de bateria. O Android Studio Profiler (gráfico GPU) permite rastrear animações ativas e detectar vazamentos.

A regra de pareamento onStart/onStop também se aplica ao trabalhar com a câmera para visualização (CameraX). Abrir a câmera em onStart e fechá-la em onStop garante que a câmera não seja bloqueada para outros aplicativos quando seu aplicativo não estiver visível na tela. Violar esta regra é uma causa comum de avaliações negativas no Google Play.

Perguntas frequentes

Qual a diferença entre onStart e onResume para registrar listeners?

onStart — para listeners que devem funcionar enquanto a tela estiver visível (BroadcastReceiver, LocationListener, SensorListener). onResume — para recursos que exigem acesso exclusivo (câmera, captura de vídeo, reconhecimento de fala). Listeners de eventos do sistema não exigem acesso exclusivo e podem funcionar com sobreposição parcial — eles são registrados em onStart. A câmera deve estar ativa apenas com foco total — ela é aberta em onResume.

Por que onStart pode não ser chamado?

onStart é sempre chamado se a Activity transita para um estado visível. O único cenário sem onStart — a Activity é criada e imediatamente finalizada (por exemplo, devido a um erro em onCreate). Neste caso, onDestroy é chamado logo após onCreate. Mas este é um cenário de emergência que não deve ocorrer em código corretamente escrito.

Pode onStart ser chamado sem onResume?

Sim, onStart pode não receber onResume se outra Activity ou uma janela transparente for aberta imediatamente sobre a Activity. Por exemplo, se uma tela de autorização for lançada após onCreate (Activity A → Activity B), na Activity A onStart é chamado, mas onResume não — ela recebe imediatamente onPause → onStop ao ser sobreposta pela tela B.

Quantas vezes onStart pode ser chamado?

onStart pode ser chamado múltiplas vezes durante a vida de uma instância da Activity. Toda vez que a Activity transita de um estado oculto (onStop) para um estado visível, onStart é chamado. Na prática, com uso ativo do aplicativo, onStart pode ser chamado dezenas ou centenas de vezes por sessão.

Deve-se carregar dados em onStart?

Carregar dados em onStart é justificado se os dados devem ser atualizados toda vez que a tela aparecer. Por exemplo, um feed de notícias ou lista de notificações. No entanto, o carregamento deve ser assíncrono — através de corrotinas com lifecycleScope, para não bloquear a thread de UI. Para dados que não mudam entre aparições da tela, carregar uma vez em onCreate é suficiente.

Resumo

  • onStart — método de vida visível; chamado quando Activity ou Fragment aparece na tela
  • Registro em onStart — BroadcastReceiver, LocationListener, SensorListener registram em onStart e cancelam em onStop
  • onStart vs onResume — onStart = visibilidade, onResume = foco de entrada; diferentes níveis para diferentes tipos de recursos
  • Animações — iniciar animações cíclicas em onStart, parar em onStop; previne vazamentos de recursos GPU
  • Fragment.onStart — vinculado a Activity.onStart; em ViewPager chamado para fragmentos vizinhos antecipadamente
  • Regra de pareamento — todos os recursos de onStart devem ser liberados em onStop, caso contrário vazamentos de memória e bateria
  • Carregamento de dados — em onStart, carregar dados que devem ser atualizados toda vez que a tela aparecer

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também