-
Notifications
You must be signed in to change notification settings - Fork 0
Sumarios
fmcarvalho edited this page Oct 7, 2019
·
34 revisions
Aulas:
- 09-09-2019 - Aula 01 - Apresentação
- 11-09-2019 - Aula 02 - Kotlin
- 16-09-2019 - Aula 03 - Kotlin - laboratório
- 16-09-2019 - Aula 04 - Kotlin - laboratório
- 23-09-2019 - Aula 05 - Android Intro
- 23-09-2019 - Aula 06 - Android LifeCycle
- 30-09-2019 - Aula 07 - Eventos e Listeners
- 30-09-2019 - Aula 08 - Custom Views
-
02-10-2019 - Aula 09 -
onSaveInstanceState
eSerializable
eParcelable
09-09-2019
- Apresentação.
- Âmbito da disciplina.
- Avaliação teórica e prática (3 entregas).
- 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 notnull
. Otherwise returns null.
- Resolução do TPC 2
- Basic parts: Manifest, Main Activity e Gradle build;
-
Activity
: UI Component (subclasse deContext
) -
Activity
:- visual + comportamento
- visual (
src/main/res/layout/...xml
) + comportamento (src/main/java
) - Analogia ao front-end Web: visual (HTML e CSS) + comportamento (Javascript)
-
Activity
-- ciclo de vida, i.e.Created
,Started
(visível),Resumed
(primeiro plano),Paused
,Stopped
, etc; -
Activity
-- métodos "gancho", i.e.onCreated()
,onStarted()
, etc
-
Actvities sao 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)
-
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.
startActivity(intent)
-
Android Manifest:
android:parentActivityName
-->
navegação -
Activity
: ciclo de vida -
demo: logging lifecycle state transitions e.g.
override fun onStart(){...}
- 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)
-
-
Custom Views:
constructor(context: Context, attrs: AttributeSet)
-
custom drawing:
onDraw(canvas: Canvas)
ePaint
-
interaction:
override fun onTouchEvent(event: MotionEvent)
- Concepção da app
Sketcher
:-
SketcherView
--->*
Line
--->*
XyPair
-
- Implementação de
SketcherView
:
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 { ... }
- TPC: Identificar a instrução em falta para que a UI seja actualizada em resposta da interacção com utilizador.
-
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>
-
TPC: Completar a implementação de
Parcelable
emLine
. SubstituirSerializable
porParcelable
emon<Save|Restores>InstanceState
- Implementação de
Parcelable
- Evitar a criação de um array intermédio.
- Teste unitário para a implementação de
Parcelable
- !!! Problema: obter uma instância real de
Parcel
? (depende da infra-estrutura Android) - Robolectric framework -- ambiente Android para os testes unitários.
androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0
- Adicionar
ViewModel
a sketcher app:class SketcherModel : ViewModel()
- Mover
lines
paraSketcherViewModel
- Transformação do desenho da aplicação
Sketcher
paraViewModel
:-
MainActivity
--->1
SketcherView
---->*
Line
---->*
XyPair
-
MainActivity
--->1
SketcherView
--->1
SketcherViewModel
---->*
Line
---->*
XyPair
-
-
SketcherView
--->1
SketcherViewModel
através de:ViewModelProviders.of(ctx)[SketcherModel::class.java]
- Instância de
ViewModel
é gerida pela infra-estrutura.