SlideShare a Scribd company logo
1 of 52
Desvendando as ferramentas
     e serviços para o
  desenvolvedor Android
        João Bosco Monteiro
Quem sou


Sócio e desenvolvedor na

Desenvolvendo software há 10 anos

Ex-JavaEE
Autor do livro
Lado B
Por que utilizar frameworks?
Onde utilizar

   Interface Gráfica Utilitários

     Injeção de Dependências

   Persistência   Build   Testes

       Integração Contínua
Utilitários, UI e IoC
Ajax Callback      Manipulação de Imagens

  XML Parsing         Autenticação Twitter e
                            Facebook
Localização (beta)
public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

      final TextView textView =
              (TextView) findViewById(R.id.text);
      textView.setText("Clique no botão");
      Button button =
               (Button) findViewById(R.id.button);
      button.setText("clique aqui");
      button.setOnClickListener(
              new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
                       textView.setText("QCon 2012");
                     }
              });
}
public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

      aq = new AQuery(this);
      aq.id(R.id.text).text("Clique no botão");
      aq.id(R.id.button).text("clique aqui")
}

public void onClick(View v) {
       aq.id(R.id.text).text("QCon 2012");
}
public void async() {
       String url = "http://search.twitter.com/…";

       aq.ajax(url, JSONObject.class,
               this, "callback");
}

public void callback(String url,
                              JSONObject json,
                           AjaxStatus status) {
       if (json != null) {
               // successful ajax call
       }
}
String imageUrl =
         "http://qcon.com.br/images/infoq.gif";

//carregamento assíncrono, com cache
aq.id(R.id.image).image(imageUrl);

//carregamento assíncrono, com cache e fallback
aq.id(R.id.image).image(imageUrl, true, true, 0,
                      R.drawable.default_image);

//limita a largura da imagem em 200px
aq.id(R.id.image).image(imageUrl, true, true,
                              200, 0);
RoboGuice
Injeção de dependências
             Powered by Google Guice

É possível injectar views, recursos,
serviços do sistema...
class AndroidWay extends Activity {
   TextView name;
   ImageView thumb;
   LocationManager loc;
   Drawable icon;
   String myName;

   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     name = (TextView) findViewById(R.id.name);
     thumb = (ImageView)
findViewById(R.id.thumbnail);
     loc = (LocationManager)
       getSystemService(Activity.LOCATION_SERVICE);
     icon = getResources()
                        .getDrawable(R.drawable.icon);
     myName = getString(R.string.app_name);
     name.setText( "Hello, " + myName );
   }
}
class RoboWay extends RoboActivity {
   @InjectView(R.id.name) TextView name;
   @InjectView(R.id.thumbnail) ImageView thumbnail;
   @InjectResource(R.drawable.icon) Drawable icon;
   @InjectResource(R.string.app_name) String myName;
   @Inject LocationManager loc;

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      name.setText( "Hello, " + myName );
    }
}
Android Annotations
Annotation Processing Tool para gerar boilerplate
code

Injeção de dependência em tempo de compilação

Threading e Event Handlig

REST Client (Spring Android Wrapper)
@EActivity(R.layout.my_activity)
public class MyActivity extends Activity {

  @ViewById
  EditText myEditText;

  @StringRes(R.string.hello)
  String helloFormat;

  @ColorRes
  int androidColor;

  @BooleanRes
  boolean someBoolean;

  @SystemService
  NotificationManager notificationManager;
@Rest("http://company.com/ajax/services")
public interface MyRestClient {
  @Get("/events")
  EventList getEvents();
}


@EActivity
public class MyActivity extends Activity {
       @RestService
       MyRestClient myRestClient;

