SlideShare ist ein Scribd-Unternehmen logo
1 von 73
Downloaden Sie, um offline zu lesen
Aumentando a produtividade 

com Android Libs
1
+Nelson Glauber
@nglauber
www.nglauber.com.br
2
@nglauber
+NelsonGlauber
www.nglauber.com.br
O que vamos falar aqui…
• Apresentar as principais bibliotecas utilizadas no
desenvolvimento de aplicativos Android.
• Experiência no meu projeto atual que usa
(praticamente) todas!!! :O
• Disseminar esse conhecimento para acelerar o
desenvolvimento de aplicações Android.
3
4
5
Esqueça…
Já passou…
#nostalgia
Support Libraries: appcompat
• Garantia de compatibilidade entre versões do Android.
• Possui os componentes das support libraries v4 e v7
• Diversos componentes importantes: AppCompatActivity, Fragment, Toolbar,
NotificationCompat, ViewPager, DrawerLayout, SlidingPanelLayout, Loader,
LocalBroadcastManager, ShareActionProvider, …
6
dependencies {
...
compile 'com.android.support:appcompat-v7:22.2.0'
}
Support Libraries++
Os componentes CardView, GridLayout, Pallete e RecyclerView
também estão disponíveis em bibliotecas de suporte!
7
dependencies {
...
compile 'com.android.support:cardview-v7:22.2.0'
compile 'com.android.support:gridlayout-v7:22.2.0'
compile 'com.android.support:palette-v7:22.2.0'
compile 'com.android.support:recyclerview-v7:22.2.0'
}
Butter Knife
http://jakewharton.github.io/butterknife/
8
dependencies {
...
compile 'com.jakewharton:butterknife:6.1.0'
}
9
@InjectView(R.id.edtFaca)
EditText edtFaca;
@InjectView(R.id.txtManteiga)
TextView txtManteiga;
// Na Activity
public void onCreate(Bundle state){
...
ButterKnife.inject(this);
}
// No Fragment
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
ButterKnife.inject(this, view);
...
}
10
@OnClick(R.id.submit)
public void submit(View view) {
}
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
}
TextView txtNome = ButterKnife.findById(view, R.id.txtNome);
// Para fragments
public void onDestroyView(){
ButterKnife.reset(this);
}
Data Binding
11
• Mapeia propriedades de um objeto no arquivo de layout.
• Lançada no Google I/O 2015.
• Funciona para Activities, Fragments e Adapters.
• Compatível com versões anteriores.
• Versão BETA!
• Mais detalhes: https://d.android.com/tools/data-binding/guide.html
12
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0-beta1'
classpath "com.android.databinding:dataBinder:1.0-rc0"
}
}
allprojects {
repositories {
jcenter()
}
}
apply plugin: 'com.android.databinding'
13
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="livro"
type="br.com.nglauber.intelsoftwaredaydemo.model.Livro" />
</data>
<RelativeLayout ...>
<TextView android:text="@{livro.titulo}" ... />
<TextView android:text="@{livro.autor}" ... />
<TextView android:text="@{String.valueOf(livro.ano)}" .../>
<TextView android:text="@{String.valueOf(livro.paginas)}" .../>
</RelativeLayout>
</layout>
Acesso a web
http://square.github.io/okhttp/
14
https://code.google.com/p/google-gson/
15
dependencies {
...
compile 'com.squareup.okhttp:okhttp:2.2.0'
compile 'com.google.code.gson:gson:2.3.1'
}
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://seuservidor.com/livros.json")
.build();
Response response = client.newCall(request).execute();
String json = response.body().string();
Gson gson = new Gson();
editora = gson.fromJson(json, Editora.class);
16
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
OkHttpClient httpClient = new OkHttpClient();
Gson gson = new Gson();
String jsonReq = gson.toJson(livro);
RequestBody body = RequestBody.create(JSON, jsonReq);
Request postRequest = new Request.Builder()
.url("http://seuservidor.com/post_livro")
.post(body)
.build();
Response postResponse = httpClient.newCall(postRequest).execute();
String jsonResposta = postResponse.body().string();
Acesso a web services REST++
http://square.github.io/retrofit/
17
dependencies {
...
compile 'com.squareup.retrofit:retrofit:1.9.0'
}
import retrofit.Callback;
import retrofit.http.*;
public interface ProdutoService {
String PATH_PRODUTOS = "/produtos";
@GET(PATH_PRODUTOS)
void listarProdutos(Callback<List<Produto>> callback);
@POST(PATH_PRODUTOS)
void adicionarProduto(@Body Produto produto,
Callback<Produto> callback);
@PUT(PATH_PRODUTOS+"/{id}")
void atualizarProduto(@Path("id") int id,
@Body Produto produto, Callback<Produto> callback);
}
18
19
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(“http://meuservico.com/produtos”)
.build();
ProdutoService produtoService =
restAdapter.create(ProdutoService.class);
produtoService.listarProdutos(
new Callback<List<Produto>>() {
@Override
public void success(List<Produto> produtos,
Response response) {
// É só ler a lista de produtos normalmente...
}
@Override
public void failure(RetrofitError error) {
// Erro ao obter lista de produtos
}
});
20
Produto produto = new Produto();
produto.setDescricao("Computador");
produto.setPreco(12999.9);
produtoService.adicionarProduto(produto,
new Callback<Produto>() {
@Override
public void success(Produto produto, Response response) {
// Produto inserido com sucesso
}
@Override
public void failure(RetrofitError error) {
// Falha ao inserir produto
}
});
Carregamento de imagens
http://square.github.io/picasso/
21
dependencies {
...
compile 'com.squareup.picasso:picasso:2.5.2'
}
22
Picasso.with(context)
.load("http://servidor.com/foto.jpg")
.resize(50, 50)
.centerCrop()
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
Carregamento de imagens++
https://github.com/nostra13/Android-Universal-Image-Loader
23
Design Support Library
• Lançada no Google I/O 2015.
• Traz diversas recomendações do Material Design
prontas para usar.
• FAB, Tabs, Scroll, Navigation View, Snack Bar…
24
dependencies {
...
compile 'com.android.support:design:22.2.0'
}
25
26
<android.support.design.widget.CoordinatorLayout ...>
<android.support.v4.view.ViewPager ...
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.AppBarLayout ...>
<android.support.v7.widget.Toolbar ...
app:layout_scrollFlags="scroll|enterAlways" />
<android.support.design.widget.TabLayout .../>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
27
Persistência de dados
https://github.com/pardom/ActiveAndroid
28
29
apply plugin: 'com.android.application'
android {
...
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots/" }
}
dependencies {
...
compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
}
}
30
<manifest ...>
<application ...
android:name=".App">
...
<meta-data android:name="AA_DB_NAME"
android:value="livros.db"/>

