SlideShare uma empresa Scribd logo
Desenvolvimento moderno
de aplicativos Android
Um guia [quase] completo
+Nelson Glauber
@nglauber

www.nglauber.com.br

youtube.com/nglauber
Curso de Android (2009)
Introdução ao Android................. 1h
Configuração do Ambiente.............. 1h
Conceitos Básicos..................... 2h
Activity.............................. 4h
Intents............................... 2h
Interface Gráfica (Layouts e Views)... 8h
IntentFilter.......................... 2h
BroadcastReceiver..................... 1h
Notification.......................... 1h
Service............................... 2h
AlarmManager.......................... 1h
Handler............................... 1h
SQLite................................ 4h
ContentProvider....................... 2h
Mapas e GPS........................... 3h
HTTP, Sockets e Web Services.......... 4h
SMS................................... 1h
Audio e Vídeo......................... 2h
-----------------------------------------
TOTAL 42h
O que é ser um
desenvolvedor Android
“moderno"?
ATUAL
Comunidade
1
slack.androiddevbr.org www.gdgrecife.com
Linguagem
2
Outras linguagens
evoluíram… 

o Java (para Android) não
Porque Kotlin?
• Linguagem moderna, concisa, intuitiva e fácil de aprender.
• Open Source, mantido pela JetBrains
• 100% Inter-operável com Java. Você pode possuir código Java e
Kotlin no mesmo projeto (inclusive libs).
• Suporte nativo no Android Studio.
• Menos verboso. Você escreve menos código.
• Null Safety
• Possui recursos de linguagens funcionais
• Inferência de tipos, lambda, extension functions, high-order
functions, …
youtu.be/FHZ6bI3zb4M
youtu.be/R99z12zLFRw
3 Criação de
Layouts
Layouts
• FrameLayout
• RelativeLayout
• LinearLayout
• TableLayout
• GridLayout
• e muitos outros…
ConstraintLayout
• Implementa o conceito de flat layout. Melhorando a
performance.
• É um mix dos demais layouts, com mais recursos.
• É muito mais fácil criar os layout utilizando visual editor.
Mas o XML continua legível.
• É uma biblioteca separada do S.O., o que facilita a
atualização
• A adoção por parte dos desenvolvedores iOS é facilitada.
Flat layout
Não parece lá
“grandes coisa”…
Área de clique
errada
Aspect Ratio ?
Área de clique
errada
! 11 componentes a mais!!!
ConstraintLayout 1.0
• Posicionamento relativo
• Bias
• Guidelines
• Chains
• Ratio support
• ConstraintSet
ConstraintLayout 1.1.0-beta3
• Barriers
• Group
• Placeholders
• Percent
• Circular positioning
youtu.be/dvr-yTklOUY
youtu.be/YSz-k4sbUiE
4 Arquitetura
Activity é uma tela do seu
aplicativo…
• Ela acessa o banco de dados
• Ela acessa a web
• Ela valida campos
• Ela controla o fluxo da tela
Pague as consequências!!!
• Código altamente acoplado
• Difícil de mante e adicionar
novas funcionalidades
• Difícil de testar,
consequentemente instável
• Resumindo: viola todos os
princípios do S.O.L.I.D.
Initial Stands for Concept
S SRP[4] Single responsibility principle
a class should have only a single responsibility (i.e. only one potential change
in the software's specification should be able to affect the specification of the
class)
O OCP[5] Open/closed principle
“software entities … should be open for extension, but closed for modification.”
L LSP[6] Liskov substitution principle
“objects in a program should be replaceable with instances of their subtypes
without altering the correctness of that program.” See also design by contract.
I ISP[7] Interface segregation principle
“many client-specific interfaces are better than one general-purpose
interface.”[8]
D DIP[9] Dependency inversion principle
one should “depend upon abstractions, [not] concretions.”[8]
github.com/googlesamples/android-architecture
MVP
View
IView
Presenter Model
Interação 

do usuário
Request
DadosLógica de UI
MVVM
View ViewModel Model
Observables
Interação 