       @AfterViews
       void afterViews() {
              myRestClient.getEvents();
       }
}
@Click
void anotherButton() {}

@Background
void someBackgroundWork(String param) {}

@UiThread
void doInUiThread(String param) {}

@Transactional
void doSomeDbWork(SQLiteDatabase db) {}
Spring Android
Rest Client

OAuth
public <T> T getForObject(URI url,
                          Class<T> responseType);

public <T> T postForObject(URI url,
                        Object request,
                        Class<T> rType);

public void put(String url,
                      Object request,
                      Object... variables);

public void delete(String url,
                        Object... urlVariables);
final String url =
"https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q
={query}";

RestTemplate restTemplate = new RestTemplate();

GoogleSearch response =
       restTemplate.getForObject(url,
                        GoogleSearch.class,
                        "Google Android");
ORM Lite
ORM já existente

Configuração via anotações

Generic DAO e ActiveRecord

QueryBuilders
Generic DAO
queryForAll()
queryForId(ID id)
queryForFieldValues(Map<String, Object> fieldValues)
queryRaw(String query)

create(T object)
createOrUpdate(T object)
update(T object)
delete(T object)

countOf()
projetoDao = getHelper().getProjetoDao();

QueryBuilder<Projeto, Integer> queryBuilder;
queryBuilder = projetoDao.queryBuilder();

List<Projeto> projetos = queryBuilder.where()
                        .eq("nome", "QCon")
                        .and()
            .eq("cid", 1)
            .query();
GreenDroid

Widgets e Layouts

Estilos e temas

Custom ActionBar
ActionBarSherlock

ActionBar para todos!
Testes
Robolectric
Roda os testes diretamente na JVM

Mocking não é necessário

Shadow Objects
@RunWith(RobolectricTestRunner.class)
public class HomeActivityTest {
  private HomeActivity activity;
  private Button pressMeButton;

    @Before
    public void setUp() throws Exception {
      activity = new HomeActivity();
      activity.onCreate(null);
      pressMeButton = (Button)
                   activity.findViewById(R.id.press_me_button);
    }

    @Test
    public void shouldHaveAButtonThatSaysPressMe()
                                                 throws Exception {
      assertThat((String) pressMeButton.getText(),
                                        equalTo("Tests Rock!"));
    }
}
Tests run: 86, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.875s
[INFO] Finished at: Sun Jul 29 15:54:58 GMT-04:00 2012
[INFO] Final Memory: 14M/81M
[INFO] ------------------------------------------------------------------------
Robotium
Testes caixa-preta

Legibilidade dos casos de testes é melhor do
que os de instrumentação

Integração com Maven
Maven

mvn archetype:generate 
 -DarchetypeArtifactId=android-with-test
 -DarchetypeGroupId=de.akquinet.android.archetypes
 -DarchetypeVersion=1.0.6
 -DgroupId=com.foo.bar
 -DartifactId=my-android-project
 -Dpackage=com.foo.bar.android
Serviços




PushLink
Discussões
Obrigado!