<meta-data android:name="AA_DB_VERSION"
android:value="1"/>
</application>
</manifest> import android.app.Application;
import com.activeandroid.ActiveAndroid;
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
ActiveAndroid.initialize(this);
}
}
31
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
@Table(name = "Livros")
public class Livro extends Model {
@Column(name = "titulo", unique = true,
onUniqueConflict = Column.ConflictAction.REPLACE)
public String titulo;
@Column(name = "autor")
public String autor;
@Column(name = "ano")
public int ano;
@Column(name = "paginas")
public int paginas;
@Column(name = "capa")
public String capa;
}
32
Livro livroFavorito = new Livro(
"Dominando o Android",
"Nelson Glauber",
2015,
792,
"http://goo.gl/capa.png"
);
livroFavorito.save();
List<Livro> mLivros = new Select()
.from(Livro.class)
.where("titulo LIKE ?", "Dom%")
.execute();
Livro livro = new Select()
.from(Livro.class)
.where("ID = ?", 12)
.executeSingle();
Mapeamento Objeto-Relacional
(ORM)
• Compatível com ContentProvider e a classe Cursor.
• Suporte ao onUpgrade() através de arquivos SQL disponibilizados
na pasta assets do projeto.
• Mais informações: 

https://guides.codepath.com/android/ActiveAndroid-Guide
33
Persistência de dados++
34
https://github.com/Raizlabs/DBFlow
http://ormlite.com/sqlite_java_android_orm.shtmlhttps://github.com/pardom/ollie
Troca de Mensagens
http://square.github.io/otto/
35
36
dependencies {
...
compile 'com.squareup:otto:1.3.5'
}
import android.app.Application;
import com.squareup.otto.Bus;
public class App extends Application {
Bus mBus;
@Override
public void onCreate() {
super.onCreate();
...
mBus = new Bus();
}
public Bus getBus(){
return mBus;
}
}
37
Bus mBus = ((App)getApplication()).getBus();


