SlideShare ist ein Scribd-Unternehmen logo
1 von 80
Downloaden Sie, um offline zu lesen
DESENVOLVENDO PARA ANDROID
                COM FERRAMENTAS LIVRES




                                                       MARLON SILVA CARVALHO
domingo, 29 de abril de 12
marlon            .silvacarvalho.net




                             twitter.com/   marlonscarvalho

                             marlon.carvalho                        @gmail.com




domingo, 29 de abril de 12
domingo, 29 de abril de 12
domingo, 29 de abril de 12
domingo, 29 de abril de 12
o inevitável para os desenvolvendores...
                  ...era surgir uma grande quantidade de ferramentas opensource




domingo, 29 de abril de 12
domingo, 29 de abril de 12
vamos	 começar	 do	 começo...




                             ...ao	 criar	 seu	 projeto.

domingo, 29 de abril de 12
dependências	 para	 bibliotecas




domingo, 29 de abril de 12
lib-dep-1.1       lib-dep-1.2




                             lib-xml   lib-json



domingo, 29 de abril de 12
domingo, 29 de abril de 12
ou	 você	 pode	 usar	 o:

                             e	 gerenciar	 seu	 projeto	 por	 ele!




domingo, 29 de abril de 12
por	 que	 usar?
                             o	 processo	 de	 build	 é	 complexo?	 
                                   requer	 muitas	 regras?




domingo, 29 de abril de 12
compilar



        testar
                             testes	 unitários,	 com	 BDD,	 com	 seilaoquê!	 

   empacotar
                             empacotar	 com	 certificados	 diferentes

      deploy

                             gerar	 um	 tags	 no	 repositório




domingo, 29 de abril de 12
por	 que	 usar?
                             sua	 aplicação	 possui	 muitas	 dependências	 
                                      para	 bibliotecas	 externas?




domingo, 29 de abril de 12
por	 que	 usar?
                             quer	 automatizar	 tarefas	 repetitivas	 no	 seu	 
                                         processo	 de	 build?




domingo, 29 de abril de 12
por	 que	 usar?
                             você	 usa	 um	 servidor	 de	 integração	 
                                          contínua?




domingo, 29 de abril de 12
por	 que	 usar?
                             sua	 aplicação	 está	 dividida	 em	 vários	 
                                           módulos?




domingo, 29 de abril de 12
então,

                                 foi	 feito	 para	 você!




domingo, 29 de abril de 12
http://roboguice.googlecode.com/




                                  dependency	 injection
                             events,	 logs,	 factories,	 fragments,	 services,	 resources




domingo, 29 de abril de 12
a	 simples	 equação




                                 A
                             -   O   +           =
                                 P


domingo, 29 de abril de 12
“Dependency                 injection is a
            software design pattern that allows a choice of
            component to be made at run-time rather than compile
            time.”

domingo, 29 de abril de 12
com	 DI	 eu	 não	 faço	 isso:




                             MinhaInterface	 objeto	 =	 

                                      new	 
                 UmaClasseQueImplementaInterface();

domingo, 29 de abril de 12
com	 DI	 eu	 faço	 apenas	 isso:

                                     @Inject
                                     UmaInterface	 obj;




domingo, 29 de abril de 12
código	 repetitivo
            o	 modo	 “android	 nativo”	 de	 programar:

        class AndroidWay extends Activity {
            TextView name;
            ImageView thumbnail;
            LocationManager loc;
            Drawable icon;
            String myName;

                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.main);
                    name      = (TextView) findViewById(R.id.name);
                    thumbnail = (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 );
                }
        }


domingo, 29 de abril de 12
código	 não-repetitivo
                  o	 modo	 “RoboGuice”	 de	 programar:


   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 );
             }
   }


domingo, 29 de abril de 12
@Inject