   João Bosco Monteiro
joaobmonteiro@gmail.com
     @joaobmonteiro

More Related Content

What's hot

Treze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidTreze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidRicardo Longa
 
Android DevConference - Data Binding: Código limpo, manutenção garantida
Android DevConference - Data Binding: Código limpo, manutenção garantidaAndroid DevConference - Data Binding: Código limpo, manutenção garantida
Android DevConference - Data Binding: Código limpo, manutenção garantidaiMasters
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureVitor Ciaramella
 
JavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamentoJavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamentoRicardo Valeriano
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Renato Haddad
 
Introdução ao jquery
Introdução ao jqueryIntrodução ao jquery
Introdução ao jqueryYuri Costa
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsNelson Glauber Leal
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasRodrigo Branas
 
JavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com BolachaJavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com BolachaRafael Afonso
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
PHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPPHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPBruno Neves Menezes
 

What's hot (20)

Treze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidTreze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento android
 
Android DevConference - Data Binding: Código limpo, manutenção garantida
Android DevConference - Data Binding: Código limpo, manutenção garantidaAndroid DevConference - Data Binding: Código limpo, manutenção garantida
Android DevConference - Data Binding: Código limpo, manutenção garantida
 
Introdução a jQuery
Introdução a jQueryIntrodução a jQuery
Introdução a jQuery
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
 
JavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamentoJavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamento
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
Introdução ao jquery
Introdução ao jqueryIntrodução ao jquery
Introdução ao jquery
 
Aprenda jQuery 1.3
Aprenda jQuery 1.3Aprenda jQuery 1.3
Aprenda jQuery 1.3
 
Introdução ao JQuery e AJAX
Introdução ao JQuery e AJAXIntrodução ao JQuery e AJAX
Introdução ao JQuery e AJAX
 
Aula android 02.pdf
Aula android 02.pdfAula android 02.pdf
Aula android 02.pdf
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android Libs
 
jQuery na Prática!
jQuery na Prática!jQuery na Prática!
jQuery na Prática!
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
 
JavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com BolachaJavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com Bolacha
 
Sql proficiente
Sql proficienteSql proficiente
Sql proficiente
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
PHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPPHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHP
 

Viewers also liked

Desenvolvimento de aplicativos para Android
Desenvolvimento de aplicativos para Android Desenvolvimento de aplicativos para Android
Desenvolvimento de aplicativos para Android joaobmonteiro
 
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...joaobmonteiro
 
Escolhendo uma nuvem para sua webapp
Escolhendo uma nuvem para sua webappEscolhendo uma nuvem para sua webapp
Escolhendo uma nuvem para sua webappjoaobmonteiro
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 

Viewers also liked (6)

Desenvolvimento de aplicativos para Android
Desenvolvimento de aplicativos para Android Desenvolvimento de aplicativos para Android
Desenvolvimento de aplicativos para Android
 
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
 
Escolhendo uma nuvem para sua webapp
Escolhendo uma nuvem para sua webappEscolhendo uma nuvem para sua webapp
Escolhendo uma nuvem para sua webapp
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 

Similar to Ferramentas e serviços para desenvolvedor Android

Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
jQuery - Visão Geral
jQuery - Visão GeraljQuery - Visão Geral
jQuery - Visão GeralKaio Valente
 
Conexao Java - Sua primeira app Android
Conexao Java - Sua primeira app AndroidConexao Java - Sua primeira app Android
Conexao Java - Sua primeira app AndroidSuelen Carvalho
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Javaelliando dias
 
Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidAdriano Rocha
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
O fantástico mundo de Android
O fantástico mundo de AndroidO fantástico mundo de Android
O fantástico mundo de AndroidSuelen Carvalho
 
One Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptOne Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptLoiane Groner
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Teste de Integracao com DbUnit e JStryker
Teste de Integracao com DbUnit e JStrykerTeste de Integracao com DbUnit e JStryker
Teste de Integracao com DbUnit e JStrykerWashington Botelho
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 

Similar to Ferramentas e serviços para desenvolvedor Android (20)

Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em ação
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
jQuery - Visão Geral
jQuery - Visão GeraljQuery - Visão Geral
jQuery - Visão Geral
 
Android Para Iniciantes
Android Para IniciantesAndroid Para Iniciantes
Android Para Iniciantes
 
Conexao Java - Sua primeira app Android
Conexao Java - Sua primeira app AndroidConexao Java - Sua primeira app Android
Conexao Java - Sua primeira app Android
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Java
 
Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento Android
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Scala no Android
Scala no AndroidScala no Android
Scala no Android
 
O fantástico mundo de Android
O fantástico mundo de AndroidO fantástico mundo de Android
O fantástico mundo de Android
 
One Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptOne Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScript
 
API Apontador
API ApontadorAPI Apontador
API Apontador
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Teste de Integracao com DbUnit e JStryker
Teste de Integracao com DbUnit e JStrykerTeste de Integracao com DbUnit e JStryker
Teste de Integracao com DbUnit e JStryker
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
React js
React js React js
React js
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 

Ferramentas e serviços para desenvolvedor Android