mBus.register(this);
mBus.post(new UmaClasseQualquer("Mensagem"));
mBus.unregister(this);
@Subscribe
public void chegouEvento(UmaClasseQualquer event) {
String texto = event.getMensagem();
Toast.makeText(this, texto, Toast.LENGTH_LONG).show();
}
Troca de Mensagens++
https://github.com/greenrobot/EventBus
38
Material icons
• Aprox. 800 ícones no padrão Material Design
• Gratuitos
• Para todas as densidades de tela
• https://www.google.com/design/icons/
39
Injeção de dependência
http://square.github.io/dagger/
40
dependencies {
...
compile 'com.squareup.dagger:dagger:1.2.2'
provided 'com.squareup.dagger:dagger-compiler:1.2.2'
}
Dagger
• O Dagger constrói instâncias das classes da
aplicação e satisfaz suas dependências.
• Ele trabalha em tempo de compilação e não em
tempo de execução. Tornando-o mais eficiente.
• Diminiu o acoplamento entre a UI e os "serviços".
• Deixa o código mais testável.
41
Declarando dependências
• Utilizamos @Inject para anotar um construtor ou
atributo que o Dagger deve fornecer a dependência.
• Ou podemos fazer uma “lazy injection” usando:

@Inject Lazy<SeuServico> servico;
42
43
public class ListaLivrosFragment extends Fragment {
@Inject
Lazy<LivroHttpService> livroService;
...
public class ListaFavoritosFragment extends Fragment {
@Inject
Bus mBus;
...
Satisfazendo dependências
• Para satisfazer as dependências devem ser criadas
classes chamadas de módulos e anotadas com
@Module.
• Métodos que criarão as instâncias devem estar
anotados com @Provides e por convenção começam
com “provides”.
• O @Provides pode ser usado em conjunto com
@Singleton. É uma boa prática adicionar @Singleton na
classe que será injetada para facilitar o entendimento.
44
45
import dagger.Module;
import dagger.Provides;
@Module(injects = {
ListaFavoritosFragment.class,
ListaLivrosFragment.class
})
public class AppModule {
@Provides
@Singleton
public Bus provideBus() {
return new Bus();
}
@Provides
public LivroHttpService provideLivroHttpService() {
return new LivroHttpService();
}
}
ObjectGraph
• @Inject + @Provides formam uma árvore de
classes interligadas por suas dependências.
46
ObjectGraph objectGraph =
ObjectGraph.create(new AppModule());
objectGraph.inject(this);
Testes Unitários
http://mockito.org/
47
Testes de UI
https://code.google.com/p/android-test-kit/
48
Espresso
49
• Possui basicamente 3 componentes:
• ViewMatchers para achar a view
• ViewActions para realizar ações
• ViewAssertions para checar o estado da view
50
HIERARCHY
withParent(Matcher)
withChild(Matcher)
hasDescendant(Matcher)
isDescendantOfA(Matcher)
hasSibling(Matcher)
isRoot()
UI PROPERTIES
isDisplayed()
isCompletelyDisplayed()
isEnabled()
hasFocus()
isClickable()
isChecked()
isNotChecked()
withEffectiveVisibility(…)
isSelected()
ROOT MATCHERS
isFocusable()
isTouchable()
isDialog()
withDecorView(…)
isPlatformPopup()
COMMON HAMCREST
MATCHERS
allOf(Matchers)
anyOf(Matchers)
is(...)
not(...)
endsWith(String)
startsWith(String)
SEE ALSO
Preference matchers
Cursor matchers
USER PROPERTIES
withId(…)
withText(…)
withTagKey(…)
withTagValue(…)
hasContentDescription(…)
withContentDescription(…)
withHint(…)
withSpinnerText(…)
hasLinks()
hasEllipsizedText()
hasMultilineText()
INPUT
supportsInputMethods(…)
hasImeAction(…)
CLASS
isAssignableFrom(…)
withClassName(…)
Matchers
CLICK/PRESS
click()
doubleClick()
longClick()
pressBack()
pressImeActionButton()
pressKey([int/EspressoKey])
pressMenuKey()
closeSoftKeyboard()
openLink(…)
GESTURES
scrollTo()
swipeLeft()
swipeRight()
swipeUp()
swipeDown()
TEXT
clearText()
typeText(String)
typeTextIntoFocusedView(String)
replaceText(String)
POSITION ASSERTIONS
isLeftOf(Matcher)
isRightOf(Matcher)
isLeftAlignedWith(Matcher)
isRightAlignedWith(Matcher)
isAbove(Matcher)
isBelow(Matcher)
isBottomAlignedWith(Matcher)
isTopAlignedWith(Matcher)
LAYOUT ASSERTIONS
noEllipsizedText(Matcher)
noMultilineButtons()
noOverlaps([Matcher])
View Actions
matches(Matcher)
doesNotExist()
selectedDescendantsMatch(…)
View Assertions
onView(Matcher)
.perform(ViewAction)
.check(ViewAssertion)
CHEAT SHEET
2.0
51
android {
...
defaultConfig {
...
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
dependencies {
...
androidTestCompile 'com.android.support.test:runner:0.3'
androidTestCompile 'com.android.support.test:rules:0.3'
androidTestCompile ‘com.android.support.test.espresso:espresso-core:2.2’
androidTestCompile ‘com.android.support.test.espresso:espresso-intents:2.2'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2'
}
}
52
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.Espresso.pressBack;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.swipeLeft;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class EspressoTest extends ActivityInstrumentationTestCase2<MainActivity> {
public EspressoTest() {
super(MainActivity.class);
}
@Before
public void setUp() throws Exception {
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
}
// seus testes aqui...
}
53
@Test
public void testAdicionarFavorito() {
String bookTitle = "NoSQL Essencial";
onView(withId(R.id.recyclerViewWeb))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withText(bookTitle)), click()));
onView(withId(R.id.txtTitulo)).check(matches(withText(bookTitle)));
onView(withId(R.id.action_favorito)).perform(click());
pressBack();
onView(withId(R.id.pager)).perform(swipeLeft());
onView(withId(R.id.recyclerViewFavoritos))
.check(matches(hasDescendant(withText(bookTitle))));
}
Testes de UI++
https://code.google.com/p/robotium/
54
Execução de Testes
55
http://square.github.io/spoon/
56
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.14.1'
}
}
apply plugin: 'spoon'
// This section is optional
spoon {
// for debug output
debug = true
// To run a single test class
className = 'br.com.nglauber.explorandolibs.TesteMainActivity'
// To run a single method in TestCase
methodName = 'testSimplesClick'
}
57
58
Diversos (Parcelable)
https://github.com/johncarl81/parceler
https://github.com/frankiesardo/auto-parcel
59
dependencies {
...
compile 'org.parceler:parceler-api:0.2.15'
provided 'org.parceler:parceler:0.2.15'
}
import org.parceler.Parcel;
@Parcel
public class Pessoa {
String nome;
int idade;
public Pessoa(){ // obrigatório }
public Pessoa(int i, String n) {
this.idade = i;
this.nome = n;
}
public String getNome() { return nome; }
public int getIdade() { return idade; }
}
60
Parcelable wrapped = Parcels.wrap(new Pessoa(31, "Glauber"));
Pessoa pessoa = Parcels.unwrap(wrapped);
61
Log
https://github.com/JakeWharton/timber
62
https://github.com/JakeWharton/hugo
dependencies {
...
compile 'com.jakewharton.timber:timber:2.5.1'
}
// No onCreate da App...
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
} else {
Timber.plant(new CrashReportingTree());
}
Timber.d("Usando o Timber!");
63
class CrashReportingTree extends Timber.HollowTree {
@Override
public void i(String message, Object... args) {
}
@Override
public void i(Throwable t, String message, Object... args) {
i(message, args);
}
@Override
public void e(String message, Object... args) {
i("ERROR: " + message, args);
// Enviar log para o servidor
}
@Override
public void e(Throwable t, String message, Object... args) {
e(message, args);
// Enviar log para o servidor
}
}
64
Analytics
http://try.crashlytics.com/sdk-android/
65
https://developers.google.com/
analytics/devguides/collection/
android/v4/
Diversos
• Calligraphy - Para fontes customizadas