domingo, 29 de abril de 12
eventos	 pra	 cá,	 eventos	 pra	 lá
                  o	 modo	 “RoboGuice”	 de	 programar:


          public class MyActivity extends RoboActivity {
              @Inject protected Listeners listeners;
          }

          class Listeners {
             
              public void doOnResume(@Observes OnResumeEvent e) {
              }
             
              public void doOnCreate(@Observes OnCreateEvent e) {
              }
             
          }


domingo, 29 de abril de 12
quem	 usa	 isso?
                             será	 que	 presta	 mesmo?




domingo, 29 de abril de 12
por	 que	 usar?
                             eliminar	 código	 repetitivo




domingo, 29 de abril de 12
por	 que	 usar?
                             focar	 no	 negócio	 da	 
                                   aplicação




domingo, 29 de abril de 12
por	 que	 usar?
                             ter	 os	 benefícios	 da	 injeção	 
                                   de	 dependência	 no	 
                               desenvolvimento	 mobile




domingo, 29 de abril de 12
por	 que	 usar?
                               o	 maldito	 context	 não	 
                               precisa	 mais	 caminhar	 
                             entre	 as	 diversas	 camadas	 
                                  da	 sua	 aplicação


domingo, 29 de abril de 12
enfim:
                             código	 mais	 limpo,	 claro	 e	 
                             focado	 no	 negócio	 da	 sua	 
                                      aplicação




domingo, 29 de abril de 12
http://roboletric.org/




                             testes	 unitários	 em	 qualquer	 jvm




domingo, 29 de abril de 12
o	 maldito	 emulador!

domingo, 29 de abril de 12
por	 que	 usar?
                             testes	 rodando	 na	 própria	 
                                         IDE




domingo, 29 de abril de 12
por	 que	 usar?
                                testes	 rodando	 em	 
                             servidores	 de	 integração




domingo, 29 de abril de 12
@RunWith
  (RobolectricTestRunner.class)
public class MyActivityTest {
    private Activity activity;
    private Button pressMeButton;
    private TextView results;

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

        @Test
        public void shouldUpdateResultsWhenButtonIsClicked() throws Exception {

                 pressMeButton.performClick();
                 String resultsText = results.getText().toString();
                 assertThat(resultsText, equalTo("Testing Android Rocks!"));
        }
}

domingo, 29 de abril de 12
mas...	 um	 rápido	 parênteses...	 (




domingo, 29 de abril de 12
por	 que	 você	 faz	 testes	 unitários	 em	 
                                  android?




domingo, 29 de abril de 12
regras	 de	 negócio	 em	 serviços




domingo, 29 de abril de 12
dados	 nas	 nuvens




domingo, 29 de abril de 12
)




domingo, 29 de abril de 12
e	 a	 maldita	 persistência	 de	 dados?




domingo, 29 de abril de 12
faça	 um	 extends	 de	 SQLiteOpenHelper
                              o	 modo	 android	 nativo	 de	 programar:



   class MeuHelper extends SQLiteOpenHelper {

         public void onCreate(SQLiteDatabase db) { }

     public void onUpgrade(SQLiteDatabase db,
   int old, int newV) { }

   }