  • 1. Desvendando as ferramentas e serviços para o desenvolvedor Android João Bosco Monteiro
  • 2. Quem sou Sócio e desenvolvedor na Desenvolvendo software há 10 anos Ex-JavaEE
  • 5. Por que utilizar frameworks?
  • 6. Onde utilizar Interface Gráfica Utilitários Injeção de Dependências Persistência Build Testes Integração Contínua
  • 8. Ajax Callback Manipulação de Imagens XML Parsing Autenticação Twitter e Facebook Localização (beta)
  • 9.
  • 10. public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final TextView textView = (TextView) findViewById(R.id.text); textView.setText("Clique no botão"); Button button = (Button) findViewById(R.id.button); button.setText("clique aqui"); button.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { textView.setText("QCon 2012"); } }); }
  • 11. public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); aq = new AQuery(this); aq.id(R.id.text).text("Clique no botão"); aq.id(R.id.button).text("clique aqui") } public void onClick(View v) { aq.id(R.id.text).text("QCon 2012"); }
  • 12. public void async() { String url = "http://search.twitter.com/…"; aq.ajax(url, JSONObject.class, this, "callback"); } public void callback(String url, JSONObject json, AjaxStatus status) { if (json != null) { // successful ajax call } }
  • 13. String imageUrl = "http://qcon.com.br/images/infoq.gif"; //carregamento assíncrono, com cache aq.id(R.id.image).image(imageUrl); //carregamento assíncrono, com cache e fallback aq.id(R.id.image).image(imageUrl, true, true, 0, R.drawable.default_image); //limita a largura da imagem em 200px aq.id(R.id.image).image(imageUrl, true, true, 200, 0);
  • 14. RoboGuice Injeção de dependências Powered by Google Guice É possível injectar views, recursos, serviços do sistema...
  • 15. class AndroidWay extends Activity { TextView name; ImageView thumb; LocationManager loc; Drawable icon; String myName; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name = (TextView) findViewById(R.id.name); thumb = (ImageView) findViewById(R.id.thumbnail); loc = (LocationManager) getSystemService(Activity.LOCATION_SERVICE); icon = getResources() .getDrawable(R.drawable.icon); myName = getString(R.string.app_name); name.setText( "Hello, " + myName ); } }
  • 16. class RoboWay extends RoboActivity { @InjectView(R.id.name) TextView name; @InjectView(R.id.thumbnail) ImageView thumbnail; @InjectResource(R.drawable.icon) Drawable icon; @InjectResource(R.string.app_name) String myName; @Inject LocationManager loc; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name.setText( "Hello, " + myName ); } }
  • 17. Android Annotations Annotation Processing Tool para gerar boilerplate code Injeção de dependência em tempo de compilação Threading e Event Handlig REST Client (Spring Android Wrapper)
  • 18. @EActivity(R.layout.my_activity) public class MyActivity extends Activity { @ViewById EditText myEditText; @StringRes(R.string.hello) String helloFormat; @ColorRes int androidColor; @BooleanRes boolean someBoolean; @SystemService NotificationManager notificationManager;
  • 19. @Rest("http://company.com/ajax/services") public interface MyRestClient { @Get("/events") EventList getEvents(); } @EActivity public class MyActivity extends Activity { @RestService MyRestClient myRestClient; @AfterViews void afterViews() { myRestClient.getEvents(); } }
  • 20. @Click void anotherButton() {} @Background void someBackgroundWork(String param) {} @UiThread void doInUiThread(String param) {} @Transactional void doSomeDbWork(SQLiteDatabase db) {}
  • 22. public <T> T getForObject(URI url, Class<T> responseType); public <T> T postForObject(URI url, Object request, Class<T> rType); public void put(String url, Object request, Object... variables); public void delete(String url, Object... urlVariables);
  • 23. final String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q ={query}"; RestTemplate restTemplate = new RestTemplate(); GoogleSearch response = restTemplate.getForObject(url, GoogleSearch.class, "Google Android");
  • 24. ORM Lite ORM já existente Configuração via anotações Generic DAO e ActiveRecord QueryBuilders
  • 25.
  • 26. Generic DAO queryForAll() queryForId(ID id) queryForFieldValues(Map<String, Object> fieldValues) queryRaw(String query) create(T object) createOrUpdate(T object) update(T object) delete(T object) countOf()
  • 27. projetoDao = getHelper().getProjetoDao(); QueryBuilder<Projeto, Integer> queryBuilder; queryBuilder = projetoDao.queryBuilder(); List<Projeto> projetos = queryBuilder.where() .eq("nome", "QCon") .and() .eq("cid", 1) .query();
  • 28. GreenDroid Widgets e Layouts Estilos e temas Custom ActionBar
  • 29.
  • 30.
  • 32.
  • 33.
  • 34.
  • 36. Robolectric Roda os testes diretamente na JVM Mocking não é necessário Shadow Objects
  • 37. @RunWith(RobolectricTestRunner.class) public class HomeActivityTest { private HomeActivity activity; private Button pressMeButton; @Before public void setUp() throws Exception { activity = new HomeActivity(); activity.onCreate(null); pressMeButton = (Button) activity.findViewById(R.id.press_me_button); } @Test public void shouldHaveAButtonThatSaysPressMe() throws Exception { assertThat((String) pressMeButton.getText(), equalTo("Tests Rock!")); } }
  • 38. Tests run: 86, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 15.875s [INFO] Finished at: Sun Jul 29 15:54:58 GMT-04:00 2012 [INFO] Final Memory: 14M/81M [INFO] ------------------------------------------------------------------------
  • 39. Robotium Testes caixa-preta Legibilidade dos casos de testes é melhor do que os de instrumentação Integração com Maven
  • 40.
  • 41. Maven mvn archetype:generate -DarchetypeArtifactId=android-with-test -DarchetypeGroupId=de.akquinet.android.archetypes -DarchetypeVersion=1.0.6 -DgroupId=com.foo.bar -DartifactId=my-android-project -Dpackage=com.foo.bar.android
  • 42.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 52. Obrigado! João Bosco Monteiro joaobmonteiro@gmail.com @joaobmonteiro