-
Notifications
You must be signed in to change notification settings - Fork 0
Sumários
- Aula 01 - Apresentação
- Aula 02 - Kotlin
- Aula 03 - Implementação de um avaliador de expressões em Kotlin
- Aula 04 - Laboratório
- Aula 05 - Android Intro
- Aula 06 - Ciclo de vida de uma Activity. Suporte para internacionalização
- Aula 07 - Lifecycle-Aware Components. Custom Views. Explicit Intens
- Aula 08 -
onSaveInstanceState
eSerializable
eParcelable
- Aula 09 - Não houve aula
- Aula 10 - View Model
- Aula 11 - ViewModel (continuação). RecyclerView e biblioteca Volley
- Aula 12 - Refactoring dos projeto RecyclerView e Http
- Aula 13 - Aula prática
11-09-2019 (20:00/23h00 - G.0.08)
- Apresentação
- Âmbito da disciplina
- Avaliação teórica e prática (3 entregas)
13-09-2019 (18:30/20h00 - G.2.07)
-
Introdução ao ambiente de programação em Kotlin
-
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 notnull
. Otherwise returns null.
Recursos
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
.
- A avaliação da expressão
-
Recursos
20-09-2019 (18:30/20h00 - G.2.07)
Aula de laboratório. Resolução dos Kotlin Koans
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
-
Layouts =
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
27-09-2019 (18:30/20h00 - G.2.07)
-
Activity
: ciclo de vida-
demo: logging lifecycle state transitions e.g.
override fun onStart(){...}
-
demo: logging lifecycle state transitions e.g.
-
Suporte para internacionalização em aplicações Android.
Recursos
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)
egetStringExtra(key)
- e.g.
- 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)
ePaint
-
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
04-09-2019 (18:30/20h00 - G.2.07)
-
Activity
--onSaveInstanceState(Bundle)
eonRestoreInstanceState(Bundle)
-
Bundle
:- Pares chave--valor
-
put<Primitive>
ouput<Primitive>Array
- Instâncias de tipos complexos
=>
Serializable
!!! Atenção aos custos !!!- Alternativa
Parcelable
- Alternativa
- Implementar
Serializable
emLine
eXyPair
-
View
--onSaveInstanceState(): Parcelable
eonRestoreInstanceState(state: Parcelable)
- Implementar
Parcelable
emLine
eXyPair
:writeToParcel(dest: Parcel) : T
-
Parcelable.Creator<T>
::
createFromParcel(source: Parcel) : T
-
Parcelable.Creator<T>
::
newArray(int size) : Array<T>
Recursos
09-10-2019 (20:00/23h00 - G.0.08)
Não houve aula por impossibilidade do docente.
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
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()
-
view holder object:
- 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 aoholder
-
override fun onCreateViewHolder(parent ... )
:- Obtém a
View
correspondente a um layout -
Inflate parent com a
View
do ponto 1. - Instância e retorna um novo
ViewHolder
- Obtém a
- Implementação da App GeniuZ para apresentação de informações da Last.fm Web API.
- Utilização de
RecyclerView
com implementação deArtistAdapter
para dados só em memória (i.e.Array<ArtistDto>
) -
LayoutManager
eLinearLayoutManager
-
Android HTTP framework envolve várias ações:
- Construção de um pedido HTTP
- Execução
- Obtenção da resposta
-
Parsing headers e body e.g. JSON
=>
Objeto - 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
- [Código da aula]
- RecyclerView
- Biblioteca Voley
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
- Create the interface
-
Observar o resultado de executar IO na main thread:
- Exemplo: pedido HTTP bloqueante via
URL
(LastfmWebApiBlocking
) - NetworkOnMainThreadException
- Exemplo: pedido HTTP bloqueante via
-
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
-
Sync: Resultado
-
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 deLastfmWebApi
.
- Isolar os o código que trata dos pedidos Http na classe
Recursos
23-10-2019 (20:00/23h00 - G.0.08)
- Aula prática de apoio à realização do 1º trabalho prático.