domingo, 29 de abril de 12
MeuHelper helper = new
          MeuHelper();
          SQLiteDatabase database =
          helper.getWritableDatabase();


              Cursor cursor =
              database.rawQuery("select *
              from tabela");


domingo, 29 de abril de 12
MeuHelper helper = new MeuHelper();
       SQLiteDatabase database =
       helper.getWritableDatabase();


                             ContentValues values = new
                             ContentValues();
                             values.put(“coluna1”, comment);
                             database.insert(“tabela”, null,
                             values);


domingo, 29 de abril de 12
MeuHelper helper = new MeuHelper();
          SQLiteDatabase database =
          helper.getWritableDatabase();

                             database.delete(“tabela”,
                             “_id” + " = " + id, null);




domingo, 29 de abril de 12
https://github.com/marloncarvalho/aliendroid-activerecord




                                    aliendroid-activerecord	 para	 diminuir	 a	 dor	 da	 
                                                persistência	 de	 dados




domingo, 29 de abril de 12
defina	 seu	 model




           public class Item extends Model {
             public String atributo1;
             public String atributo2;
             public String atributo3;
           }


domingo, 29 de abril de 12
Item item =
                                     Model.load(Item.class, 1L);


                             item.insert();
      List<Item> itens = Model.findAll(Item.class);
                        item.delete();
                                   item.update();
                                              Model.where(...);


domingo, 29 de abril de 12
tabela	 criada	 
                             automaticamente




domingo, 29 de abril de 12
colunas	 mapeadas	 
                              para	 os	 atributos




domingo, 29 de abril de 12
por	 que	 usar?
                             minimiza	 a	 necessidade	 de	 códigos	 
                                             SQL




domingo, 29 de abril de 12
por	 que	 usar?
                             automatiza	 tarefas	 repetitivas




domingo, 29 de abril de 12
integração	 contínua
                             será	 que	 você	 precisa	 de	 um?




domingo, 29 de abril de 12
por	 que	 usar?
                         sua	 equipe	 é	 de	 média	 a	 grande?




domingo, 29 de abril de 12
por	 que	 usar?
                  quer	 garantir	 que	 a	 cada	 commit	 seu	 
                     projeto	 continua	 funcionando?




domingo, 29 de abril de 12
por	 que	 usar?
                 você	 precisa	 de	 resposta	 instantânea	 
                       para	 erros	 de	 integração?




domingo, 29 de abril de 12
use	 o	 jenkins	 com	 seu	 projeto	 android
               roda	 tanto	 com	 o	 roboletric	 como	 com	 o	 emulador




domingo, 29 de abril de 12
domingo, 29 de abril de 12
tem	 como	 usar	 BDD	 no	 android?
                           behavior	 driven	 development




domingo, 29 de abril de 12
https://github.com/calabash/calabash-android




                               calabash-android




domingo, 29 de abril de 12
calabash-android


              Feature: Login feature
               Scenario: As a valid user I can log into my app
                Given I am a valid user
                And I enter my username
                And I enter my password
                And I press "Login"
                Then I see "Welcome to coolest app ever"



domingo, 29 de abril de 12
calabash-android




domingo, 29 de abril de 12
por	 que	 usar?
                             ter	 os	 benefícios	 do	 BDD	 em	 seu	 projeto	 
                                                android




domingo, 29 de abril de 12
e	 quando	 dá	 pau	 na	 sua	 app?
                    como	 saber	 quando	 isso	 aconteceu




domingo, 29 de abril de 12
Google	 Play
                         eles	 lhe	 dão	 uma	 forcinha,	 mas...




                             ...e	 se	 você	 quiser	 mais	 informações?
                                   e	 um	 relatório	 personalizado?
domingo, 29 de abril de 12
http://acra.googlecode.com/




                   Application	 Crash	 Report	 for	 Android




domingo, 29 de abril de 12
ACRA is a library enabling Android Application to automatically post their

                      crash reports to a   Google Docs form                                  . It
                      is targetted to android applications developers to help them get data from
                               their applications when they crash or behave erroneously.




domingo, 29 de abril de 12
import org.acra.*;
       import org.acra.annotation.*;

       @ReportsCrashes(formKey = "dGVacG0ydVHnaNHjRjVTUTEtb3FPWGc6MQ")
       public class MyApplication extends Application {

                 @Override
                 public void onCreate() {
                     ACRA.init(this);
                     super.onCreate();
                 }

       }


domingo, 29 de abril de 12
domingo, 29 de abril de 12
domingo, 29 de abril de 12
por	 que	 usar?
                             você	 não	 está	 satisfeito	 com	 as	 opções	 do	 
                                               Google	 Play




domingo, 29 de abril de 12
por	 que	 usar?
                             você	 quer	 personalizar	 seu	 
                                       relatório




domingo, 29 de abril de 12
por	 que	 usar?
                             você	 quer	 dar	 um	 feedback	 
                                mais	 elegante	 para	 o	 
                                        usuário




domingo, 29 de abril de 12
por	 que	 usar?
                             você	 quer	 mais	 detalhes	 
                                   sobre	 o	 erro




domingo, 29 de abril de 12
é	 só	 isso!




domingo, 29 de abril de 12
androidbahia.info




domingo, 29 de abril de 12

Weitere ähnliche Inhalte

Ähnlich wie Flisol 2012

Cultura DevOps - Integração entre infra e devel
Cultura DevOps - Integração entre infra e develCultura DevOps - Integração entre infra e devel
Cultura DevOps - Integração entre infra e develJose Augusto Carvalho
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POODaniel Brandão
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisRogerio Fontes
 
Cultura DevOps e integração entre infra e devel
Cultura DevOps e integração entre infra e develCultura DevOps e integração entre infra e devel
Cultura DevOps e integração entre infra e develJose Augusto Carvalho
 
TDC 2015 Floripa - Testes de Unidade com Robolectric
TDC 2015 Floripa - Testes de Unidade com RobolectricTDC 2015 Floripa - Testes de Unidade com Robolectric
TDC 2015 Floripa - Testes de Unidade com RobolectricStefan Teixeira
 
TDC 2015 - Testes de Unidade com Robolectric
TDC 2015 - Testes de Unidade com Robolectric TDC 2015 - Testes de Unidade com Robolectric
TDC 2015 - Testes de Unidade com Robolectric Lucas Albuquerque
 
Overview sobre o CMS Drupal
Overview sobre o CMS DrupalOverview sobre o CMS Drupal
Overview sobre o CMS DrupalRafael Cichini
 
Palestra Faculdade Lourenço Filho
Palestra Faculdade Lourenço FilhoPalestra Faculdade Lourenço Filho
Palestra Faculdade Lourenço Filhorafarubert
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDaniel Carvalhinho
 
Como eu aprendi que testar software é importante?
Como eu aprendi que testar software é importante?Como eu aprendi que testar software é importante?
Como eu aprendi que testar software é importante?Maurício Aniche
 

Ähnlich wie Flisol 2012 (20)

Apresentação
ApresentaçãoApresentação
Apresentação
 
O que é DevOps afinal?
O que é DevOps afinal?O que é DevOps afinal?
O que é DevOps afinal?
 
Cultura DevOps - Integração entre infra e devel
Cultura DevOps - Integração entre infra e develCultura DevOps - Integração entre infra e devel
Cultura DevOps - Integração entre infra e devel
 
Strategy pattern
Strategy patternStrategy pattern
Strategy pattern
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everis
 
Conhecendo vuejs
Conhecendo vuejsConhecendo vuejs
Conhecendo vuejs
 
Modelagem Ágil
Modelagem ÁgilModelagem Ágil
Modelagem Ágil
 
Cultura DevOps e integração entre infra e devel
Cultura DevOps e integração entre infra e develCultura DevOps e integração entre infra e devel
Cultura DevOps e integração entre infra e devel
 
TDC 2015 Floripa - Testes de Unidade com Robolectric
TDC 2015 Floripa - Testes de Unidade com RobolectricTDC 2015 Floripa - Testes de Unidade com Robolectric
TDC 2015 Floripa - Testes de Unidade com Robolectric
 
TDC 2015 - Testes de Unidade com Robolectric
TDC 2015 - Testes de Unidade com Robolectric TDC 2015 - Testes de Unidade com Robolectric
TDC 2015 - Testes de Unidade com Robolectric
 
Overview sobre o CMS Drupal
Overview sobre o CMS DrupalOverview sobre o CMS Drupal
Overview sobre o CMS Drupal
 
Debugging node
Debugging nodeDebugging node
Debugging node
 
Gt 10 fcsi
Gt 10   fcsiGt 10   fcsi
Gt 10 fcsi
 
DevOps - Operação contínua
DevOps - Operação contínuaDevOps - Operação contínua
DevOps - Operação contínua
 
ExtJS Jumpstart Parte 2
ExtJS Jumpstart Parte 2ExtJS Jumpstart Parte 2
ExtJS Jumpstart Parte 2
 
Palestra Faculdade Lourenço Filho
Palestra Faculdade Lourenço FilhoPalestra Faculdade Lourenço Filho
Palestra Faculdade Lourenço Filho
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de Software
 
Como eu aprendi que testar software é importante?
Como eu aprendi que testar software é importante?Como eu aprendi que testar software é importante?
Como eu aprendi que testar software é importante?
 
Formação 1 eja digital
Formação 1   eja digitalFormação 1   eja digital
Formação 1 eja digital
 

Mehr von Marlon Carvalho

Mehr von Marlon Carvalho (7)

RESTful API - GDG Tech Talk - Novembro de 2014
RESTful API - GDG Tech Talk - Novembro de 2014RESTful API - GDG Tech Talk - Novembro de 2014
RESTful API - GDG Tech Talk - Novembro de 2014
 
Nativo x Híbrido x WebApps - SEMCOMP UFBA 2012
Nativo x Híbrido x WebApps - SEMCOMP UFBA 2012Nativo x Híbrido x WebApps - SEMCOMP UFBA 2012
Nativo x Híbrido x WebApps - SEMCOMP UFBA 2012
 
Nativo vs Híbrido vs WebApps
Nativo vs Híbrido vs WebAppsNativo vs Híbrido vs WebApps
Nativo vs Híbrido vs WebApps
 
Unirb
UnirbUnirb
Unirb
 
Android
AndroidAndroid
Android
 
Coding dojo
Coding dojoCoding dojo
Coding dojo
 
Coding Dojo
Coding DojoCoding Dojo
Coding Dojo
 

Kürzlich hochgeladen

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 

Kürzlich hochgeladen (8)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 

Flisol 2012

  • 1. DESENVOLVENDO PARA ANDROID COM FERRAMENTAS LIVRES MARLON SILVA CARVALHO domingo, 29 de abril de 12
  • 2. marlon .silvacarvalho.net twitter.com/ marlonscarvalho marlon.carvalho @gmail.com domingo, 29 de abril de 12
  • 3. domingo, 29 de abril de 12
  • 4. domingo, 29 de abril de 12
  • 5. domingo, 29 de abril de 12
  • 6. o inevitável para os desenvolvendores... ...era surgir uma grande quantidade de ferramentas opensource domingo, 29 de abril de 12
  • 7. domingo, 29 de abril de 12
  • 8. vamos começar do começo... ...ao criar seu projeto. domingo, 29 de abril de 12
  • 10. lib-dep-1.1 lib-dep-1.2 lib-xml lib-json domingo, 29 de abril de 12
  • 11. domingo, 29 de abril de 12
  • 12. ou você pode usar o: e gerenciar seu projeto por ele! domingo, 29 de abril de 12
  • 13. por que usar? o processo de build é complexo? requer muitas regras? domingo, 29 de abril de 12
  • 14. compilar testar testes unitários, com BDD, com seilaoquê! empacotar empacotar com certificados diferentes deploy gerar um tags no repositório domingo, 29 de abril de 12
  • 15. por que usar? sua aplicação possui muitas dependências para bibliotecas externas? domingo, 29 de abril de 12
  • 16. por que usar? quer automatizar tarefas repetitivas no seu processo de build? domingo, 29 de abril de 12
  • 17. por que usar? você usa um servidor de integração contínua? domingo, 29 de abril de 12
  • 18. por que usar? sua aplicação está dividida em vários módulos? domingo, 29 de abril de 12
  • 19. então, foi feito para você! domingo, 29 de abril de 12
  • 20. http://roboguice.googlecode.com/ dependency injection events, logs, factories, fragments, services, resources domingo, 29 de abril de 12
  • 21. a simples equação A - O + = P domingo, 29 de abril de 12
  • 22. “Dependency injection is a software design pattern that allows a choice of component to be made at run-time rather than compile time.” domingo, 29 de abril de 12
  • 23. com DI eu não faço isso: MinhaInterface objeto = new UmaClasseQueImplementaInterface(); domingo, 29 de abril de 12
  • 24. com DI eu faço apenas isso: @Inject UmaInterface obj; domingo, 29 de abril de 12
  • 25. código repetitivo o modo “android nativo” de programar: class AndroidWay extends Activity {     TextView name;     ImageView thumbnail;     LocationManager loc;     Drawable icon;     String myName;     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         name      = (TextView) findViewById(R.id.name);         thumbnail = (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 );     } } domingo, 29 de abril de 12
  • 26. código não-repetitivo o modo “RoboGuice” de programar: 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 );     } } domingo, 29 de abril de 12
  • 27. @Inject domingo, 29 de abril de 12
  • 28. eventos pra cá, eventos pra lá o modo “RoboGuice” de programar: public class MyActivity extends RoboActivity {     @Inject protected Listeners listeners; } class Listeners {         public void doOnResume(@Observes OnResumeEvent e) {     }         public void doOnCreate(@Observes OnCreateEvent e) {     }     } domingo, 29 de abril de 12
  • 29. quem usa isso? será que presta mesmo? domingo, 29 de abril de 12
  • 30. por que usar? eliminar código repetitivo domingo, 29 de abril de 12
  • 31. por que usar? focar no negócio da aplicação domingo, 29 de abril de 12
  • 32. por que usar? ter os benefícios da injeção de dependência no desenvolvimento mobile domingo, 29 de abril de 12
  • 33. por que usar? o maldito context não precisa mais caminhar entre as diversas camadas da sua aplicação domingo, 29 de abril de 12
  • 34. enfim: código mais limpo, claro e focado no negócio da sua aplicação domingo, 29 de abril de 12
  • 35. http://roboletric.org/ testes unitários em qualquer jvm domingo, 29 de abril de 12
  • 36. o maldito emulador! domingo, 29 de abril de 12
  • 37. por que usar? testes rodando na própria IDE domingo, 29 de abril de 12
  • 38. por que usar? testes rodando em servidores de integração domingo, 29 de abril de 12
  • 39. @RunWith (RobolectricTestRunner.class) public class MyActivityTest { private Activity activity; private Button pressMeButton; private TextView results; @Before public void setUp() throws Exception { activity = new MyActivity(); activity.onCreate(null); pressMeButton = (Button) activity.findViewById(R.id.press_me_button); results = (TextView) activity.findViewById(R.id.results_text_view); } @Test public void shouldUpdateResultsWhenButtonIsClicked() throws Exception { pressMeButton.performClick(); String resultsText = results.getText().toString(); assertThat(resultsText, equalTo("Testing Android Rocks!")); } } domingo, 29 de abril de 12
  • 40. mas... um rápido parênteses... ( domingo, 29 de abril de 12
  • 41. por que você faz testes unitários em android? domingo, 29 de abril de 12
  • 42. regras de negócio em serviços domingo, 29 de abril de 12
  • 43. dados nas nuvens domingo, 29 de abril de 12
  • 44. ) domingo, 29 de abril de 12
  • 45. e a maldita persistência de dados? domingo, 29 de abril de 12
  • 46. faça um extends de SQLiteOpenHelper o modo android nativo de programar: class MeuHelper extends SQLiteOpenHelper { public void onCreate(SQLiteDatabase db) { } public void onUpgrade(SQLiteDatabase db, int old, int newV) { } } domingo, 29 de abril de 12
  • 47. MeuHelper helper = new MeuHelper(); SQLiteDatabase database = helper.getWritableDatabase(); Cursor cursor = database.rawQuery("select * from tabela"); domingo, 29 de abril de 12
  • 48. MeuHelper helper = new MeuHelper(); SQLiteDatabase database = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(“coluna1”, comment); database.insert(“tabela”, null, values); domingo, 29 de abril de 12
  • 49. MeuHelper helper = new MeuHelper(); SQLiteDatabase database = helper.getWritableDatabase(); database.delete(“tabela”, “_id” + " = " + id, null); domingo, 29 de abril de 12
  • 50. https://github.com/marloncarvalho/aliendroid-activerecord aliendroid-activerecord para diminuir a dor da persistência de dados domingo, 29 de abril de 12
  • 51. defina seu model public class Item extends Model { public String atributo1; public String atributo2; public String atributo3; } domingo, 29 de abril de 12
  • 52. Item item = Model.load(Item.class, 1L); item.insert(); List<Item> itens = Model.findAll(Item.class); item.delete(); item.update(); Model.where(...); domingo, 29 de abril de 12
  • 53. tabela criada automaticamente domingo, 29 de abril de 12
  • 54. colunas mapeadas para os atributos domingo, 29 de abril de 12
  • 55. por que usar? minimiza a necessidade de códigos SQL domingo, 29 de abril de 12
  • 56. por que usar? automatiza tarefas repetitivas domingo, 29 de abril de 12
  • 57. integração contínua será que você precisa de um? domingo, 29 de abril de 12
  • 58. por que usar? sua equipe é de média a grande? domingo, 29 de abril de 12
  • 59. por que usar? quer garantir que a cada commit seu projeto continua funcionando? domingo, 29 de abril de 12
  • 60. por que usar? você precisa de resposta instantânea para erros de integração? domingo, 29 de abril de 12
  • 61. use o jenkins com seu projeto android roda tanto com o roboletric como com o emulador domingo, 29 de abril de 12
  • 62. domingo, 29 de abril de 12
  • 63. tem como usar BDD no android? behavior driven development domingo, 29 de abril de 12
  • 64. https://github.com/calabash/calabash-android calabash-android domingo, 29 de abril de 12
  • 65. calabash-android Feature: Login feature Scenario: As a valid user I can log into my app Given I am a valid user And I enter my username And I enter my password And I press "Login" Then I see "Welcome to coolest app ever" domingo, 29 de abril de 12
  • 67. por que usar? ter os benefícios do BDD em seu projeto android domingo, 29 de abril de 12
  • 68. e quando dá pau na sua app? como saber quando isso aconteceu domingo, 29 de abril de 12
  • 69. Google Play eles lhe dão uma forcinha, mas... ...e se você quiser mais informações? e um relatório personalizado? domingo, 29 de abril de 12
  • 70. http://acra.googlecode.com/ Application Crash Report for Android domingo, 29 de abril de 12
  • 71. ACRA is a library enabling Android Application to automatically post their crash reports to a Google Docs form . It is targetted to android applications developers to help them get data from their applications when they crash or behave erroneously. domingo, 29 de abril de 12
  • 72. import org.acra.*; import org.acra.annotation.*; @ReportsCrashes(formKey = "dGVacG0ydVHnaNHjRjVTUTEtb3FPWGc6MQ") public class MyApplication extends Application {     @Override     public void onCreate() {         ACRA.init(this);         super.onCreate();     } } domingo, 29 de abril de 12
  • 73. domingo, 29 de abril de 12
  • 74. domingo, 29 de abril de 12
  • 75. por que usar? você não está satisfeito com as opções do Google Play domingo, 29 de abril de 12
  • 76. por que usar? você quer personalizar seu relatório domingo, 29 de abril de 12
  • 77. por que usar? você quer dar um feedback mais elegante para o usuário domingo, 29 de abril de 12
  • 78. por que usar? você quer mais detalhes sobre o erro domingo, 29 de abril de 12
  • 79. é só isso! domingo, 29 de abril de 12