https://github.com/chrisjenx/Calligraphy
• Joda-Time - Para trabalhar com data e hora

https://github.com/dlew/joda-time-android
• AndroidViewAnimations - Animações pré-definidas

https://github.com/daimajia/AndroidViewAnimations
• seismic - Para shake detection

https://github.com/square/seismic
66
while(true) diversos++;
67
https://android-arsenal.com/
Vou utilizar todas no meu projeto!!!
68
É importante conhecer (e bem) a API padrão para saber
onde você ganhará produtividade usando uma lib
69
Não esqueça da licença!!!
70
E lembre-se! A API padrão nunca vai te abandonar!
71
72
@nglauber
+NelsonGlauber
www.nglauber.com.br
Avalie essa palestra!
http://www.bit.ly/ISD_Pesquisa
Demo
https://github.com/nglauber/intelsoftwareday2015
Dúvidas? Obrigado!!
73

Más contenido relacionado

Was ist angesagt?

Aula 05/06 (Service)
Aula 05/06 (Service)Aula 05/06 (Service)
Aula 05/06 (Service)Ricardo Longa
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidNelson Glauber Leal
 
Big Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoBig Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoRicardo Longa
 
Introdução ao jquery
Introdução ao jqueryIntrodução ao jquery
Introdução ao jqueryYuri Costa
 
jQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajolijQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajoliCaue Fajoli
 
FEMUG MGA #6 - Abandonando o jQuery
FEMUG MGA #6  - Abandonando o jQueryFEMUG MGA #6  - Abandonando o jQuery
FEMUG MGA #6 - Abandonando o jQueryJulio Vedovatto
 
Persistência com JPA e Hibernate
Persistência com JPA e HibernatePersistência com JPA e Hibernate
Persistência com JPA e HibernateFernando Oliveira
 

Was ist angesagt? (20)

Aula 05/06 (Service)
Aula 05/06 (Service)Aula 05/06 (Service)
Aula 05/06 (Service)
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
Java script aula 06 - dom
Java script   aula 06 - domJava script   aula 06 - dom
Java script aula 06 - dom
 
Introdução a jQuery
Introdução a jQueryIntrodução a jQuery
Introdução a jQuery
 
Java script aula 07 - j-query
Java script   aula 07 - j-queryJava script   aula 07 - j-query
Java script aula 07 - j-query
 
jQuery
jQueryjQuery
jQuery
 
Java script aula 09 - JQuery
Java script   aula 09 - JQueryJava script   aula 09 - JQuery
Java script aula 09 - JQuery
 
jQuery Simplificando o JavaScript
jQuery Simplificando o JavaScriptjQuery Simplificando o JavaScript
jQuery Simplificando o JavaScript
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos Android
 
Big Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoBig Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenho
 
Programação Web com jQuery
Programação Web com jQueryProgramação Web com jQuery
Programação Web com jQuery
 
J query basico
J query basicoJ query basico
J query basico
 
Aprenda jQuery 1.3
Aprenda jQuery 1.3Aprenda jQuery 1.3
Aprenda jQuery 1.3
 
Introdução ao jquery
Introdução ao jqueryIntrodução ao jquery
Introdução ao jquery
 
jQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajolijQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê Fajoli
 
FEMUG MGA #6 - Abandonando o jQuery
FEMUG MGA #6  - Abandonando o jQueryFEMUG MGA #6  - Abandonando o jQuery
FEMUG MGA #6 - Abandonando o jQuery
 
Java script aula 10 - angularjs
Java script   aula 10 - angularjsJava script   aula 10 - angularjs
Java script aula 10 - angularjs
 
Persistência com JPA e Hibernate
Persistência com JPA e HibernatePersistência com JPA e Hibernate
Persistência com JPA e Hibernate
 
MondoDB
MondoDBMondoDB
MondoDB
 
Programação Web com jQuery
Programação Web com jQueryProgramação Web com jQuery
Programação Web com jQuery
 

Andere mochten auch

Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no AndroidNelson Glauber Leal
 
Android Wear DevFest Sudeste 2015
Android Wear DevFest Sudeste 2015Android Wear DevFest Sudeste 2015
Android Wear DevFest Sudeste 2015Nelson Glauber Leal
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no AndroidNelson Glauber Leal
 
Como criar interfaces gráficas com android
Como criar interfaces gráficas com androidComo criar interfaces gráficas com android
Como criar interfaces gráficas com androidRicardo Ogliari
 
Android e iOS: Por que eles são diferentes... ou não.
Android e iOS: Por que eles são diferentes... ou não.Android e iOS: Por que eles são diferentes... ou não.
Android e iOS: Por que eles são diferentes... ou não.Nelson Glauber Leal
 
A Journey Through MV Wonderland
A Journey Through MV WonderlandA Journey Through MV Wonderland
A Journey Through MV WonderlandFlorina Muntenescu
 
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...Nelson Glauber Leal
 
Interfaces Inteligentes para Android
Interfaces Inteligentes para AndroidInterfaces Inteligentes para Android
Interfaces Inteligentes para AndroidNelson Glauber Leal
 
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaAli Muzaffar
 
