SlideShare uma empresa Scribd logo
1 de 67
Baixar para ler offline
Desenvolvimento
Moderno de
Aplicações Android
Nelson Glauber
Android GDE
@nglauber
em 2018…
O que NÃO mudou?
Devemos nos preocupar
com a arquitetura
‣ Os mais diversos tipos de negócios são feitos pelo celular. Muitos deles
são mobile
fi
rst.
‣ A complexidade dos aplicativos continua a crescer.
‣ Por isso, o código tem que ser robusto, testável e deve facilitar a
manutenção e a adição de funcionalidades.
Arquitetura de um app
‣ Regra Principal: não há regras!
‣ Existem princípios que devem ser seguidos: S.O.L.I.D.
‣ Promove a organização e o desacoplamento do código.
‣ Deve facilitar a manutenção e a adição de funcionalidades.
‣ Deve ser testável!
‣ Ela incrementa a complexidade? Sim!
Vale à pena? Com certeza! 😎
Mas deve ser de conhecimento de toda à equipe.
Single Responsibility Principle
Open-Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle
UI
Presentation
Domain
Remote Local
Data
UI
Presentation
Domain
Remote Local
Data
‣ Use Cases
com regras
de negócio
‣ Plain objects
UI
Presentation
Domain
Remote Local
Data
‣ Repositórios
‣ Data Sources
‣ Data Models
Screen ViewModel UseCase Repository
Chama funções do
view model
Observa mudanças
nos Flows
expostos pelo
ViewModel
Contém lógica da
tela
Chama o Use Case
e expõe estado da
UI por meio de um
StateFlow
Atua como uma
camada reusável
para os
ViewModels
Contém validação
de negócio
Comunica com os
repositórios
Responsável por
gerenciar os
dados: salvar e
obter dados
Eventos de UI
observa
mudança
de estado
checa as regras de
validação do negócio
atualiza o
estado
salva/obtém
dados
converte e
retorna o
Resultado
O que mudou?
UI
Presentation
Domain
Remote Local
Data
‣ Jetpack Compose
‣ Navigation Library
‣ ViewModel
‣ Hilt*
io.google/2023/program
+280 milhões de dispositivos com telas
grandes e foldables ativos
Por que telas grandes?
‣ Fazer seu app se destacar em telas grandes apresenta uma grande
oportunidade de negócio.
‣ Quanto mais bem avaliado seu aplicativo for em um dispositivo, mais ele
será recomendado no Google Play em dispositivos da mesma categoria.
‣ Adaptar o seu app para telas grandes melhora signi
fi
cativa nas métricas
centrais de negócios.
‣ Mais usuários ativos, sessões mais longas, médias de avaliação do app
mais altas e aumento do engagamento.
Adapte seu app para telas grandes
‣ Mais de 50 aplicativos do Google já
estão otimizados para telas grandes.
‣ Se estiver procurando inspiração para
o seu app, dê uma olhada nos
aplicativos do Google.
https://developer.android.com/large-screens/gallery
Experiência diferenciada
Feed
List/Detail Supporting Pane
Experiência diferenciada
‣ Usuários gostam de ter uma experiência diferenciada em dispositivos
maiores.
‣ Isso signi
fi
ca adotar layouts especí
fi
cos para telas grandes e pensar em
uma UX diferenciada.
‣ Ex: Multi-pane layout, modo multi-window e tabletop feature (em
foldables).
Compatibilidade em telas grandes
‣ Os usuários esperam que as aplicações funcionem de forma natural no seu
dispositvo:
‣ Em tablets e alguns ChromeBooks, os usuários esperam utilizar a
aplicação com teclado físico, mouse, trackpad ou stylus.
‣ Em foldables, existem ainda mais oportunidades para explorar as
possibilidades de usar as cameras internas e externas ao mesmo
tempo.
‣ Implementar esses tipos de experiências farão seu app se destacar.
Principais problemas…
‣ Restringir o tamanho da tela:
‣ Dando suporte a apenas
uma orientação.
‣ Marcando o aplicativo
como não
redimensionável.
‣ Restringindo o aspect
ratio.
Recomendação
‣ Não estabelecer restrições
de orientação ou
redimensionamento de tela.
‣ Adicionar essas restrições
não é a maneira de evitar o
ciclo de vida da aplicação.
Modo Compatibilidade
‣ No Android 13, foi introduzido um
modo para deixar seu app funcional
em telas grandes: o modo de
compatibilidade.
‣ A partir do Android 12L, se uma
restrição for aplicada e a
con
fi
guração do dispositivo não for
compatível, o sistema colocar o
aplicativo no modo
compatibilidade, que basicamente
deixará seu app centralizado com
uma tela preta ao fundo.
Modo Compatibilidade
‣ Esse modo permite que o app
funcione em todas as orientações e
no modo multi-window, que é uma
funcionalidade essencial em telas
grandes.
‣ As mudanças de con
fi
guração
serão recebidas da mesma forma.
‣ O sistema vai garantir a correta
orientação da câmera independente
de onde ela esteja
fi
sicamente
instalada no aparelho.
Checklist de Qualidade para tela grande
‣ Camada 3 - Pronto para tela grande: Usuários podem completar
fl
uxos
críticos com uma experiência menor que a ideal. App não deve estar no modo
de compatibilidade e tem que prover um suporte básico para mouse, teclado
e trackpad.
‣ Camada 2 - Otimizado para tela grande: O app implementa otimizações de
layout para todos os tamanhos de tela e con
fi
gurações de aparelhos, bem
como uma melhoria para teclado, mouse e trackpad.
‣ Camada 1 - Diferenciado para tela grande: Seu app provê uma UX
desenhada para tablets, foldables e Chrome OS. Onde aplicável, o app
suporta multi-tasking, posturas de foldables, drag and drop e suporte a stylus.
https://goo.gle/large-screen-quality
Window Size
Classes
goo.gle/windows-size-class-views
goo.gle/windows-size-class-compose
height > 900
480dp ≤ height < 900
height < 480
Window Size Classes
Compact Medium Expanded
Material You
‣ É a mais recente evolução do Material Design.
‣ Material Design 3 (M3) incorpora o guia de design do Material You.
‣ M3 é um poderoso e
fl
exível design system que permite con
fi
gurar cores,
formas e fontes customizadas.
‣ M3 permite a utilização de cores dinâmicas, tanto para light quanto para dark
mode.
‣ M3 é o design system recomendado para telefones, tablets e foldables.
‣ Inclusive é o design system padrão ao criar um novo projeto Android.
Compose Material 3
‣ Novos Componentes 🎉
‣ BottomSheetScaffoldLayout,
ModalBottomSheet
‣ DatePicker, DateRangePicker, TimePicker
‣ CenterAlignedTopAppBar, TopAppBar,
MediumTopAppBar, LargeTopAppBar
‣ NavigationBar, NavigationRail,
ModalNavigationDrawer,
DismissibleNavigationDrawer e
PermanentNavigationDrawer
‣ Tooltips
Continuidade em telas grandes
Continuidade em telas grandes
‣ Usuários tendem a usar dispositivos de telas grandes em diferentes
orientações, segura-lo dobrado ou desdobrado (foldables), no modo multi-
window, e no modo free-form (Chromebook).
‣ Usuários esperam que a aplicação funcione de forma
fl
uida em todas essas
variações.
‣ Para o desenvolvedor, é preciso tratar mais mudanças do que normalmente
é feito nos telefones tradicionais.
‣ Garantir que a aplicação salva corretamente o seu estado quando essas
mudanças de con
fi
guração ocorre é um fator chave para uma agradável UX.
Repitam comigo:
"É impossível evitar TODOS os casos
em que a activity deve ser recriada.”
Algumas con
fi
gurações SEMPRE
recriarão a activity.
Sua activity pode ser destruída por…
Mudança de con
fi
guração
‣ Quando a aplicação está em execução e ocorre
uma mudança de con
fi
guração, a activity é
recriada com a nova con
fi
guração.
‣ Essas con
fi
gurações podem ser:
‣ Orientação da tela (portrait/landscape)
‣ Redimensionar a janela (Chromebook)
‣ Entrar ou sair do modo multi-window
‣ Alternar entre os modos Light e Dark.
‣ Entre outros…
Mudança de con
fi
guração
‣ View Model
‣ Recomendação do Google para manter o estado da UI, pois é o única maneira
suportada (o
fi
cialmente) para que objetos arbitrários sobrevivam às mudanças de
con
fi
guração.
‣ É mantido em memória
‣ Limitado apenas pela quantidade de memória do aparelho
‣ Muito rápido para ler/escrever os dados
‣ A biblioteca de navegação faz o cache dos View Models caso eles estejam na
backstack
Sistema precisa de recursos
‣ Quando sua aplicação está em background
e o sistema precisa de recursos.
‣ Quando o sistema está
fi
cando sem
memória, ele fará o possível para manter
seu app em memória, mas isso não é
garantido
‣ O S.O. pode “matar" a aplicação para liberar
memória, tendo em vista que o usuário está
interagindo com outras aplicações.🤷
Sistema precisa de recursos
‣ Saved State APIs é baseado na Bundle API e possui opções pra Compose, View system e View
Model
‣ Sobrevive às mudanças de con
fi
guração e quando o sistema necessita de recursos.
‣ Os dados são armazenados em memória, mas caso haja necessidade, são persistidos em arquivo.
‣ Tem um tamanho limitado. A recomendação é não exceder 50Kb
‣ A leitura/escrita pode ser lenta dependendo da complexidade do que está sendo armazenado
‣ Não armazene objetos grandes ou listas! O processo de serialização e deserialização é feito na
main thread!
‣ Armazene dados transientes que dependem da navegação ou input do usuário, como: posição do
scroll, ID do item na tela de detalhes, texto de um input do usuário, etc.
Saved State APIs
‣ Jetpack Compose
‣ rememberSaveable
‣ Teste com StateRestorationTester
‣ View system
‣ onSaveInstanceState
‣ Teste com ActivityScenario.recreate()
‣ View Model
‣ SavedStateHandle (a informação só é salva no onStop)
Encerramento inesperado
‣ O usuário ou o S.O. pode encerrar a
aplicação abruptamente.
‣ O usuário pode remover a aplicação do
menu de recentes.
‣ Forçar a parada nas con
fi
gurações do
aparelho.
‣ A aplicação pode ter sido atualizada em
background.
Encerramento inesperado
‣ Armazenamento persistente sobrevive às três formas de perder estado (mudança
de con
fi
g., necessidade de recursos do sistema e o fechamento inesperado).
‣ Data Store: Para dados simples e pequenos
‣ Room: Para dados mais complexos
‣ Os dados são armazenados “em disco” limitando sua capacidade ao espaço
disponível no dispositivo.
‣ Como necessita realizar operações de I/O, é mais lento
‣ Deve armazenar dados da aplicação, não de UI!
Ferramentas de Teste
Emuladores
‣ Use o Foldable emulator para testar como sua aplicação funciona ao
dobrar e desdobrar o aparelho.
‣ Use o Freeform/Desktop emulator (Chromebook) para testar o
redimensionamento da janela do aplicativo, minimizar, maximizar, eventos
de mouse (hover, right-click, scroll, scroll-to-zoom) e teclado físico.
‣ Resizable emulator é um "3 em 1": phone, tablet e unfolded foldable
Multi Previews for Jetpack Compose
annotation class Preview(
val name: String = "",
val group: String = "",
@IntRange(from = 1) val apiLevel: Int = -1,
val widthDp: Int = -1,
val heightDp: Int = -1,
val locale: String = "",
@FloatRange(from = 0.01) val fontScale: Float = 1f,
val showSystemUi: Boolean = false,
val showBackground: Boolean = false,
val backgroundColor: Long = 0,
@UiMode val uiMode: Int = 0,
@Device val device: String = Devices.DEFAULT,
@Wallpaper val wallpaper: Int = Wallpapers.NONE,
)
Multi Previews for Jetpack Compose
@DeviceSizePreviews
@Composable
fun GreetingPreview() {
val (w, h) = with(LocalConfiguration.current) {
screenWidthDp.dp to screenHeightDp.dp
}
MyApp(WindowSizeClass.calculateFromSize(DpSize(w, h)))
}
@Preview(showSystemUi = true, widthDp = 700)
@Preview(showSystemUi = true, device = “spec:width=800dp,height=1280dp,dpi=480")
@Preview(showSystemUi = true, device = "id:pixel_5")
@Preview(showSystemUi = true, device = "id:7.6in Foldable")
@Preview(showSystemUi = true, device = "id:medium_tablet")
@Preview(showSystemUi = true, device = "id:desktop_medium")
annotation class DeviceSizePreviews
Automated Testing Tools
‣ É possível usar Gradle Managed Devices para iniciar emuladores com
con
fi
gurações diferentes e rodar a suíte de testes em todos eles.
‣ Diferentes dispositivos necessitam de testes baseado no tamanho da tela.
Mas como de
fi
nir os testes que serão executados em cada device? 🤔
Automated Testing Tools
Espresso Device API
‣ Permite controlar o emulador diretamente do código de teste. Pode-se usar
telefones, tablets, foldables rodando Android API 24 ou superior.
‣ Com essa API é possível de forma síncrona: rotacionar, dobrar/desdobrar e
redimensionar o dispositivo durante o teste. Garantindo que seu aplicativo
trata as mudanças de con
fi
guração corretamente.
‣ Permite de
fi
nir regras para que não sejam executados testes em
dispositivos onde o teste certamente falhará. Por exemplo: não executar
testes de dobrar/desdobrar em dispositivos que não sejam foldables.
Emulador 33.1.10
@RunWith(AndroidJUnit4::class)
class ScreenOrientationTest {
@get:Rule(order = 0)
val composeTestRule = createAndroidComposeRule<MainActivity>()
@get:Rule(order = 1)
val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
@Test
@RequiresDeviceMode(DeviceMode.FLAT)
fun screenOrientationShowRightPanel() {
onDevice().setScreenOrientation(ScreenOrientation.PORTRAIT)
composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed()
onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed()
}
Activity deve exibir
o conteúdo
@Test
@RequiresDeviceMode(DeviceMode.FLAT)
fun foldUnfold() {
onDevice()
.setScreenOrientation(ScreenOrientation.PORTRAIT)
.setClosedMode()
composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed()
composeTestRule.onNodeWithTag("rightPanel").assertDoesNotExist()
onDevice()
.setScreenOrientation(ScreenOrientation.PORTRAIT)
.setFlatMode()
composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed()
composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed()
}
Teste não será
executado em dispositivos
que não suportam o modo
fl
at.
Isso pode ser
de
fi
nido por teste ou
por classe de teste
Save Restoration Tester - Compose
Save Restoration Tester - Compose
@RunWith(AndroidJUnit4::class)
class SaveRestoreStateTest {
@get:Rule(order = 0)
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
@Test
fun testDeviceSaveState() {
val stateRestorationTester = StateRestorationTester(composeTestRule)
stateRestorationTester.setContent {
val (w, h) = with(LocalConfiguration.current) { screenWidthDp.dp to screenHeightDp.dp }
MyApp(WindowSizeClass.calculateFromSize(DpSize(w, h)))
}
composeTestRule.onNodeWithText("Counter 0").assertIsDisplayed()
composeTestRule.onNodeWithText("Add").performClick()
composeTestRule.onNodeWithText("Counter 1”).assertIsDisplayed()
stateRestorationTester.emulateSavedInstanceStateRestore()
composeTestRule.onNodeWithText("Counter 1").assertIsDisplayed()
}
}
TestHarness – Compose
TestHarness – Compose
@RunWith(AndroidJUnit4::class)
class ScreenWithHarness {
@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
@Test
fun testSpecificScreenSize() {
composeTestRule.setContent {
val size = DpSize(840.dp, 600.dp)
TestHarness(
size = size
) {
MyApp(WindowSizeClass.calculateFromSize(size))
}
}
composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed()
composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed()
}
}
Screenshot tests
‣ Como feature experimental do Android Gradle Plugin será possível
converter os Previews dos Composables do Android Studio em imagens
de referência para testes de screenshot.
‣ Os screenshots
fi
carão em
Projeto/app/src/screenshotTest
‣ O comando do Gradle gerará as imagens de referência baseado nos
@Preview
Misc.
Jetpack Glance
• O Jetpack Glance é um framework sobre
o Compose que permite desenvolver e
projetar widgets.
• https://developer.android.com/jetpack/
compose/glance
Compose for TV (Alpha)
• Componentes especí
fi
cos pra TV
• TvLazyRow, TvLazyGrid,
TvLazyColumn, SideNavigation,
Content Cards, Carousel,
ImmersiveList, etc.
Compose for Wear OS
Kotlin DSL for Gradle Builds
‣ KTS é o padrão no Android Studio Giraffe
‣ KTS + Version Catalog é uma opção (experimental)
KSP no lugar do KAPT
io.google/2023/program
Obrigado!
Dúvidas?
Nelson Glauber
Android GDE
@nglauber

Mais conteúdo relacionado

Semelhante a Desenvolvimento Moderno de Aplicações Android 2023

Definindo testes e estratégias para dispositivos móveis
Definindo testes e estratégias para dispositivos móveisDefinindo testes e estratégias para dispositivos móveis
Definindo testes e estratégias para dispositivos móveisThiago Cordeiro
 
Desenvolvimento de Aplicações para Dispositivos Móveis: Aplicativos Nativos, ...
Desenvolvimento de Aplicações para Dispositivos Móveis: Aplicativos Nativos, ...Desenvolvimento de Aplicações para Dispositivos Móveis: Aplicativos Nativos, ...
Desenvolvimento de Aplicações para Dispositivos Móveis: Aplicativos Nativos, ...Pedro Edson Silva Barros
 
Android DevConference - Develop on Android and find success on Google Play
Android DevConference - Develop on Android and find success on Google PlayAndroid DevConference - Develop on Android and find success on Google Play
Android DevConference - Develop on Android and find success on Google PlayiMasters
 
Mobile UX - Princípios Básicos
Mobile UX - Princípios BásicosMobile UX - Princípios Básicos
Mobile UX - Princípios BásicosVítor Teixeira
 
Palestra - 9 Regras Que Valem Ouro
Palestra - 9 Regras Que Valem OuroPalestra - 9 Regras Que Valem Ouro
Palestra - 9 Regras Que Valem OuroLuiz Agner
 
O que você faz para ser Mobile? TDC2013
O que você faz para ser Mobile? TDC2013O que você faz para ser Mobile? TDC2013
O que você faz para ser Mobile? TDC2013Jackson F. de A. Mafra
 
Curso de Android Aula 4
Curso de Android Aula 4Curso de Android Aula 4
Curso de Android Aula 4Jose Berardo
 
Android: História, Mercado e Possibilidades (FLISOL - Indaiatuba - 2011)
Android: História, Mercado e Possibilidades (FLISOL - Indaiatuba - 2011)Android: História, Mercado e Possibilidades (FLISOL - Indaiatuba - 2011)
Android: História, Mercado e Possibilidades (FLISOL - Indaiatuba - 2011)Santhyago Gallao
 
Prototipagem Em Papel
Prototipagem Em PapelPrototipagem Em Papel
Prototipagem Em Papelelliando dias
 
Asoso tipos de aplicações móveis (1)
Asoso   tipos de aplicações móveis (1)Asoso   tipos de aplicações móveis (1)
Asoso tipos de aplicações móveis (1)grupouro
 
Asoso tipos de aplicações móveis (1)
Asoso   tipos de aplicações móveis (1)Asoso   tipos de aplicações móveis (1)
Asoso tipos de aplicações móveis (1)grupouro
 
Apresentação de minha Monografia do curso de Sistema e Mídias Digitais
Apresentação de minha Monografia do curso de Sistema e Mídias DigitaisApresentação de minha Monografia do curso de Sistema e Mídias Digitais
Apresentação de minha Monografia do curso de Sistema e Mídias DigitaisÉdipo Souza
 
MVPConf - Azure Functions
MVPConf - Azure FunctionsMVPConf - Azure Functions
MVPConf - Azure FunctionsCDS
 

Semelhante a Desenvolvimento Moderno de Aplicações Android 2023 (20)

Os caminhos para o desenvolvimento mobile
Os caminhos para o desenvolvimento mobileOs caminhos para o desenvolvimento mobile
Os caminhos para o desenvolvimento mobile
 
Definindo testes e estratégias para dispositivos móveis
Definindo testes e estratégias para dispositivos móveisDefinindo testes e estratégias para dispositivos móveis
Definindo testes e estratégias para dispositivos móveis
 
Desenvolvimento de Aplicações para Dispositivos Móveis: Aplicativos Nativos, ...
Desenvolvimento de Aplicações para Dispositivos Móveis: Aplicativos Nativos, ...Desenvolvimento de Aplicações para Dispositivos Móveis: Aplicativos Nativos, ...
Desenvolvimento de Aplicações para Dispositivos Móveis: Aplicativos Nativos, ...
 
Android DevConference - Develop on Android and find success on Google Play
Android DevConference - Develop on Android and find success on Google PlayAndroid DevConference - Develop on Android and find success on Google Play
Android DevConference - Develop on Android and find success on Google Play
 
Phonegap
PhonegapPhonegap
Phonegap
 
Mobile UX - Princípios Básicos
Mobile UX - Princípios BásicosMobile UX - Princípios Básicos
Mobile UX - Princípios Básicos
 
Palestra - 9 Regras Que Valem Ouro
Palestra - 9 Regras Que Valem OuroPalestra - 9 Regras Que Valem Ouro
Palestra - 9 Regras Que Valem Ouro
 
Revista programar 12
Revista programar 12Revista programar 12
Revista programar 12
 
Aandroid Wear
Aandroid WearAandroid Wear
Aandroid Wear
 
O que você faz para ser Mobile? TDC2013
O que você faz para ser Mobile? TDC2013O que você faz para ser Mobile? TDC2013
O que você faz para ser Mobile? TDC2013
 
Curso de Android Aula 4
Curso de Android Aula 4Curso de Android Aula 4
Curso de Android Aula 4
 
Android: História, Mercado e Possibilidades (FLISOL - Indaiatuba - 2011)
Android: História, Mercado e Possibilidades (FLISOL - Indaiatuba - 2011)Android: História, Mercado e Possibilidades (FLISOL - Indaiatuba - 2011)
Android: História, Mercado e Possibilidades (FLISOL - Indaiatuba - 2011)
 
Apresentação android
Apresentação androidApresentação android
Apresentação android
 
Prototipagem Em Papel
Prototipagem Em PapelPrototipagem Em Papel
Prototipagem Em Papel
 
Asoso tipos de aplicações móveis (1)
Asoso   tipos de aplicações móveis (1)Asoso   tipos de aplicações móveis (1)
Asoso tipos de aplicações móveis (1)
 
Asoso tipos de aplicações móveis (1)
Asoso   tipos de aplicações móveis (1)Asoso   tipos de aplicações móveis (1)
Asoso tipos de aplicações móveis (1)
 
Projeto SaveSIM
Projeto SaveSIMProjeto SaveSIM
Projeto SaveSIM
 
Apresentação de minha Monografia do curso de Sistema e Mídias Digitais
Apresentação de minha Monografia do curso de Sistema e Mídias DigitaisApresentação de minha Monografia do curso de Sistema e Mídias Digitais
Apresentação de minha Monografia do curso de Sistema e Mídias Digitais
 
Apresentação Mural TIC ihc
Apresentação Mural TIC ihcApresentação Mural TIC ihc
Apresentação Mural TIC ihc
 
MVPConf - Azure Functions
MVPConf - Azure FunctionsMVPConf - Azure Functions
MVPConf - Azure Functions
 

Mais de Nelson Glauber Leal

Seu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose MultiplatformSeu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose MultiplatformNelson Glauber Leal
 
Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Nelson Glauber Leal
 
Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Nelson Glauber Leal
 
Jetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidJetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidNelson Glauber Leal
 
Jetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no AndroidJetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no AndroidNelson Glauber Leal
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackNelson Glauber Leal
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackNelson Glauber Leal
 
O que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor AndroidO que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor AndroidNelson Glauber Leal
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackNelson Glauber Leal
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackNelson Glauber Leal
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackNelson Glauber Leal
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard LibraryNelson Glauber Leal
 
Aplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & JetpackAplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & JetpackNelson Glauber Leal
 
Introdução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinIntrodução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinNelson Glauber Leal
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using RoomNelson Glauber Leal
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackNelson Glauber Leal
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidNelson Glauber Leal
 
Desenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidDesenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidNelson Glauber Leal
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
Tudo que você precisa saber sobre Constraint Layout
Tudo que você precisa saber sobre Constraint LayoutTudo que você precisa saber sobre Constraint Layout
Tudo que você precisa saber sobre Constraint LayoutNelson Glauber Leal
 

Mais de Nelson Glauber Leal (20)

Seu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose MultiplatformSeu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose Multiplatform
 
Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)
 
Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021
 
Jetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidJetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on Android
 
Jetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no AndroidJetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no Android
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
O que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor AndroidO que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor Android
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e Jetpack
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard Library
 
Aplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & JetpackAplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & Jetpack
 
Introdução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinIntrodução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com Kotlin
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using Room
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com Jetpack
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos Android
 
Desenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidDesenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos Android
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Tudo que você precisa saber sobre Constraint Layout
Tudo que você precisa saber sobre Constraint LayoutTudo que você precisa saber sobre Constraint Layout
Tudo que você precisa saber sobre Constraint Layout
 

Desenvolvimento Moderno de Aplicações Android 2023

  • 3. O que NÃO mudou?
  • 4. Devemos nos preocupar com a arquitetura ‣ Os mais diversos tipos de negócios são feitos pelo celular. Muitos deles são mobile fi rst. ‣ A complexidade dos aplicativos continua a crescer. ‣ Por isso, o código tem que ser robusto, testável e deve facilitar a manutenção e a adição de funcionalidades.
  • 5. Arquitetura de um app ‣ Regra Principal: não há regras! ‣ Existem princípios que devem ser seguidos: S.O.L.I.D. ‣ Promove a organização e o desacoplamento do código. ‣ Deve facilitar a manutenção e a adição de funcionalidades. ‣ Deve ser testável! ‣ Ela incrementa a complexidade? Sim! Vale à pena? Com certeza! 😎 Mas deve ser de conhecimento de toda à equipe. Single Responsibility Principle Open-Closed Principle Liskov Substitution Principle Interface Segregation Principle Dependency Inversion Principle
  • 7. UI Presentation Domain Remote Local Data ‣ Use Cases com regras de negócio ‣ Plain objects
  • 9. Screen ViewModel UseCase Repository Chama funções do view model Observa mudanças nos Flows expostos pelo ViewModel Contém lógica da tela Chama o Use Case e expõe estado da UI por meio de um StateFlow Atua como uma camada reusável para os ViewModels Contém validação de negócio Comunica com os repositórios Responsável por gerenciar os dados: salvar e obter dados Eventos de UI observa mudança de estado checa as regras de validação do negócio atualiza o estado salva/obtém dados converte e retorna o Resultado
  • 11. UI Presentation Domain Remote Local Data ‣ Jetpack Compose ‣ Navigation Library ‣ ViewModel ‣ Hilt*
  • 13. +280 milhões de dispositivos com telas grandes e foldables ativos
  • 14. Por que telas grandes? ‣ Fazer seu app se destacar em telas grandes apresenta uma grande oportunidade de negócio. ‣ Quanto mais bem avaliado seu aplicativo for em um dispositivo, mais ele será recomendado no Google Play em dispositivos da mesma categoria. ‣ Adaptar o seu app para telas grandes melhora signi fi cativa nas métricas centrais de negócios. ‣ Mais usuários ativos, sessões mais longas, médias de avaliação do app mais altas e aumento do engagamento.
  • 15. Adapte seu app para telas grandes ‣ Mais de 50 aplicativos do Google já estão otimizados para telas grandes. ‣ Se estiver procurando inspiração para o seu app, dê uma olhada nos aplicativos do Google.
  • 18. Experiência diferenciada ‣ Usuários gostam de ter uma experiência diferenciada em dispositivos maiores. ‣ Isso signi fi ca adotar layouts especí fi cos para telas grandes e pensar em uma UX diferenciada. ‣ Ex: Multi-pane layout, modo multi-window e tabletop feature (em foldables).
  • 19. Compatibilidade em telas grandes ‣ Os usuários esperam que as aplicações funcionem de forma natural no seu dispositvo: ‣ Em tablets e alguns ChromeBooks, os usuários esperam utilizar a aplicação com teclado físico, mouse, trackpad ou stylus. ‣ Em foldables, existem ainda mais oportunidades para explorar as possibilidades de usar as cameras internas e externas ao mesmo tempo. ‣ Implementar esses tipos de experiências farão seu app se destacar.
  • 20. Principais problemas… ‣ Restringir o tamanho da tela: ‣ Dando suporte a apenas uma orientação. ‣ Marcando o aplicativo como não redimensionável. ‣ Restringindo o aspect ratio.
  • 21. Recomendação ‣ Não estabelecer restrições de orientação ou redimensionamento de tela. ‣ Adicionar essas restrições não é a maneira de evitar o ciclo de vida da aplicação.
  • 22. Modo Compatibilidade ‣ No Android 13, foi introduzido um modo para deixar seu app funcional em telas grandes: o modo de compatibilidade. ‣ A partir do Android 12L, se uma restrição for aplicada e a con fi guração do dispositivo não for compatível, o sistema colocar o aplicativo no modo compatibilidade, que basicamente deixará seu app centralizado com uma tela preta ao fundo.
  • 23. Modo Compatibilidade ‣ Esse modo permite que o app funcione em todas as orientações e no modo multi-window, que é uma funcionalidade essencial em telas grandes. ‣ As mudanças de con fi guração serão recebidas da mesma forma. ‣ O sistema vai garantir a correta orientação da câmera independente de onde ela esteja fi sicamente instalada no aparelho.
  • 24. Checklist de Qualidade para tela grande ‣ Camada 3 - Pronto para tela grande: Usuários podem completar fl uxos críticos com uma experiência menor que a ideal. App não deve estar no modo de compatibilidade e tem que prover um suporte básico para mouse, teclado e trackpad. ‣ Camada 2 - Otimizado para tela grande: O app implementa otimizações de layout para todos os tamanhos de tela e con fi gurações de aparelhos, bem como uma melhoria para teclado, mouse e trackpad. ‣ Camada 1 - Diferenciado para tela grande: Seu app provê uma UX desenhada para tablets, foldables e Chrome OS. Onde aplicável, o app suporta multi-tasking, posturas de foldables, drag and drop e suporte a stylus. https://goo.gle/large-screen-quality
  • 26. Window Size Classes Compact Medium Expanded
  • 27.
  • 28. Material You ‣ É a mais recente evolução do Material Design. ‣ Material Design 3 (M3) incorpora o guia de design do Material You. ‣ M3 é um poderoso e fl exível design system que permite con fi gurar cores, formas e fontes customizadas. ‣ M3 permite a utilização de cores dinâmicas, tanto para light quanto para dark mode. ‣ M3 é o design system recomendado para telefones, tablets e foldables. ‣ Inclusive é o design system padrão ao criar um novo projeto Android.
  • 29. Compose Material 3 ‣ Novos Componentes 🎉 ‣ BottomSheetScaffoldLayout, ModalBottomSheet ‣ DatePicker, DateRangePicker, TimePicker ‣ CenterAlignedTopAppBar, TopAppBar, MediumTopAppBar, LargeTopAppBar ‣ NavigationBar, NavigationRail, ModalNavigationDrawer, DismissibleNavigationDrawer e PermanentNavigationDrawer ‣ Tooltips
  • 30.
  • 32. Continuidade em telas grandes ‣ Usuários tendem a usar dispositivos de telas grandes em diferentes orientações, segura-lo dobrado ou desdobrado (foldables), no modo multi- window, e no modo free-form (Chromebook). ‣ Usuários esperam que a aplicação funcione de forma fl uida em todas essas variações. ‣ Para o desenvolvedor, é preciso tratar mais mudanças do que normalmente é feito nos telefones tradicionais. ‣ Garantir que a aplicação salva corretamente o seu estado quando essas mudanças de con fi guração ocorre é um fator chave para uma agradável UX.
  • 33.
  • 34. Repitam comigo: "É impossível evitar TODOS os casos em que a activity deve ser recriada.” Algumas con fi gurações SEMPRE recriarão a activity.
  • 35. Sua activity pode ser destruída por…
  • 36. Mudança de con fi guração ‣ Quando a aplicação está em execução e ocorre uma mudança de con fi guração, a activity é recriada com a nova con fi guração. ‣ Essas con fi gurações podem ser: ‣ Orientação da tela (portrait/landscape) ‣ Redimensionar a janela (Chromebook) ‣ Entrar ou sair do modo multi-window ‣ Alternar entre os modos Light e Dark. ‣ Entre outros…
  • 37. Mudança de con fi guração ‣ View Model ‣ Recomendação do Google para manter o estado da UI, pois é o única maneira suportada (o fi cialmente) para que objetos arbitrários sobrevivam às mudanças de con fi guração. ‣ É mantido em memória ‣ Limitado apenas pela quantidade de memória do aparelho ‣ Muito rápido para ler/escrever os dados ‣ A biblioteca de navegação faz o cache dos View Models caso eles estejam na backstack
  • 38. Sistema precisa de recursos ‣ Quando sua aplicação está em background e o sistema precisa de recursos. ‣ Quando o sistema está fi cando sem memória, ele fará o possível para manter seu app em memória, mas isso não é garantido ‣ O S.O. pode “matar" a aplicação para liberar memória, tendo em vista que o usuário está interagindo com outras aplicações.🤷
  • 39. Sistema precisa de recursos ‣ Saved State APIs é baseado na Bundle API e possui opções pra Compose, View system e View Model ‣ Sobrevive às mudanças de con fi guração e quando o sistema necessita de recursos. ‣ Os dados são armazenados em memória, mas caso haja necessidade, são persistidos em arquivo. ‣ Tem um tamanho limitado. A recomendação é não exceder 50Kb ‣ A leitura/escrita pode ser lenta dependendo da complexidade do que está sendo armazenado ‣ Não armazene objetos grandes ou listas! O processo de serialização e deserialização é feito na main thread! ‣ Armazene dados transientes que dependem da navegação ou input do usuário, como: posição do scroll, ID do item na tela de detalhes, texto de um input do usuário, etc.
  • 40. Saved State APIs ‣ Jetpack Compose ‣ rememberSaveable ‣ Teste com StateRestorationTester ‣ View system ‣ onSaveInstanceState ‣ Teste com ActivityScenario.recreate() ‣ View Model ‣ SavedStateHandle (a informação só é salva no onStop)
  • 41. Encerramento inesperado ‣ O usuário ou o S.O. pode encerrar a aplicação abruptamente. ‣ O usuário pode remover a aplicação do menu de recentes. ‣ Forçar a parada nas con fi gurações do aparelho. ‣ A aplicação pode ter sido atualizada em background.
  • 42. Encerramento inesperado ‣ Armazenamento persistente sobrevive às três formas de perder estado (mudança de con fi g., necessidade de recursos do sistema e o fechamento inesperado). ‣ Data Store: Para dados simples e pequenos ‣ Room: Para dados mais complexos ‣ Os dados são armazenados “em disco” limitando sua capacidade ao espaço disponível no dispositivo. ‣ Como necessita realizar operações de I/O, é mais lento ‣ Deve armazenar dados da aplicação, não de UI!
  • 44. Emuladores ‣ Use o Foldable emulator para testar como sua aplicação funciona ao dobrar e desdobrar o aparelho. ‣ Use o Freeform/Desktop emulator (Chromebook) para testar o redimensionamento da janela do aplicativo, minimizar, maximizar, eventos de mouse (hover, right-click, scroll, scroll-to-zoom) e teclado físico. ‣ Resizable emulator é um "3 em 1": phone, tablet e unfolded foldable
  • 45. Multi Previews for Jetpack Compose annotation class Preview( val name: String = "", val group: String = "", @IntRange(from = 1) val apiLevel: Int = -1, val widthDp: Int = -1, val heightDp: Int = -1, val locale: String = "", @FloatRange(from = 0.01) val fontScale: Float = 1f, val showSystemUi: Boolean = false, val showBackground: Boolean = false, val backgroundColor: Long = 0, @UiMode val uiMode: Int = 0, @Device val device: String = Devices.DEFAULT, @Wallpaper val wallpaper: Int = Wallpapers.NONE, )
  • 46. Multi Previews for Jetpack Compose @DeviceSizePreviews @Composable fun GreetingPreview() { val (w, h) = with(LocalConfiguration.current) { screenWidthDp.dp to screenHeightDp.dp } MyApp(WindowSizeClass.calculateFromSize(DpSize(w, h))) } @Preview(showSystemUi = true, widthDp = 700) @Preview(showSystemUi = true, device = “spec:width=800dp,height=1280dp,dpi=480") @Preview(showSystemUi = true, device = "id:pixel_5") @Preview(showSystemUi = true, device = "id:7.6in Foldable") @Preview(showSystemUi = true, device = "id:medium_tablet") @Preview(showSystemUi = true, device = "id:desktop_medium") annotation class DeviceSizePreviews
  • 47.
  • 48. Automated Testing Tools ‣ É possível usar Gradle Managed Devices para iniciar emuladores com con fi gurações diferentes e rodar a suíte de testes em todos eles. ‣ Diferentes dispositivos necessitam de testes baseado no tamanho da tela. Mas como de fi nir os testes que serão executados em cada device? 🤔
  • 50. Espresso Device API ‣ Permite controlar o emulador diretamente do código de teste. Pode-se usar telefones, tablets, foldables rodando Android API 24 ou superior. ‣ Com essa API é possível de forma síncrona: rotacionar, dobrar/desdobrar e redimensionar o dispositivo durante o teste. Garantindo que seu aplicativo trata as mudanças de con fi guração corretamente. ‣ Permite de fi nir regras para que não sejam executados testes em dispositivos onde o teste certamente falhará. Por exemplo: não executar testes de dobrar/desdobrar em dispositivos que não sejam foldables.
  • 52. @RunWith(AndroidJUnit4::class) class ScreenOrientationTest { @get:Rule(order = 0) val composeTestRule = createAndroidComposeRule<MainActivity>() @get:Rule(order = 1) val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) @Test @RequiresDeviceMode(DeviceMode.FLAT) fun screenOrientationShowRightPanel() { onDevice().setScreenOrientation(ScreenOrientation.PORTRAIT) composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed() onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed() } Activity deve exibir o conteúdo
  • 55. Save Restoration Tester - Compose @RunWith(AndroidJUnit4::class) class SaveRestoreStateTest { @get:Rule(order = 0) val composeTestRule = createAndroidComposeRule<ComponentActivity>() @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) @Test fun testDeviceSaveState() { val stateRestorationTester = StateRestorationTester(composeTestRule) stateRestorationTester.setContent { val (w, h) = with(LocalConfiguration.current) { screenWidthDp.dp to screenHeightDp.dp } MyApp(WindowSizeClass.calculateFromSize(DpSize(w, h))) } composeTestRule.onNodeWithText("Counter 0").assertIsDisplayed() composeTestRule.onNodeWithText("Add").performClick() composeTestRule.onNodeWithText("Counter 1”).assertIsDisplayed() stateRestorationTester.emulateSavedInstanceStateRestore() composeTestRule.onNodeWithText("Counter 1").assertIsDisplayed() } }
  • 57. TestHarness – Compose @RunWith(AndroidJUnit4::class) class ScreenWithHarness { @get:Rule val composeTestRule = createAndroidComposeRule<ComponentActivity>() @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) @Test fun testSpecificScreenSize() { composeTestRule.setContent { val size = DpSize(840.dp, 600.dp) TestHarness( size = size ) { MyApp(WindowSizeClass.calculateFromSize(size)) } } composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed() composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed() } }
  • 58. Screenshot tests ‣ Como feature experimental do Android Gradle Plugin será possível converter os Previews dos Composables do Android Studio em imagens de referência para testes de screenshot. ‣ Os screenshots fi carão em Projeto/app/src/screenshotTest ‣ O comando do Gradle gerará as imagens de referência baseado nos @Preview
  • 59.
  • 60. Misc.
  • 61. Jetpack Glance • O Jetpack Glance é um framework sobre o Compose que permite desenvolver e projetar widgets. • https://developer.android.com/jetpack/ compose/glance
  • 62. Compose for TV (Alpha) • Componentes especí fi cos pra TV • TvLazyRow, TvLazyGrid, TvLazyColumn, SideNavigation, Content Cards, Carousel, ImmersiveList, etc.
  • 64. Kotlin DSL for Gradle Builds ‣ KTS é o padrão no Android Studio Giraffe ‣ KTS + Version Catalog é uma opção (experimental)
  • 65. KSP no lugar do KAPT