Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Training Program - Portugal, Aula 0

ATP Portugal
October 14, 2020

Android Training Program - Portugal, Aula 0

Aula #0: Pronto para começar 🎒

Bem-vindos! Esta primeira aula é de suporte. Vamos-te ensinar a instalar o Android Studio, a configurar o emulador e/ ou o teu telemóvel Android, e ainda a instalares a tua primeira aplicação de forma a garantir que tens tudo pronto para começar.

- Instalar o Android Studio
- Configurar o Emulador
- Criar a tua primeira aplicação

ATP Portugal

October 14, 2020
Tweet

More Decks by ATP Portugal

Other Decks in Programming

Transcript

  1. Android
    Training
    Program
    PORTUGAL
    Aula #0
    Pronto para começar

    View Slide

  2. ● Sejam excelentes uns para os outros
    ● Fale mais alto se vir ou ouvir alguma coisa
    ● O assédio não é tolerado
    ● Pratique "Sim e" um ao outro
    Código de conduta
    Mais informações: http://bit.ly/2IhF0l3

    View Slide

  3. Olá Mundo!

    View Slide

  4. Log.d(“Olá Mundo ”)

    View Slide

  5. ● Apresentação do programa
    ● Introdução ao Git/GitHub
    ● Introdução ao Kotlin
    ● Android Studio
    ● Cria a tua aplicação
    Sumário
    Photo by Mika Baumeister on Unsplash

    View Slide

  6. Andres-Leonardo
    Martinez-Ortiz
    Google
    Carlos Mota
    Formador
    Renato Almeida
    Formador
    @davilagrau @cafonsomota @tallnato
    Equipa

    View Slide

  7. ● 14 eventos
    ● 11 cidades
    ● 11 instituições
    ● 3267 participantes
    Edições anteriores

    View Slide

  8. View Slide

  9. Apresentação do programa

    View Slide

  10. ● Aprender Android desde os conceitos mais simples aos mais avançados:
    ○ Android Jetpack
    ○ Firebase
    ○ TensorFlow Lite
    ○ ML Kit
    ● Todo o código será escrito em Kotlin
    ● Desenvolvimento de uma aplicação Android de raiz
    ● Recorrendo às últimas novidades:
    ○ Android 11
    ○ Jetpack Compose
    Desenhado para
    o Android 11!
    Apresentação do programa

    View Slide

  11. ● Adicionalmente teremos ainda uma breve introdução ao Flutter
    ● Suporte contínuo durante todo o programa
    ● Complemento às aulas dadas nas diferentes instituições de ensino
    ● Grátis
    Apresentação do programa

    View Slide

  12. ● 12 aulas
    ● 1h30 cada aula
    ● ~1 aula por semana
    ● 14 Outubro a 16 Dezembro
    ● YouTube live
    ● Suporte assíncrono contínuo via Discord/email
    ● Todo o código disponível no GitHub
    Photo by Arif Riyanto on Unspla
    Apresentação do programa

    View Slide

  13. #0
    14 de Outubro
    Pronto para
    começar
    #1
    21 de Outubro
    Bem-vindos ao
    Android
    #2
    28 de Outubro
    Fundações I
    #3
    04 de Novembro
    Fundações II
    #4
    11 de Novembro
    Fundações III
    #5
    18 de Novembro
    Listas, listas e
    mais listas
    #6
    25 de Novembro
    Jetpack,
    Jetpack,
    Jetpack!
    #7 - #8
    02 - 03 de Dezembro
    Firebase
    #9 - #10
    09 - 10 de Dezembro
    MLKit &
    TensorFlow
    #11
    16 de Dezembro
    Resumo
    Semana Semana
    Calendário

    View Slide

  14. ● [05 mins] Apresentação do curso, resumo da sessão anterior e da atual
    ● [30 mins] Conteúdo da aula
    ● [15 mins] Formador convidado: parceiro, Googler, GDE, etc.
    ● [30 mins] Continuação do conteúdo da aula
    ● [10 mins] Q&A
    ● [05 mins] Resumo
    Aulas

    View Slide

  15. http://events.withgoogle.com/atp2020
    [email protected]
    http://bit.ly/atp2020-youtube
    http://bit.ly/atp2020-discord
    Links

    View Slide

  16. A evolução das
    aplicações móveis

    View Slide

  17. Nokia 3310
    Snake

    View Slide

  18. Pixel 3
    Pokémon Go (AR)

    View Slide

  19. Android

    View Slide

  20. (quando começamos, 2009)
    ● Android 1.6 (Donut)
    ● 528MHz CPU
    ● 288MB RAM
    ● Ecrã TFT 65k
    ● Trackball
    ● Sem câmera frontal
    ● 3.15MP câmera
    HTC Magic
    (actualmente)
    Pixel 5
    ● Android 11
    ● Octa-core CPU
    ● 8GB RAM
    ● Ecrã OLED, 90Hz
    ● Todo o ecrã é tátil
    ● 8MP câmera frontal
    ● 12.2 e 16MP câmera
    Android

    View Slide


  21. (quando começamos, 2009)
    HTC Magic
    (actualmente)
    Pixel 5
    Android

    View Slide

  22. versões
    Android 11
    Android 10
    Apple Pie
    1.0
    Cupcake
    1.5
    Donut
    1.6
    Eclair
    2.0/2.1
    Froyo
    2.2
    Gingerbread
    2.3.x
    Honeycomb
    3.x
    Ice Cream Sandwich
    4.0
    Jelly Bean
    4.1-4.3
    KitKat
    4.4
    Lollipop
    5.0
    Marshmallow
    6.0
    Nougat
    7.0
    Oreo
    8.0
    Pie
    9.0
    Android

    View Slide

  23. *ícones de flaticon.com
    Rabanadas
    11
    Queijadinha
    10
    Arroz Doce
    1.0
    Cornucópia
    1.5
    Filhoses
    2.2
    Gargantas de Freira
    2.3.x

    3.x

    4.0
    Jesuítas
    4.1-4.3
    Molotoff
    6.0
    Nata
    7.0
    Ovos Moles
    8.0
    Pudim de Abade de
    Priscos 9.0
    Leite Creme
    5.0
    Doce da Casa
    1.6
    Escarpiada
    2.0/2.1

    4.4
    versões Portuguesas
    Android

    View Slide

  24. Android 11
    Android 10
    Apple Pie
    1.0
    Cupcake
    1.5
    Donut
    1.6
    Eclair
    2.0/2.1
    Froyo
    2.2
    Gingerbread
    2.3.x
    Honeycomb
    3.x
    Ice Cream Sandwich
    4.0
    Jelly Bean
    4.1-4.3
    KitKat
    4.4
    Lollipop
    5.0
    Marshmallow
    6.0
    Nougat
    7.0
    Oreo
    8.0
    Pie
    9.0
    que sobremesas
    seriam no teu
    país?
    (envia-nos uma mensagem no discord/YouTube)
    versões >
    Android

    View Slide

  25. Apple Pie Ice Cream
    Sandwich
    KitKat Lollipop Oreo Pie
    Android 1.0 Android 4.0 Android 4.4 Android 5.0 Android 8.0 Android 9.0
    evoluções da UI
    Android
    *adaptado a partir do tweet Luke Wroblewski,
    https://twitter.com/lukew/status/996461585693540352

    View Slide

  26. Porque Android?

    View Slide

  27. 2.5 mil milhões
    de pessoas usam um dispositivo Android todos os dias

    View Slide

  28. ~75%
    de todos os smartphones são Android
    *https://gs.statcounter.com/os-market-share/mobile/worldwide

    View Slide

  29. 1.2 mil milhões
    de empregos são gerados diretamente pela plataforma
    Android, só na Europa

    View Slide

  30. em todos os dispositivos
    Android

    View Slide

  31. Que versão
    de Android
    devo
    escolher?
    distribuição
    Android

    View Slide

  32. distribuição
    Android

    View Slide

  33. distribuição
    Android

    View Slide

  34. Diferentes frameworks
    para programar para
    Android

    View Slide

  35. Photo by Lucas Miguel on Unsplash

    View Slide

  36. Photo by Brandon Hoogenboom on Unsplash

    View Slide

  37. Qualquer tecnologia suficientemente avançada é
    indistinguível da magia.
    - Arthur C. Clarke

    View Slide

  38. ● Desenvolvimento nativo
    ○ Java/ Kotlin ❤
    ○ Bibliotecas nativas escritas em C/C++
    ● Híbrido
    ○ PhoneGap, Ionic, etc.
    ● Cross platform
    ○ Flutter, React Native, Xamarin, NativeScript, Ionic, Ruby Motion, etc.
    ● Multiplatforma
    ○ Kotlin (toda a lógica é partilhada por diferentes plataformas, e a UI desenvolvida nativamente)
    Android

    View Slide

  39. ✅ Melhor performance
    ✅ Kotlin!
    Tiras o partido de todas as funcionalidades que esta linguagem oferece
    ✅ Acesso directo a todas as API’s/ funcionalidades
    ✅ UI nativa
    Quando o OS é actualizado esta também vai ser
    ✅ Facilidade em debug
    ✅ Possibilidade de criar UI’s complexas e fluidas facilmente™
    desenvolvimento nativo
    Android

    View Slide

  40. ❌ Não existe suporte direto para multi platforma
    Reutilização de código apenas existe entre aplicações nativas
    É necessário desenvolver uma segunda aplicação
    Os custos e o tempo de desenvolvimento (em horas) duplicam
    desenvolvimento nativo
    Android

    View Slide

  41. View Slide

  42. Google Maps Pinterest Netflix Pokémon Go
    *as aplicações são muitas vezes reescritas, por isso é possível que esta informação deixe de ser válida no futuro
    exemplo de aplicações nativas
    Android

    View Slide

  43. ✅ Estas aplicações tanto têm código nativo como Web
    HTML/CSS/JS para desenhar a app e plugins para aceder às funcionalidades nativas
    Apesar de ser uma aplicação, está a correr dentro de um browser (WebKit)
    ✅ Custos de desenvolvimento mais baixos
    Não é necessário ter duas equipas (uma de Android e outra de iOS)
    ✅ Tempos de desenvolvimento (em horas) mais rápidos
    ✅ Curva de aprendizagem para programadores Web reduzida
    Grande parte destas ferramentas têm por base linguagens Web já conhecidas
    desenvolvimento híbrido
    Android

    View Slide

  44. ❌ Aceder a novas API’s pode implicar que tenhas de escrever código nativo
    ❌ A performance não é a mesma comparativamente com nativo
    ❌ Suporte offline na maior parte das vezes é inexistente
    ❌ A UX pode não ser a melhor
    desenvolvimento híbrido
    Android

    View Slide

  45. Evernote Gmail Untappd JustWatch
    *as aplicações são muitas vezes reescritas, por isso é possível que esta informação deixe de ser válida no futuro
    exemplo de aplicações híbridas
    Android

    View Slide

  46. ✅ Custos de desenvolvimento mais baixos
    Não é necessário ter duas equipas (uma de Android e outra de iOS)
    ✅ Tempos de desenvolvimento (em horas) mais rápidos
    Consegues desenvolver com poucos ajustes para duas plataformas distintas
    Base de código única
    ✅ Melhor performance que as soluções híbridas
    ✅ Visualmente é mais difícil de distinguir de uma aplicação nativa
    desenvolvimento cross-platform
    Android

    View Slide

  47. ❌ Dependem da implementação da UI que a framework oferece
    Novos updates no SO, não se refletem imediatamente na aplicação
    ❌ Apesar de melhor, a performance continua a não ser igual à nativa
    ❌ As funcionalidades disponíveis dependem se a framework tem esse suporte
    Se uma das plataformas não tem uma funcionalidade, esta pode não ser disponibilizada para a outra
    ❌ Estás a confiar o teu projecto a uma framework/ linguagem
    O que vai acontecer daqui a 10 anos? Ainda vai ter actualizações a framework?
    desenvolvimento cross-platform
    Android

    View Slide

  48. Airbnb Uber Eats Instagram Discord
    *as aplicações são muitas vezes reescritas, por isso é possível que esta informação deixe de ser válida no futuro
    exemplo de aplicações cross-platform
    Android

    View Slide

  49. Instagram
    exemplo de aplicações cross-platform
    Android

    View Slide

  50. ✅ A camada lógica é partilhada entre Android e iOS (e até outras plataformas)
    Consistência entre as várias plataformas
    Custos de desenvolvimento mais baixos
    ✅ Baixo risco
    Não és obrigado a partilhar tudo. Tu decides o que queres partilhar entre ambas as plataformas
    ✅ A UI é desenvolvida nativamente
    Android em Java/Kotlin, iOS em objective-c/swift
    ✅ O código partilhado é desenvolvido em Kotlin
    Tiras partido de todas as funcionalidades que a linguagem te oferece
    ✅ Grande suporte da JetBrains e da comunidade
    desenvolvimento multiplatforma
    Android

    View Slide

  51. ❌ Ainda se encontra em alpha
    ❌ Os tempos de compilação para native (iOS) ainda são demorados
    ❌ Fazer debug em iOS não é uma tarefa fácil
    desenvolvimento multiplatforma
    Android

    View Slide

  52. View Slide

  53. *as aplicações são muitas vezes reescritas, por isso é possível que esta informação deixe de ser válida no futuro
    Space Cash App Yandex Maps Workspace
    exemplo de aplicações multiplatforma
    Android

    View Slide

  54. Git & GitHub

    View Slide

  55. ProjetoATP
    1
    1
    Android Studio
    ProjetoATP_1
    ProjetoATP_Aula3
    ProjetoATP_Final
    ProjetoATP_este
    ProjetoATP_Funciona
    ProjetoATP_FINAL_2
    ProjetoATP_2
    ProjetoATP_FINAL_
    FINAL
    ProjetoATP_FINAL_
    FINAL_A_ENVIAR_E
    STE
    ProjetoATP_FINAL_
    FINAL_A_ENVIAR_E
    STE_2

    View Slide

  56. Sistema de
    versionamento

    View Slide

  57. ● Sistema de controlo de versões distribuído
    ● Criado por Linus Torvalds (Linux)
    ● Lançado em 2005
    ● Multiplataforma, Linux, Mac OS e Windows
    Git

    View Slide

  58. Main
    Git

    View Slide

  59. Main
    Requisito 1
    Git

    View Slide

  60. Git
    Main
    Requisito 1

    View Slide

  61. Main
    Requisito 1
    Requisito 2
    Git

    View Slide

  62. Main
    Requisito 1
    Requisito 2
    Git

    View Slide

  63. Git

    View Slide

  64. Como instalar?

    View Slide

  65. highlight this link
    https://git-scm.com/book/en/v2/Getting-Started-Installing-Git

    View Slide

  66. GitHub

    View Slide

  67. ● Plataforma de armazenamento de código
    ● Grátis para projetos de código aberto
    ● Repositórios privados gratuitos para contas pessoais
    ● Todas as funcionalidades disponíveis para contas de Universidade
    GitHub

    View Slide

  68. View Slide

  69. View Slide

  70. View Slide

  71. View Slide

  72. https://github.com/android-training-program

    View Slide

  73. Photo by Austin Distel on Unsplash

    View Slide

  74. Uma pausa
    com
    Android 4.4

    View Slide

  75. Uma pausa
    com
    Mas não saiam dos vossos lugares
    (Não patrocinado infelizmente )
    Kitkat

    View Slide

  76. Kotlin

    View Slide

  77. View Slide

  78. ● Criada pela JetBrains em 2011
    ● Adotada como oficial para Android em 2017
    ● 100% interoperável com Java
    ● Multiplataforma
    ● Orientada a objetos e funcional, concisa e estaticamente tipada
    ● Nome de uma ilha na Rússia
    Kotlin

    View Slide

  79. View Slide

  80. Kotlin não é apenas sobre desenvolveres a tua aplicação com menos linhas de
    código mas sim para escreveres aplicações melhores e mais seguras.
    - Arnaud Giuliani, Android Makers 2017
    Kotlin

    View Slide

  81. Null
    safety
    Type
    inference
    Extensions
    String
    interpolation
    Default
    values
    Mutability
    Sealed
    Classes
    Data
    classes Collections
    When
    Kotlin

    View Slide

  82. null safety
    Kotlin

    View Slide

  83. var nameThatCanBeNull: String?
    var name: String
    null safety
    Kotlin
    null can not be a value of a non-null type String
    name = null
    nameThatCanBeNull = null
    Photo by Aziz Acharki on Unsplash

    View Slide

  84. printDog(name ?: "Bobi")
    printDog(name ?: "Bobi")
    var name: String?
    fun printDog(tag: String)
    printDog(name)
    null safety
    Kotlin
    Type mismatch
    Photo by Stephanie Klepacki on Unsplash

    View Slide

  85. dog = Dog("Max")
    val dog = Dog("Bobi")
    var doggo = Dog("Bobi")
    mutability
    Kotlin
    Val cannot be reassigned
    doggo = Dog("Max")
    val(ue)
    var(iable)

    View Slide

  86. when(dog.legs) {
    0 -> println("Humm... Será mesmo um cão? ")
    1 -> println("Oh, coitadinho ")
    2, 3 -> println("Ao menos consegue caminhar ")
    4 -> { println("Quem é lindo? Busca... ") }
    in 5..10 -> println("Assim mais parece uma ")
    else -> println("Pois, ninguém sabe ")
    }
    when
    Kotlin

    View Slide

  87. val dog: Dog = Dog()
    val dog = Dog()
    dog.legs = 4 // Int
    var legs = dog.legs
    dog.legs = 4L //Long
    type inference
    Kotlin
    val animal = getAnimal()
    fun printDog(dog: Dog)
    if(animal is Dog){
    printDog(animal)
    }
    The integer literal does not conform to the expected type Int

    View Slide

  88. sealed class Animal {
    data class Dog(val name: String): Animal()
    data class Cat(val name: String): Animal()
    data class Penguin(val name: String): Animal()
    }
    sealed class
    Kotlin
    Photo by Amy Asher on Unsplash

    View Slide

  89. public class Dog {
    private String name;
    public Dog(String name) {
    this.name = name;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Dog dog = (Dog) o;
    return Objects.equals(name, dog.name);
    }
    @Override
    public int hashCode() {
    return Objects.hash(name);
    }
    @Override
    public String toString() {
    return "Dog{" +
    "name='" + name + '\'' +
    '}';
    }
    }
    data class Dog(var name: String)
    data class
    Kotlin

    View Slide

  90. fun Int.plus2(): Int {
    return this + 2
    }
    val result = 5.plus2() // 7
    extensions
    Kotlin

    View Slide

  91. fun printDog(dog: Dog, legs: Int) {
    println("O " + dog.name + " tem " + legs + " patas")
    fun printNails(dog: Dog, legs: Int) {
    println("O ${dog.name} tem ${legs * 3} unhas")
    }
    printNails(Dog("Bobi"), 4)
    // “O Bobi tem 12 unhas”
    println("O ${dog.name} tem $legs patas")
    }
    string interpolation
    Kotlin

    View Slide

  92. fun printDog(name: String = "Bobi", legs: Int = 4) {
    println("O $name tem $legs patas)
    }
    fun printDog(name: String = "Bobi", legs: Int = 4) {
    println("O $name tem $legs patas)
    }
    printDog() // O Bobi tem 4 patas
    printDog("Max") // O Max tem 4 patas
    printDog("Toy", 2) // O Toy tem 2 patas
    printDog( legs = 2, name = "Toy") // O Toy tem 2 patas
    default values
    Kotlin

    View Slide

  93. ● getOrElse()
    ● find()
    ● filter()
    ● filterNot()
    ● fitletNotNull()
    ● flatMap()
    ● take()
    ● takeLast()
    ● sortBy()
    ● sortByDescending()
    ● groupBy()
    ● map()
    ● mapNotNull()
    ● all()
    ● any()
    ● sumBy()
    ● zip()
    ● ...
    collections
    Kotlin

    View Slide

  94. mutableListOf(1, null, 2, null, 3, 4, 5, 6, 7, 8, 9)
    .filterNotNull()
    .filter { it % 2 == 0 }
    .sortedDescending()
    > [1, null, 2, null, 3, 4, 5, 6, 7, 8, 9]
    collections
    Kotlin

    View Slide

  95. mutableListOf(1, null, 2, null, 3, 4, 5, 6, 7, 8, 9)
    .filterNotNull()
    .filter { it % 2 == 0 }
    .sortedDescending()
    > [1, 2, 3, 4, 5, 6, 7, 8, 9]
    collections
    Kotlin

    View Slide

  96. mutableListOf(1, null, 2, null, 3, 4, 5, 6, 7, 8, 9)
    .filterNotNull()
    .filter { it % 2 == 0 }
    .sortedDescending()
    > [2, 4, 6, 8]
    collections
    Kotlin

    View Slide

  97. mutableListOf(1, null, 2, null, 3, 4, 5, 6, 7, 8, 9)
    .filterNotNull()
    .filter { it % 2 == 0 }
    .sortedDescending()
    > [8, 6, 4, 2]
    collections
    Kotlin

    View Slide

  98. Android Server side
    Native
    em todo o lado
    Kotlin
    Web

    View Slide

  99. Kotlin Koans

    View Slide

  100. https://play.kotlinlang.org/koans/overview

    View Slide

  101. Semana 0
    Pronto para começar

    View Slide

  102. Desenvolver uma
    aplicação móvel

    View Slide

  103. 1. Ter uma ideia


    (o passo mais difícil na realidade)

    View Slide

  104. 2. Desenhá-la no papel

    Um título
    Algum texto, não muito. O
    suficiente para conseguir aqui
    ocupar três linhas. Feito.

    View Slide

  105. 3. Programá-la

    View Slide

  106. View Slide

  107. 4. Testar todas as funcionalidades

    View Slide

  108. 5. Corrigir os problemas encontrados

    View Slide

  109. 6. (Re)testar todas as funcionalidades

    View Slide

  110. 7. Submeter na Google Play Store

    View Slide

  111. https://play.google.com/console

    View Slide

  112. 8. Anunciar a todos os [email protected] para partilharem


    View Slide

  113. 9. Adicionar funcionalidades pagas

    View Slide

  114. 10. Reformar e viver dos lucros


    View Slide

  115. Android Studio

    View Slide

  116. ● Editor oficial para desenvolvimento Android
    ● Baseado no JetBrains' IntelliJ IDE
    ● Multiplataforma (Mac OS, Windows, Linux)
    ● Emulador e gestor de SDK’s pré-instalado
    ● Inspecção de base de dados, visualização e inspeção de UI, etc.
    Android Studio
    https://developer.android.com/studio/

    View Slide

  117. https://developer.android.com/studio/

    View Slide

  118. View Slide

  119. Vista de todos os ficheiros do projecto

    View Slide

  120. Compilar o
    projeto

    View Slide

  121. Dispositivos disponíveis

    View Slide

  122. View Slide

  123. Gestor emuladores ☝

    View Slide

  124. Gestor dos SDKs instalados ☝

    View Slide

  125. Sincronizar ficheiros Gradle

    View Slide

  126. Modo Debug ☝

    View Slide

  127. Correr a aplicação no dispositivo

    View Slide

  128. View Slide

  129. Parar a aplicação

    View Slide

  130. Output do último comando

    View Slide

  131. View Slide

  132. View Slide

  133. Logs da aplicação

    View Slide

  134. View Slide

  135. Limpar logs

    View Slide

  136. View Slide

  137. Vista de um layout

    View Slide

  138. Paleta de componentes gráficos

    View Slide

  139. Atributos da View selecionada

    View Slide

  140. Vista do código

    View Slide

  141. Vista partilhada

    View Slide

  142. Uma novidade fresquinha

    View Slide

  143. Novidades de
    hoje! AS 4.1

    View Slide

  144. Criar uma aplicação

    View Slide

  145. View Slide

  146. Emulador

    View Slide

  147. View Slide

  148. Telemóvel

    View Slide

  149. View Slide

  150. Materiais

    View Slide

  151. ● Android Developers
    ● Android Codelabs
    ● Android YouTube
    ● Android Medium
    ● Android GitHub
    ● Android Twitter
    ● Google Courses
    Queres aprender mais sobre Android?

    View Slide

  152. ● Kotlin Reference Manual
    ● Android Kotlin Fundamentals 01.1: Get started
    ● Kotlin Bootcamp for Programmers
    ● Kotlin Slack
    ● Kotlin Koans
    ● Kotlin Playground
    Mais sobre Kotlin

    View Slide

  153. ● Android Developers Backstage
    ● Ícones do Material Design
    ● Asset Generator
    ● Introduction to Github
    E ainda...

    View Slide

  154. ● Google Computer Science Curriculum
    ● Udacity Nanodegree
    ● Codecademy
    ● Udemy
    ● Coursera
    ● Khanacademy
    Queres aprender programar?

    View Slide

  155. Dúvidas?

    View Slide

  156. Obrigado
    ‍♀

    View Slide

  157. Android
    Training
    Program
    PORTUGAL
    Aula #1
    Bem-vindos ao Android
    Próxima aula: 21 de Outubro

    View Slide