do usuário
Dados
Request
Data Binding
• Facilita a ligação entre View Model e View
• Estende os arquivos de layout com micro-
expressões
• Binders customizados reduzem a repetição de
código
Book book = (Book)getIntent().getSerializableExtra(EXTRA_LIVRO);
ImageView imgCover = (ImageView) findViewById(R.id.image_cover);
TextView txtTitle = (TextView) findViewById(R.id.text_title);
TextView txtAuthor = (TextView) findViewById(R.id.text_author);
TextView txtPages = (TextView) findViewById(R.id.text_pages);
TextView txtYear = (TextView) findViewById(R.id.text_year);
TextView txtPublisher = (TextView) findViewById(R.id.text_publisher);
TextView txtAvailable = (TextView) findViewById(R.id.text_available);
TextView txtMediaType = (TextView) findViewById(R.id.text_media_type);
RatingBar ratingBook = (RatingBar) findViewById(R.id.rating_book);
Glide.with(this).load(book.getCoverUrl()).into(imgCover);
txtTitle.setText(book.getTitle());
txtAuthor.setText(book.getAuthor());
txtPages.setText(getString(R.string.text_format_book_pages, book.getPages()));
txtYear.setText(getString(R.string.text_format_book_year, book.getYear()));
txtPublisher.setText(book.getPublisher().getName());
txtAvailable.setText(book.isAvailable() ?
R.string.text_book_available : R.string.text_book_unavailable);
txtMediaType.setText(book.getMediaType().toString());
ratingBook.setNumStars(book.getRating());
book.setCoverUrl(imageFile.getAbsolutePath());
book.setTitle(editPages.getText().toString());
book.setAuthor(editAuthor.getText().toString());
book.setPages(Integer.parseInt(editPages.getText().toString()));
book.setYear(Integer.parseInt(editYear.getText().toString()));
book.setPublisher((Publisher) spinnerPublisher.getSelectedItem());
book.setAvailable(checkAvailable.isChecked());
book.setMediaTypeValue(radioMediaEbook.isChecked() ?

MediaType.EBOOK : MediaType.PAPER);
book.setRating(ratingBook.getRating());
saveBook(book);
Book book = (Book)getIntent().getSerializableExtra(EXTRA_BOOK);
ActivityDetailViewBinding mBinding =