MVVM and RxJava – the perfect mix
MVVM and RxJava – the perfect mixMVVM and RxJava – the perfect mix
MVVM and RxJava – the perfect mixFlorina Muntenescu
 

Andere mochten auch (20)

Android FREETEC
Android FREETECAndroid FREETEC
Android FREETEC
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no Android
 
Android Wear DevFest Sudeste 2015
Android Wear DevFest Sudeste 2015Android Wear DevFest Sudeste 2015
Android Wear DevFest Sudeste 2015
 
Google Play Services Rocks!!!
Google Play Services Rocks!!!Google Play Services Rocks!!!
Google Play Services Rocks!!!
 
Android Wear Androidos 2015
Android Wear Androidos 2015Android Wear Androidos 2015
Android Wear Androidos 2015
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no Android
 
Conhecendo o Android Wear
Conhecendo o Android WearConhecendo o Android Wear
Conhecendo o Android Wear
 
Como criar interfaces gráficas com android
Como criar interfaces gráficas com androidComo criar interfaces gráficas com android
Como criar interfaces gráficas com android
 
Android L e Android Wear
Android L e Android WearAndroid L e Android Wear
Android L e Android Wear
 
Android e iOS: Por que eles são diferentes... ou não.
Android e iOS: Por que eles são diferentes... ou não.Android e iOS: Por que eles são diferentes... ou não.
Android e iOS: Por que eles são diferentes... ou não.
 
A Journey Through MV Wonderland
A Journey Through MV WonderlandA Journey Through MV Wonderland
A Journey Through MV Wonderland
 
Android Lollipop + Android Wear
Android Lollipop + Android WearAndroid Lollipop + Android Wear
Android Lollipop + Android Wear
 
Android Wear
Android WearAndroid Wear
Android Wear
 
Palestra android
Palestra androidPalestra android
Palestra android
 
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...
 
Interfaces Inteligentes para Android
Interfaces Inteligentes para AndroidInterfaces Inteligentes para Android
Interfaces Inteligentes para Android
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Dependency injection on Android
Dependency injection on AndroidDependency injection on Android
Dependency injection on Android
 
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJava
 
MVVM and RxJava – the perfect mix
MVVM and RxJava – the perfect mixMVVM and RxJava – the perfect mix
MVVM and RxJava – the perfect mix
 

Ähnlich wie Aumentando a produtividade com Android Libs

Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidAdriano Rocha
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBiMasters
 
MongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberChristiano Anderson
 
MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014Christiano Anderson
 
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
 
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 EngineCampus Party Brasil
 
Intervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileIntervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileVitor Albuquerque
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixAndré Déo
 
Intodução ao React
Intodução ao ReactIntodução ao React
Intodução ao ReactDev PP
 
Introdução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasIntrodução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasGuilherme
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014Christiano Anderson
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...tdc-globalcode
 

Ähnlich wie Aumentando a produtividade com Android Libs (20)

MongoDB na Campus Party
MongoDB na Campus PartyMongoDB na Campus Party
MongoDB na Campus Party
 
Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento Android
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDB
 
MongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saber
 
MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014
 
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)
 
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
 
Intervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileIntervalo Técnico - QG Mobile
Intervalo Técnico - QG Mobile
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com Zabbix
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Android + firebase
Android + firebaseAndroid + firebase
Android + firebase
 
Grails
GrailsGrails
Grails
 
Intodução ao React
Intodução ao ReactIntodução ao React
Intodução ao React
 
Introdução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasIntrodução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvas
 
J query
J queryJ query
J query
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014
 
Android Aula 5
Android Aula 5Android Aula 5
Android Aula 5
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
 

Mehr von 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 MultiplatformNelson 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 2023Nelson 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 2023Nelson 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 2021Nelson 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 AndroidNelson 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 AndroidNelson 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 & JetpackNelson 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 & JetpackNelson 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 AndroidNelson Glauber Leal
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackNelson Glauber Leal
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackNelson 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 JetpackNelson Glauber Leal
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard LibraryNelson 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 & JetpackNelson 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 KotlinNelson Glauber Leal
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using RoomNelson Glauber Leal
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackNelson Glauber Leal
 
Desenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidDesenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidNelson 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 LayoutNelson Glauber Leal
 

Mehr von 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
 
Desenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidDesenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos Android
 
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
 

Aumentando a produtividade com Android Libs