Skip to content

Sumários

Luís Falcão edited this page Nov 13, 2019 · 14 revisions

Aula 01 - Apresentação

11-09-2019 (20:00/23h00 - G.0.08)

  • Apresentação
  • Âmbito da disciplina
  • Avaliação teórica e prática (3 entregas)

Aula 02 - Kotlin

13-09-2019 (18:30/20h00 - G.2.07)

  • Introdução ao ambiente de programação em Kotlin

  • Compilador Kotlin de linha de comando (kotlinc)

  • Modelo de execução sobre a JVM

  • Exercícios: Kotlin Koans

  • Caracterização geral da linguagem Kotlin:

    • Tipificação estática com inferência de tipos
    • Object-Oriented com suporte para os estilos imperativo e funcional
  • Funções: fun [<parametros de tipo>] <nome> ([parametros formais]) : [tipo retorno] {...}

  • Tipo Função -- notação especial correspondente à assinatura, i.e. (Tipo de Parametros) -> Tipo Retorno

  • Tipo Função e.g. (Int) -> String, () -> Unit, entre outros.

  • Typealias e.g. Predicate<T> = (T) -> Boolean

  • lambdas: { param1, param2, ... -> block } or { block }

  • it -- implicit lambda parameter

  • Function references - :: like Java

  • SAM (Single Abstract Method) compatível com lambda

  • read-only (e.g. listOf(), setOf) <vs> mutable collections (e.g. mutableListOf, mutableSetOf)


  • ? for Nullable -- val variable: Type? = value
  • ?. -- safe call -- access member only if not null. Otherwise returns null.

Recursos

Aula 03 - Implementação de um avaliador de expressões em Kotlin

18-09-2019 (20:00/23h00 - G.0.08)

  • Implementação um avaliador de expressões aritméticas em notação prefixa.
    • Não são contempladas prioridades entre operadores. A prioridade é dada pela ordem de processamento das operações.

    • As expressões podem ser constantes (e.g. 73, 9, etc) ou binárias (e.g. + 2 3, * 5 12, etc) ou compostas pelas expressões anteriores.

    • Exemplos:

      • A avaliação da expressão * + 3 4 + 7 2 tem o resultado 63 e é equivalente ao resultado de (3 + 4) * (7 + 2).
      • A expressão * + 3 4 + 7 2 5 tem o mesmo resultado que o anterior porque o 5 é ignorado, já que a última expressão binária fica completa em + 7 2.
      • No caso de + 3 4 * + 7 2 5 tem o resultado 7 porque a avaliação termina com apenas + 3 4.
      • A expressão * 3 4 + 4 dá 12. A avaliação termina com * 3 4. Se por outro lado tivéssemos. + * 3 4 4 daria 16 <=> (3 x 4) + 4.

Recursos


Aula 04 - Laboratório

20-09-2019 (18:30/20h00 - G.2.07)

Aula de laboratório. Resolução dos Kotlin Koans


Aula 05 - Android Intro

25-09-2019 (20:00/23h00 - G.0.08)

  • Basic parts: Manifest, Main Activity e Gradle build
  • Activity:
    • visual + comportamento

    • UI Component (subclasse de Context)

    • Visual (src/main/res/layout/...xml) + comportamento (src/main/java)

    • Analogia ao front-end Web: visual (HTML e CSS) + comportamento (Javascript)

    • Ciclo de vida, i.e. Created, Started (visível), Resumed (primeiro plano), Paused, Stopped, etc

    • Métodos "gancho", i.e. onCreated(), onStarted(), etc

    • São iniciadas por instâncias de Intent

  • Intent:
    • mensagem assíncrona;
    • ligação entre componentes (e.g. Activities)
    • Main Activity <-- intent.action.MAIN
  • UI = Layouts + Widgets:
    • Layouts = ViewGroup objects = widget containers
    • Widgets = View objects = UI components e.g. botões, caixas de texto, etc
  • ConstraintLayout
  • Android Studio Layout Editor ---> activity_...xml
  • R - classe gerada dinamicamente com constantes dos identificadores (e.g. R.id.buttonSend)
  • Eventos e Listeners -- view.setOnClickListener(View -> Unit)
  • findViewById(@IdRes int id)
    • Em kotlin esta chamada não é necessária uma vez que existem propriedades de extensão como o mesmo nome do id de cada View do layout da Activity

Recursos


Aula 06 - Ciclo de vida de uma Activity. Suporte para internacionalização

27-09-2019 (18:30/20h00 - G.2.07)

  • Activity: ciclo de vida

    • demo: logging lifecycle state transitions e.g. override fun onStart(){...}
  • Suporte para internacionalização em aplicações Android.


Recursos


Aula 07 - Lifecycle-Aware Components. Custom Views. Explicit Intens

02-10-2019 (20:00/23h00 - G.0.08)

  • Intercalação entre estados de activities da mesma App.
  • Lifecycle-Aware Components :
    • LifecycleOwner ----> LifecycleObserver
    • myLifecycleOwner.getLifecycle().addObserver(MyObserver())
    • e.g. @OnLifecycleEvent(Lifecycle.Event.ON_START)

  • Intent - representa uma mensagem assíncrona; ligação entre componentes (e.g. Activities)
    • e.g. Intent(this, DisplayMessageActivity::class.java):
    • Exlicit: identifica o tipo da actividade a ser instanciada (DisplayMessageActivity::class.java)
    • putExtra(key, value) e getStringExtra(key)
  • Iniciação de outra activity através de um Intent explícito startActivity(intent)
  • Android Manifest: android:parentActivityName --> navegação

  • Custom Views:
    • constructor(context: Context, attrs: AttributeSet)
    • custom drawing: onDraw(canvas: Canvas) e Paint
    • interaction: override fun onTouchEvent(event: MotionEvent)
  • Concepção da app Scrible:
    • ScribleView --->* Line --->* XyPair
  • Implementação de ScribleView:
val lines : MutableList<Line> = mutableListOf()
var curr : Line? = null

override fun onDraw(canvas: Canvas) = lines.forEach { it.draw(canvas) }
override fun onTouchEvent(event: MotionEvent): Boolean { ... }

Recursos


Aula 08 - onSaveInstanceState e Serializable e Parcelable

04-09-2019 (18:30/20h00 - G.2.07)

  • Activity -- onSaveInstanceState(Bundle) e onRestoreInstanceState(Bundle)
  • Bundle:
    • Pares chave--valor
    • put<Primitive> ou put<Primitive>Array
    • Instâncias de tipos complexos => Serializable !!! Atenção aos custos !!!
      • Alternativa Parcelable
  • Implementar Serializable em Line e XyPair
  • View -- onSaveInstanceState(): Parcelable e onRestoreInstanceState(state: Parcelable)
  • Implementar Parcelable em Line e XyPair:
    • writeToParcel(dest: Parcel) : T
    • Parcelable.Creator<T> :: createFromParcel(source: Parcel) : T
    • Parcelable.Creator<T> :: newArray(int size) : Array<T>

Recursos


Aula 09 - Não houve aula

09-10-2019 (20:00/23h00 - G.0.08)

Não houve aula por impossibilidade do docente.


Aula 10 - View Model

11-10-2019 (18:30/20h00 - G.2.07)

  • View Model

    • Manutenção de estado da User Interface (UI), tendo em consideração o cíclo de vida de um controlador de UI, tais como Activities ou Fragments.
    • A instância de ViewModel mantém-se ativa até o Lifecycle a que está associado cessar permanentemente.
    • Implementação de um ViewModel:
      class MainActivityViewModel : ViewModel() {
      }
    • Obtenção de uma instância de ViewModel: ViewModelProviders.of(this)[MainActivityViewModel::class
  • Exº Manutenção do estado de uma activity que contém um contador através de ViewModel


Recursos


Aula 11 - ViewModel (continuação). RecyclerView e biblioteca Volley

16-10-2019 (20:00/23h00 - G.0.08)

  • Manutenção de estado da aplicação Scrible através de ViewModel.

  • RecyclerView -- 1. scrolling list, 2. large data sets, 3. data that frequently changes
  • Dependência gradle: 'androidx.recyclerview:recyclerview:1.0.0'
  • RecyclerView:
    • view holder object:
      • Um objeto por cada elemento visualizado
      • Instância de RecyclerView.ViewHolder
      • São instanciados apenas o número de view holders necessários à UI
    • view holder objects -- geridos por adapters -- instâncias de RecyclerView.Adapter.
    • adapter -- liga (binds) view holders aos seus dados ---> onBindViewHolder()
  • Implementação de RecyclerView.Adapter:
    • class <Name> : RecyclerView.Adapter<ViewHolder_Name>()
    • override fun getItemCount() -- número de elementos na fonte de dados
    • override fun onBindViewHolder(holder ...) -- atribui dados ao holder
    • override fun onCreateViewHolder(parent ... ):
      1. Obtém a View correspondente a um layout
      2. Inflate parent com a View do ponto 1.
      3. Instância e retorna um novo ViewHolder

  • Implementação da App GeniuZ para apresentação de informações da Last.fm Web API.
  • Utilização de RecyclerView com implementação de ArtistAdapter para dados só em memória (i.e. Array<ArtistDto>)
  • LayoutManager e LinearLayoutManager

  • Android HTTP framework envolve várias ações:

    1. Construção de um pedido HTTP
    2. Execução
    3. Obtenção da resposta
    4. Parsing headers e body e.g. JSON => Objeto
    5. Atualizar a UI.
  • Volley - biblioteca HTTP para Android:

    • 'com.android.volley:volley:1.1.1'
    • RequestQueue ---->* Request
    • Gestão de worker threads
    • Entrega a resposta de volta à main thread ( => actualização safe da UI)
    • Volley.newRequestQueue(context)
    • queue.add(request)
    • StringRequest(Request.Method,<url>,Response.Listener<String>,Response.ErrorListener)
    • AndroidManifest.xml: <uses-permission android:name="android.permission.INTERNET" />
    • Implementação de LastfmWebApi via Volley com API baseada em callbacks
  • Problema: operações de IO, parsing ou qq trabalho de background não pode ocupar a UI thread


Recursos


Aula 12 - Refactoring dos projeto RecyclerView e Http

18-10-2019 (18:30/20h00 - G.2.07)

  • Projeto RecyclerView refactored

    • Create the interface LastfmWebApi
    • Have a blocking (LastfmWebApiBlocking) and a non blocking (LastfmWebApiImpl) implementations
  • Observar o resultado de executar IO na main thread:

  • Distinção entre idioma Sync versus Async:

    • Sync: Resultado = Retorno do método => Conclusão da execução do método
    • Async: Resultado != Retorno do método
  • Projeto Http refactored

    • Isolar os o código que trata dos pedidos Http na classe HttpRequests
    • A MainActivity passa a interagir diretamente com o ViewModel e não com a implementação de LastfmWebApi.

Recursos


Aula 13 - Aula prática

23-10-2019 (20:00/23h00 - G.0.08)

  • Aula prática de apoio à realização do 1º trabalho prático.