DataBindingUtil.setContentView(this, R.layout.activity_detail_view);
mBinding.setBook(book);
...
saveBook(mBinding.book);
<layout ...>
<data>
...
<import type="br.com.nglauber.livrosfirebase.model.MediaType" />
<variable name="book"
type="br.com.nglauber.livrosfirebase.model.Book" />
</data>
<LinearLayout ...>
<ImageView android:src="@{book.coverUrl}" ... />
<EditText android:text="@={book.title}" ... />
<EditText android:text="@={book.author}" ... />
<EditText android:text="@={book.pages}" ... />
<EditText android:text="@={book.year}" ... />
<Spinner ...>
<CheckBox android:checked="@={book.available}" ... />
<RadioGroup ...>
<RadioButton ...
android:checked="@{book.mediaTypeValue == MediaType.EBOOK}" ... />
<RadioButton ...
android:checked="@{book.mediaTypeValue == MediaType.PAPER}" ... />
</RadioGroup>
<RatingBar
android:rating="@={book.rating}" ... />
...
</LinearLayout>
</layout>
youtu.be/0UXeUhU8AiE?t=27m19s
Architecture
Components
Lifecycle
ViewModel
LiveData
Room
Lifecycle
• Lifecycle é um objeto que define um ciclo de vida
• LifecycleOwner é uma interface para objetos com um
ciclo de vida
• A partir da appcompat 26.1, Activity e Fragment
implementam LifecycleOwner.
• LifecycleObserver é uma interface para observar um
LifecycleOwner
class MyLifecycleObserver: LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun start() {
Log.d("NGVL", "onStart!!!")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop() {
Log.d("NGVL", "onStop!!!")
}
}
class YourActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_your)
val observer = MyLifecycleObserver()
lifecycle.addObserver(observer)
...
}
}
ViewModel
class ScoreViewModel: ViewModel() {
var score = Score()
fun updateTeamA() {
score.teamA++
}
fun updateTeamB() {
score.teamB++
}
fun reset(){
score.teamA = 0
score.teamB = 0
}
}
class MainActivity : AppCompatActivity() {
private val viewModel: ScoreViewModel by lazy {
ViewModelProviders.of(this).get(ScoreViewModel::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val score = viewModel.score
...
}
}
Cuidado!!!
• Não passe referências de Activities ou Fragments para o
ViewModel
• Se precisar de um Context, crie uma subclass de
AndroidViewModel que terá uma instância do contexto
da aplicação
• Se precisar passar parâmetros para o ViewModel, é preciso
criar uma subclasse de
ViewModelProvider.NewInstanceFactory
• O ViewModel não substitui o onSaveInstanceState!
LiveData
• LiveData armazena dados observáveis (Observable) e
notifica os observadores (Observers) quando esses dados
mudam para que a UI seja atualizada.
• O LiveData é lifecycle-aware. Ele só notificará a UI se a
Activity/Fragment estiver no estado STARTED ou
RESUMED.
class CharactersViewModel : ViewModel() {
val characters = MutableLiveData<List<Character>>()
fun loadCharacters() {
// Carregar dados da web...
characters.value = list
}
...
}
class CharactersActivity : AppCompatActivity() {
private val viewModel: CharactersViewModel /*init*/
private val adapter: CharactersAdapter /*init*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_characters)
viewModel.load()
viewModel.characters.observe(this, Observer { characters ->
adapter.setItems(characters)
})
...
}
}
Room
• ORM para Android sobre o SQLite.
• Suporta atualização automática da UI com LiveData ou
RXJava
Room
import android.arch.persistence.room.*
@Entity
data class Event(
@PrimaryKey (autoGenerate = true)
var id : Long = 0,
var name : String = "",
var description : String = ""
)
import android.arch.persistence.room.*
@Dao
interface EventDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(event: Event): Long
@Update
fun update(event: Event): Int
@Delete
fun delete(vararg event: Event): Int
@Query("SELECT * FROM Event WHERE description LIKE :descr")
fun eventsByDescription(descr: String = "%"): List<Event>
@Query("SELECT * FROM Event WHERE id = :id")
fun eventById(id: Long): Event
}
import android.arch.persistence.room.*
@Dao
interface EventDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(event: Event): Long
@Update
fun update(event: Event): Int
@Delete
fun delete(vararg event: Event): Int
@Query("SELECT * FROM Event WHERE description LIKE :descr")
fun eventsByDescription(descr: String = "%"): LiveData<List<Event>>
@Query("SELECT * FROM Event WHERE id = :id")
fun eventById(id: Long): LiveData<Event>
}
import android.arch.persistence.room.Database
import android.arch.persistence.room.RoomDatabase
@Database(entities = arrayOf(Event::class), version = 1)
abstract class MyRoomDatabase : RoomDatabase() {
abstract fun eventDao() : EventDao
}
val db = Room.databaseBuilder(applicationContext,
MyRoomDatabase::class.java, "myDb")
.build()
val dao = db.eventDao()
val event = Event(0, "DevFestXP", "DevFest Recife 2017")
val id = dao.insert(event)
val event2 = dao.eventById(id)
Log.d("NGVL", "${event2.id} ${event2.name} - ${event2.description}")
val events = dao.eventsByDescription()
events.forEach {
Log.d("NGVL", "${it.id} ${it.name} - ${it.description}")
}
Arquitetura
youtu.be/mnC1aN2yhqI
5 Programação
Assíncrona
60 FPS
1000ms / 60 frames
= 

16.666ms per frame
Assíncrono
• Threads and Handlers
• AsyncTask
• Loaders
• IntentService
RX Java
RxJava é uma biblioteca que permite representar
qualquer operação como um fluxo assíncrono de
dados criado por qualquer thread, de forma declarativa
e consumida por múltiplos objetos em várias threads.
Observable.zip(
Observable.just("Joey", "Chandler", "Ross",
"Rachel", "Monica", "Phoebe"),
Observable.just("Ted", "Barney", "Marshall",
"Robin", "Lily"),
BiFunction<String, String, String> { friend, himym ->
"$friend - $himym"
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { t ->
print(t)
}
12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Joey - Ted
12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Chandler - Barney
12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Ross - Marshall
12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Rachel - Robin
12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Monica - Lily
fun loadMoviesFull(): Observable<Movie> {
return service.listMovies()
.flatMap { filmResults -> Observable.from(filmResults.results) }
.flatMap { film ->
Observable.zip(
Observable.just(Movie(film.title, film.episodeId, ArrayList())),
Observable.from(film.personUrls)
.flatMap { personUrl ->
Observable.concat(
getCache(personUrl),
service
.loadPerson(Uri.parse(personUrl).lastPathSegment)
.doOnNext { person ->
peopleCache.put(personUrl, person)
}
).first()
}
.flatMap { person ->
Observable.just(Character(person.name, person.gender))
}.toList(),
{ movie, characters ->
movie.characters.addAll(characters)
movie
}
)
}
}
youtu.be/ZxhX7a-ScUs
Coroutines
suspend fun async1(): String {
delay(5, TimeUnit.SECONDS)
Log.d("NGVL", "async1 -> ${Thread.currentThread().name}")
return "Async1"
}
suspend fun async2(): String {
delay(1, TimeUnit.SECONDS)
Log.d("NGVL", "async2 -> ${Thread.currentThread().name}")
return "Async2"
}
fun load() {
launch(UI) {
val s = try {
val a = async { async1() }
val b = async { async2() }
"${a.await()} ${b.await()}"
} catch (e: Exception) {
"Error!"
}
button.text = s
}
}
youtu.be/Xo5Fp4UqXY8
6 Firebase
https://goo.gl/A6GW4s
7 Testes
Testes
UI Automator
• Você não precisa usar todos esses
recursos no mesmo app…
• Na verdade, você não precisa usar
nenhum!
• Mais importante do que saber quando
USAR é saber quando NÃO USAR 😉
• Mas é essencial conhecer tópicos,
saber seus prós e contras e utilizá-los
adequadamente 💡
Um desenvolvedor
moderno…
1. Faça parte da comunidade!!!
2. Kotlin como linguagem de programação
3. Constraint Layout para criação de UI
4. Uma boa arquitetura na camada de apresentação. Com MVP ou
MVVM (por exemplo)
5. Multi-threading
6. Firebase como serviço de cloud
7. Testes para garantir a estabilidade do código
@nglauber
+NelsonGlauber
www.nglauber.com.br

Obrigado!
youtube.com/nglauber
Dúvidas?

Mais conteúdo relacionado

Mais procurados

Android Libs - AndroidDevConf
Android Libs - AndroidDevConfAndroid Libs - AndroidDevConf
Android Libs - AndroidDevConf
Nelson Glauber Leal
 
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Rodrigo Branas
 
AngularJS - Just Digital
AngularJS - Just DigitalAngularJS - Just Digital
AngularJS - Just Digital
Just Digital
 
Visão Geral sobre Angular JS
Visão Geral sobre Angular JSVisão Geral sobre Angular JS
Visão Geral sobre Angular JS
Leonardo Melo Moreira
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Daniel Makiyama
 
Material Design simples e rapido com AngularJS
Material Design simples e rapido com AngularJSMaterial Design simples e rapido com AngularJS
Material Design simples e rapido com AngularJS
Henrique Limas
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
Rodrigo Branas
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJS
Rodrigo Branas
 
TDC 2014 - Arquitetura front-end com AngularJS
TDC 2014 - Arquitetura front-end com AngularJSTDC 2014 - Arquitetura front-end com AngularJS
TDC 2014 - Arquitetura front-end com AngularJS
Leonardo Zanivan
 
Angular js
Angular jsAngular js
Angular js
Bruno Catão
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
Gustavo Lopes
 
WordCamp Floripa 2021 - Daniel - Core web vitals e WordPress
WordCamp Floripa 2021 - Daniel  - Core web vitals e WordPressWordCamp Floripa 2021 - Daniel  - Core web vitals e WordPress
WordCamp Floripa 2021 - Daniel - Core web vitals e WordPress
WordCamp Floripa
 
Anatomia do JSF – JavaServer Faces
Anatomia do JSF – JavaServer FacesAnatomia do JSF – JavaServer Faces
Anatomia do JSF – JavaServer Faces
cejug
 
Performance e otimização no wordpress
Performance e otimização no wordpressPerformance e otimização no wordpress
Performance e otimização no wordpress
Daniel Paz
 
Aula16 - Jquery
Aula16 - JqueryAula16 - Jquery
Aula16 - Jquery
Jorge Ávila Miranda
 
Curso Grátis Editor Gutenberg Wordpress (Material de Curso)
Curso Grátis Editor Gutenberg Wordpress (Material de Curso)Curso Grátis Editor Gutenberg Wordpress (Material de Curso)
Curso Grátis Editor Gutenberg Wordpress (Material de Curso)
Junior Cammel
 
Guga Alves apresenta Gutenberg fase 2 e 3
Guga Alves apresenta Gutenberg fase 2 e 3Guga Alves apresenta Gutenberg fase 2 e 3
Guga Alves apresenta Gutenberg fase 2 e 3
WordCamp Floripa
 
Grails: O Java em Alta Produtividade
Grails: O Java em Alta ProdutividadeGrails: O Java em Alta Produtividade
Grails: O Java em Alta Produtividade
Cleórbete Santos
 
Ebook - Processo de Otimização de Sites WordPress
Ebook - Processo de Otimização de Sites WordPressEbook - Processo de Otimização de Sites WordPress
Ebook - Processo de Otimização de Sites WordPress
Daniel Paz
 
Apache Wicket derruba o padrão JSF
Apache Wicket derruba o padrão JSFApache Wicket derruba o padrão JSF
Apache Wicket derruba o padrão JSF
Bruno Borges
 

Mais procurados (20)

Android Libs - AndroidDevConf
Android Libs - AndroidDevConfAndroid Libs - AndroidDevConf
Android Libs - AndroidDevConf
 
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
 
AngularJS - Just Digital
AngularJS - Just DigitalAngularJS - Just Digital
AngularJS - Just Digital
 
Visão Geral sobre Angular JS
Visão Geral sobre Angular JSVisão Geral sobre Angular JS
Visão Geral sobre Angular JS
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
 
Material Design simples e rapido com AngularJS
Material Design simples e rapido com AngularJSMaterial Design simples e rapido com AngularJS
Material Design simples e rapido com AngularJS
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJS
 
TDC 2014 - Arquitetura front-end com AngularJS
TDC 2014 - Arquitetura front-end com AngularJSTDC 2014 - Arquitetura front-end com AngularJS
TDC 2014 - Arquitetura front-end com AngularJS
 
Angular js
Angular jsAngular js
Angular js
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
 
WordCamp Floripa 2021 - Daniel - Core web vitals e WordPress
WordCamp Floripa 2021 - Daniel  - Core web vitals e WordPressWordCamp Floripa 2021 - Daniel  - Core web vitals e WordPress
WordCamp Floripa 2021 - Daniel - Core web vitals e WordPress
 
Anatomia do JSF – JavaServer Faces
Anatomia do JSF – JavaServer FacesAnatomia do JSF – JavaServer Faces
Anatomia do JSF – JavaServer Faces
 
Performance e otimização no wordpress
Performance e otimização no wordpressPerformance e otimização no wordpress
Performance e otimização no wordpress
 
Aula16 - Jquery
Aula16 - JqueryAula16 - Jquery
Aula16 - Jquery
 
Curso Grátis Editor Gutenberg Wordpress (Material de Curso)
Curso Grátis Editor Gutenberg Wordpress (Material de Curso)Curso Grátis Editor Gutenberg Wordpress (Material de Curso)
Curso Grátis Editor Gutenberg Wordpress (Material de Curso)
 
Guga Alves apresenta Gutenberg fase 2 e 3
Guga Alves apresenta Gutenberg fase 2 e 3Guga Alves apresenta Gutenberg fase 2 e 3
Guga Alves apresenta Gutenberg fase 2 e 3
 
Grails: O Java em Alta Produtividade
Grails: O Java em Alta ProdutividadeGrails: O Java em Alta Produtividade
Grails: O Java em Alta Produtividade
 
Ebook - Processo de Otimização de Sites WordPress
Ebook - Processo de Otimização de Sites WordPressEbook - Processo de Otimização de Sites WordPress
Ebook - Processo de Otimização de Sites WordPress
 
Apache Wicket derruba o padrão JSF
Apache Wicket derruba o padrão JSFApache Wicket derruba o padrão JSF
Apache Wicket derruba o padrão JSF
 

Semelhante a Desenvolvimento Moderno de aplicativos Android

Aula02 android hands_on
Aula02 android hands_onAula02 android hands_on
Aula02 android hands_on
Roberson Alves
 
Minicurso Android Ronildo Oliveira
Minicurso Android  Ronildo OliveiraMinicurso Android  Ronildo Oliveira
Minicurso Android Ronildo Oliveira
Ronildo Oliveira
 
Apresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno CottaApresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno Cotta
GPrimola
 
Apresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadasApresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadas
Victor Aldir
 
Apostilaandroidfatecnormal
ApostilaandroidfatecnormalApostilaandroidfatecnormal
Apostilaandroidfatecnormal
antonio sérgio nogueira
 
TDC - Introdução ao Actor Model com Microsoft Orleans
TDC - Introdução ao Actor Model com Microsoft OrleansTDC - Introdução ao Actor Model com Microsoft Orleans
TDC - Introdução ao Actor Model com Microsoft Orleans
Fabio Gouw
 
Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03
Horacio Diamante Mondlane
 
Introdução à programação para Android
Introdução à programação para AndroidIntrodução à programação para Android
Introdução à programação para Android
Jorge Cardoso
 
Android Palestra
Android PalestraAndroid Palestra
Android Palestra
Renato
 
Android - Notas de aula
Android - Notas de aulaAndroid - Notas de aula
Android - Notas de aula
antonio sérgio nogueira
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
Dr. Spock
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
Campus Party Brasil
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Carlos Duarte do Nascimento
 
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
Adriel Café
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptx
Ricardo Ogliari
 
Material Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu AppMaterial Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu App
alissin
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
Dr. Spock
 
Apresentando o OpsWorks - Bemobi
Apresentando o OpsWorks - BemobiApresentando o OpsWorks - Bemobi
Apresentando o OpsWorks - Bemobi
Ricardo Martins ☁
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
Rafael Benevides
 
Orientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a PraticaOrientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a Pratica
elliando dias
 

Semelhante a Desenvolvimento Moderno de aplicativos Android (20)

Aula02 android hands_on
Aula02 android hands_onAula02 android hands_on
Aula02 android hands_on
 
Minicurso Android Ronildo Oliveira
Minicurso Android  Ronildo OliveiraMinicurso Android  Ronildo Oliveira
Minicurso Android Ronildo Oliveira
 
Apresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno CottaApresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno Cotta
 
Apresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadasApresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadas
 
Apostilaandroidfatecnormal
ApostilaandroidfatecnormalApostilaandroidfatecnormal
Apostilaandroidfatecnormal
 
TDC - Introdução ao Actor Model com Microsoft Orleans
TDC - Introdução ao Actor Model com Microsoft OrleansTDC - Introdução ao Actor Model com Microsoft Orleans
TDC - Introdução ao Actor Model com Microsoft Orleans
 
Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03
 
Introdução à programação para Android
Introdução à programação para AndroidIntrodução à programação para Android
Introdução à programação para Android
 
Android Palestra
Android PalestraAndroid Palestra
Android Palestra
 
Android - Notas de aula
Android - Notas de aulaAndroid - Notas de aula
Android - Notas de aula
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptx
 
Material Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu AppMaterial Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu App
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Apresentando o OpsWorks - Bemobi
Apresentando o OpsWorks - BemobiApresentando o OpsWorks - Bemobi
Apresentando o OpsWorks - Bemobi
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Orientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a PraticaOrientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a Pratica
 

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 Multiplatform
Nelson Glauber Leal
 
Desenvolvimento Moderno de Aplicações Android 2023
Desenvolvimento Moderno de Aplicações Android 2023Desenvolvimento Moderno de Aplicações Android 2023
Desenvolvimento Moderno de Aplicações Android 2023
Nelson Glauber Leal
 
Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023
Nelson 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 2021
Nelson 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 Android
Nelson 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 Android
Nelson 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 & Jetpack
Nelson 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 & Jetpack
Nelson 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 Android
Nelson Glauber Leal
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
Nelson Glauber Leal
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
Nelson 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 Jetpack
Nelson Glauber Leal
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard Library
Nelson 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 & Jetpack
Nelson 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 Kotlin
Nelson Glauber Leal
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using Room
Nelson Glauber Leal
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com Jetpack
Nelson Glauber Leal
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
Nelson 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 Layout
Nelson 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
 
Desenvolvimento Moderno de Aplicações Android 2023
Desenvolvimento Moderno de Aplicações Android 2023Desenvolvimento Moderno de Aplicações Android 2023
Desenvolvimento Moderno de Aplicações Android 2023
 
Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023
 
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
 
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 aplicativos Android

  • 1. Desenvolvimento moderno de aplicativos Android Um guia [quase] completo +Nelson Glauber @nglauber
 www.nglauber.com.br
 youtube.com/nglauber
  • 2.
  • 3. Curso de Android (2009) Introdução ao Android................. 1h Configuração do Ambiente.............. 1h Conceitos Básicos..................... 2h Activity.............................. 4h Intents............................... 2h Interface Gráfica (Layouts e Views)... 8h IntentFilter.......................... 2h BroadcastReceiver..................... 1h Notification.......................... 1h Service............................... 2h AlarmManager.......................... 1h Handler............................... 1h SQLite................................ 4h ContentProvider....................... 2h Mapas e GPS........................... 3h HTTP, Sockets e Web Services.......... 4h SMS................................... 1h Audio e Vídeo......................... 2h ----------------------------------------- TOTAL 42h
  • 4. O que é ser um desenvolvedor Android “moderno"? ATUAL
  • 8. Outras linguagens evoluíram… 
 o Java (para Android) não
  • 9.
  • 10. Porque Kotlin? • Linguagem moderna, concisa, intuitiva e fácil de aprender. • Open Source, mantido pela JetBrains • 100% Inter-operável com Java. Você pode possuir código Java e Kotlin no mesmo projeto (inclusive libs). • Suporte nativo no Android Studio. • Menos verboso. Você escreve menos código. • Null Safety • Possui recursos de linguagens funcionais • Inferência de tipos, lambda, extension functions, high-order functions, …
  • 14. Layouts • FrameLayout • RelativeLayout • LinearLayout • TableLayout • GridLayout • e muitos outros…
  • 15. ConstraintLayout • Implementa o conceito de flat layout. Melhorando a performance. • É um mix dos demais layouts, com mais recursos. • É muito mais fácil criar os layout utilizando visual editor. Mas o XML continua legível. • É uma biblioteca separada do S.O., o que facilita a atualização • A adoção por parte dos desenvolvedores iOS é facilitada.
  • 16.
  • 19. Área de clique errada Aspect Ratio ? Área de clique errada
  • 20. ! 11 componentes a mais!!!
  • 21. ConstraintLayout 1.0 • Posicionamento relativo • Bias • Guidelines • Chains • Ratio support • ConstraintSet
  • 22. ConstraintLayout 1.1.0-beta3 • Barriers • Group • Placeholders • Percent • Circular positioning
  • 26. Activity é uma tela do seu aplicativo… • Ela acessa o banco de dados • Ela acessa a web • Ela valida campos • Ela controla o fluxo da tela
  • 27.
  • 28. Pague as consequências!!! • Código altamente acoplado • Difícil de mante e adicionar novas funcionalidades • Difícil de testar, consequentemente instável • Resumindo: viola todos os princípios do S.O.L.I.D.
  • 29. Initial Stands for Concept S SRP[4] Single responsibility principle a class should have only a single responsibility (i.e. only one potential change in the software's specification should be able to affect the specification of the class) O OCP[5] Open/closed principle “software entities … should be open for extension, but closed for modification.” L LSP[6] Liskov substitution principle “objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.” See also design by contract. I ISP[7] Interface segregation principle “many client-specific interfaces are better than one general-purpose interface.”[8] D DIP[9] Dependency inversion principle one should “depend upon abstractions, [not] concretions.”[8]
  • 31. MVP View IView Presenter Model Interação 
 do usuário Request DadosLógica de UI
  • 32.
  • 33. MVVM View ViewModel Model Observables Interação 
 do usuário Dados Request
  • 34.
  • 35. Data Binding • Facilita a ligação entre View Model e View • Estende os arquivos de layout com micro- expressões • Binders customizados reduzem a repetição de código
  • 36.
  • 37. Book book = (Book)getIntent().getSerializableExtra(EXTRA_LIVRO); ImageView imgCover = (ImageView) findViewById(R.id.image_cover); TextView txtTitle = (TextView) findViewById(R.id.text_title); TextView txtAuthor = (TextView) findViewById(R.id.text_author); TextView txtPages = (TextView) findViewById(R.id.text_pages); TextView txtYear = (TextView) findViewById(R.id.text_year); TextView txtPublisher = (TextView) findViewById(R.id.text_publisher); TextView txtAvailable = (TextView) findViewById(R.id.text_available); TextView txtMediaType = (TextView) findViewById(R.id.text_media_type); RatingBar ratingBook = (RatingBar) findViewById(R.id.rating_book); Glide.with(this).load(book.getCoverUrl()).into(imgCover); txtTitle.setText(book.getTitle()); txtAuthor.setText(book.getAuthor()); txtPages.setText(getString(R.string.text_format_book_pages, book.getPages())); txtYear.setText(getString(R.string.text_format_book_year, book.getYear())); txtPublisher.setText(book.getPublisher().getName()); txtAvailable.setText(book.isAvailable() ? R.string.text_book_available : R.string.text_book_unavailable); txtMediaType.setText(book.getMediaType().toString()); ratingBook.setNumStars(book.getRating());
  • 39. Book book = (Book)getIntent().getSerializableExtra(EXTRA_BOOK); ActivityDetailViewBinding mBinding =
 DataBindingUtil.setContentView(this, R.layout.activity_detail_view); mBinding.setBook(book); ... saveBook(mBinding.book);
  • 40. <layout ...> <data> ... <import type="br.com.nglauber.livrosfirebase.model.MediaType" /> <variable name="book" type="br.com.nglauber.livrosfirebase.model.Book" /> </data> <LinearLayout ...> <ImageView android:src="@{book.coverUrl}" ... /> <EditText android:text="@={book.title}" ... /> <EditText android:text="@={book.author}" ... /> <EditText android:text="@={book.pages}" ... /> <EditText android:text="@={book.year}" ... /> <Spinner ...> <CheckBox android:checked="@={book.available}" ... /> <RadioGroup ...> <RadioButton ... android:checked="@{book.mediaTypeValue == MediaType.EBOOK}" ... /> <RadioButton ... android:checked="@{book.mediaTypeValue == MediaType.PAPER}" ... /> </RadioGroup> <RatingBar android:rating="@={book.rating}" ... /> ... </LinearLayout> </layout>
  • 44. Lifecycle • Lifecycle é um objeto que define um ciclo de vida • LifecycleOwner é uma interface para objetos com um ciclo de vida • A partir da appcompat 26.1, Activity e Fragment implementam LifecycleOwner. • LifecycleObserver é uma interface para observar um LifecycleOwner
  • 45. class MyLifecycleObserver: LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_START) fun start() { Log.d("NGVL", "onStart!!!") } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun stop() { Log.d("NGVL", "onStop!!!") } }
  • 46. class YourActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_your) val observer = MyLifecycleObserver() lifecycle.addObserver(observer) ... } }
  • 48. class ScoreViewModel: ViewModel() { var score = Score() fun updateTeamA() { score.teamA++ } fun updateTeamB() { score.teamB++ } fun reset(){ score.teamA = 0 score.teamB = 0 } }
  • 49. class MainActivity : AppCompatActivity() { private val viewModel: ScoreViewModel by lazy { ViewModelProviders.of(this).get(ScoreViewModel::class.java) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val score = viewModel.score ... } }
  • 50. Cuidado!!! • Não passe referências de Activities ou Fragments para o ViewModel • Se precisar de um Context, crie uma subclass de AndroidViewModel que terá uma instância do contexto da aplicação • Se precisar passar parâmetros para o ViewModel, é preciso criar uma subclasse de ViewModelProvider.NewInstanceFactory • O ViewModel não substitui o onSaveInstanceState!
  • 51. LiveData • LiveData armazena dados observáveis (Observable) e notifica os observadores (Observers) quando esses dados mudam para que a UI seja atualizada. • O LiveData é lifecycle-aware. Ele só notificará a UI se a Activity/Fragment estiver no estado STARTED ou RESUMED.
  • 52. class CharactersViewModel : ViewModel() { val characters = MutableLiveData<List<Character>>() fun loadCharacters() { // Carregar dados da web... characters.value = list } ... }
  • 53. class CharactersActivity : AppCompatActivity() { private val viewModel: CharactersViewModel /*init*/ private val adapter: CharactersAdapter /*init*/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_characters) viewModel.load() viewModel.characters.observe(this, Observer { characters -> adapter.setItems(characters) }) ... } }
  • 54. Room • ORM para Android sobre o SQLite. • Suporta atualização automática da UI com LiveData ou RXJava
  • 55. Room
  • 56. import android.arch.persistence.room.* @Entity data class Event( @PrimaryKey (autoGenerate = true) var id : Long = 0, var name : String = "", var description : String = "" )
  • 57. import android.arch.persistence.room.* @Dao interface EventDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(event: Event): Long @Update fun update(event: Event): Int @Delete fun delete(vararg event: Event): Int @Query("SELECT * FROM Event WHERE description LIKE :descr") fun eventsByDescription(descr: String = "%"): List<Event> @Query("SELECT * FROM Event WHERE id = :id") fun eventById(id: Long): Event }
  • 58. import android.arch.persistence.room.* @Dao interface EventDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(event: Event): Long @Update fun update(event: Event): Int @Delete fun delete(vararg event: Event): Int @Query("SELECT * FROM Event WHERE description LIKE :descr") fun eventsByDescription(descr: String = "%"): LiveData<List<Event>> @Query("SELECT * FROM Event WHERE id = :id") fun eventById(id: Long): LiveData<Event> }
  • 59. import android.arch.persistence.room.Database import android.arch.persistence.room.RoomDatabase @Database(entities = arrayOf(Event::class), version = 1) abstract class MyRoomDatabase : RoomDatabase() { abstract fun eventDao() : EventDao }
  • 60. val db = Room.databaseBuilder(applicationContext, MyRoomDatabase::class.java, "myDb") .build() val dao = db.eventDao() val event = Event(0, "DevFestXP", "DevFest Recife 2017") val id = dao.insert(event) val event2 = dao.eventById(id) Log.d("NGVL", "${event2.id} ${event2.name} - ${event2.description}") val events = dao.eventsByDescription() events.forEach { Log.d("NGVL", "${it.id} ${it.name} - ${it.description}") }
  • 64. 60 FPS 1000ms / 60 frames = 
 16.666ms per frame
  • 65. Assíncrono • Threads and Handlers • AsyncTask • Loaders • IntentService
  • 66. RX Java RxJava é uma biblioteca que permite representar qualquer operação como um fluxo assíncrono de dados criado por qualquer thread, de forma declarativa e consumida por múltiplos objetos em várias threads.
  • 67. Observable.zip( Observable.just("Joey", "Chandler", "Ross", "Rachel", "Monica", "Phoebe"), Observable.just("Ted", "Barney", "Marshall", "Robin", "Lily"), BiFunction<String, String, String> { friend, himym -> "$friend - $himym" }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { t -> print(t) } 12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Joey - Ted 12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Chandler - Barney 12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Ross - Marshall 12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Rachel - Robin 12-06 02:03:50.912 5710-5710/br.com.nglauber.rxdemo D/NGVL: Monica - Lily
  • 68. fun loadMoviesFull(): Observable<Movie> { return service.listMovies() .flatMap { filmResults -> Observable.from(filmResults.results) } .flatMap { film -> Observable.zip( Observable.just(Movie(film.title, film.episodeId, ArrayList())), Observable.from(film.personUrls) .flatMap { personUrl -> Observable.concat( getCache(personUrl), service .loadPerson(Uri.parse(personUrl).lastPathSegment) .doOnNext { person -> peopleCache.put(personUrl, person) } ).first() } .flatMap { person -> Observable.just(Character(person.name, person.gender)) }.toList(), { movie, characters -> movie.characters.addAll(characters) movie } ) } }
  • 71. suspend fun async1(): String { delay(5, TimeUnit.SECONDS) Log.d("NGVL", "async1 -> ${Thread.currentThread().name}") return "Async1" } suspend fun async2(): String { delay(1, TimeUnit.SECONDS) Log.d("NGVL", "async2 -> ${Thread.currentThread().name}") return "Async2" } fun load() { launch(UI) { val s = try { val a = async { async1() } val b = async { async2() } "${a.await()} ${b.await()}" } catch (e: Exception) { "Error!" } button.text = s } }
  • 74.
  • 79. • Você não precisa usar todos esses recursos no mesmo app… • Na verdade, você não precisa usar nenhum! • Mais importante do que saber quando USAR é saber quando NÃO USAR 😉 • Mas é essencial conhecer tópicos, saber seus prós e contras e utilizá-los adequadamente 💡
  • 80. Um desenvolvedor moderno… 1. Faça parte da comunidade!!! 2. Kotlin como linguagem de programação 3. Constraint Layout para criação de UI 4. Uma boa arquitetura na camada de apresentação. Com MVP ou MVVM (por exemplo) 5. Multi-threading 6. Firebase como serviço de cloud 7. Testes para garantir a estabilidade do código